Das Deutsche Casio-Taschenrechner Forum wurde zum 31.12.2013 geschlossen und kann weiterhin als Nachschlagewerk verwendet werden.
Wer mehr erfahren möchte: Ein sehr guter Beitrag von Elias

Probleme mit der RTC

Hilfe beim Programmieren mit dem fx-9860G SDK.

Probleme mit der RTC

Beitragvon Jimboom » Fr 12. Mär 2010, 19:54

Ich möchte in einem meiner Spiele die Zeit ausgeben, wie lange man es benutzt hat. Da es eine Speicher- und Ladefunktion gibt, muss die Zeit dabei mit abgespeichert werden. Ich wollte das mit Revolution FX 1.0 und der RTC machen. Ich kriegs aber nicht hin, die Uhr einzustellen. Ich müsste sie am Anfang auf 0 stellen, beim Speichern die Zeit mit angeben und beim Laden eben auch wieder Laden. Nur wenn ich versuche mittels RTCReset(); oder über RTCSetMinute(0, 0); die Uhr zurückzusetzen passiert einfach nichts.
Kann mir einer helfen?

MfG
Jimboom
Jimboom
 
Beiträge: 2
Registriert: So 31. Jan 2010, 21:03
Taschenrechner: fx 9860 GII SD
fx 9750G PLUS

Re: Probleme mit der RTC

Beitragvon SimonLothar » Sa 13. Mär 2010, 01:07

Zunächst braucht man etwas wie SYSCALLS.SRC in: viewtopic.php?p=21817#p21817
mit den SYSCALL-Deklarationen

Code: Alles auswählen
   SYSCALL 023E,   _RTC_SetDateTime
   SYSCALL 003B,   _RTC_GetTicks

Die zugehörigen Interfaces sind

Code: Alles auswählen
void RTC_SetDateTime( unsigned char*timestr );
unsigned int RTC_GetTicks();

RTC_GetTicks gibt die Zeit in 1/128 s zurück. Diese Funktion würde für Dein Problem ausreichen.
Ich habe aber manchmal bei neuen fx-9860 erlebt, dass eine uninitialisierte RTC überhaupt nicht läuft.
Also ist es immer besser, einmalig eine gültige Zeit mit RTC_SetDateTime zu setzen.

RTC_SetDateTime benötigt als Argument einen String der Form

timestr[0] und timestr[1]: jahr in BCD (z. B. 0x20 0x08)
timestr[2]: Monat in BCD (z. B. 0x03)
timestr[3]: Tag in BCD (z. B. 0x02)
timestr[4]: Stunde in BCD (z. B. 0x19)
timestr[5]: Minute in BCD (z. B. 0x47)
timestr[6]: Sekunde in BCD (z. B. 0x03)

würde die Uhr auf 2.3.2008 19:47:03 setzen
SimonLothar
 
Beiträge: 228
Registriert: Mi 27. Mai 2009, 10:51
Taschenrechner: fx-9860G, fx-9860G slim, fx-9860G SD, fx-9860GII SD, fx-9750GII, fx-7400GII, fx-CG20, fx-9860GII-2 SD, fx-9750GII-2, fx-7400GII-2, fx-CP330+, fx-CP400

Re: Probleme mit der RTC

Beitragvon Canta » Mi 7. Nov 2012, 18:05

ich hab das mal so probiert:
syscall:
Code: Alles auswählen
   .SECTION P,CODE,ALIGN=4

    .MACRO SYSCALL FUNO, SYSCALLNAME, TAIL=nop
   .export \SYSCALLNAME'
\SYSCALLNAME'
   mov.l #h'\FUNO, r0
   mov.l #H'80010070, r2
   jmp @r2
   \TAIL'
   .ENDM


   SYSCALL 003B,   _RTC_GetTicks
         SYSCALL 023E,   _RTC_SetDateTime
   .end



und so das Datum:
Code: Alles auswählen
unsigned char timestring[6];
timestring [0] =  (0x20);
timestring [1] =  (0x12);
timestring [2] = (0x11);
timestring [3] = (0x07);
timestring [4] = (0x17);
timestring [5] = (0x23);
timestring [6] = (0x22);
RTC_SetDateTime( &timestring );

sprintf(buffer,"%d",RTC_GetTicks());
locate(1,5);
Print((unsigned char*)buffer);
GetKey(&key);

als Wert bekomm ich jetzt 8013078 zurück.
Was mach ich falsch oder wie bekomme ich das Datum heraus?
Canta
 
Beiträge: 15
Registriert: Mo 3. Sep 2012, 12:52
Taschenrechner: fx-9860 g2

Re: Probleme mit der RTC

Beitragvon SimonLothar » Do 8. Nov 2012, 11:03

Canta hat geschrieben:als Wert bekomm ich jetzt 8013078 zurück.
Was mach ich falsch oder wie bekomme ich das Datum heraus?

Sieht so aus als hättest Du nichts falsch gemacht. RTC_GetTicks gibt die Anzahl der 1/128 s Ticks seit Mitternacht zurück. Das Datum kannst Du nur durch direktes Lesen der RTC-Register erhalten. Da hab ich bisher noch kein Syscall gefunden.
SimonLothar
 
Beiträge: 228
Registriert: Mi 27. Mai 2009, 10:51
Taschenrechner: fx-9860G, fx-9860G slim, fx-9860G SD, fx-9860GII SD, fx-9750GII, fx-7400GII, fx-CG20, fx-9860GII-2 SD, fx-9750GII-2, fx-7400GII-2, fx-CP330+, fx-CP400

Re: Probleme mit der RTC

Beitragvon Canta » Mo 12. Nov 2012, 19:19

erstmal danke für die antwort.
Bekomme ich mit dem syscall 0x11E2 _RTC_GetDateTime das Datum heraus oder wie soll ich die Register direkt lesen? Ich hab das nicht ganz verstanden :-/
Canta
 
Beiträge: 15
Registriert: Mo 3. Sep 2012, 12:52
Taschenrechner: fx-9860 g2

Re: Probleme mit der RTC

Beitragvon SimonLothar » Di 13. Nov 2012, 13:27

Canta hat geschrieben:erstmal danke für die antwort.
Bekomme ich mit dem syscall 0x11E2 _RTC_GetDateTime das Datum heraus oder wie soll ich die Register direkt lesen? Ich hab das nicht ganz verstanden :-/

11E2 ist ein Prizm-syscall. Der geht nicht auf einem fx-9860G/GII/GII-2.
Ich werde mal was zusammenstellen.
Vielleicht hilft bis dahin auch http://www.casiopeia.net/forum/viewtopi ... =20&t=1448.
SimonLothar
 
Beiträge: 228
Registriert: Mi 27. Mai 2009, 10:51
Taschenrechner: fx-9860G, fx-9860G slim, fx-9860G SD, fx-9860GII SD, fx-9750GII, fx-7400GII, fx-CG20, fx-9860GII-2 SD, fx-9750GII-2, fx-7400GII-2, fx-CP330+, fx-CP400

Re: Probleme mit der RTC

Beitragvon SimonLothar » Sa 17. Nov 2012, 16:26

So kann man die RTC auf fx-Rechnern lesen.

Code: Alles auswählen
//
struct TRTC {
              unsigned char     R128CNT;
              unsigned char     gap1;
              unsigned char     RSECCNT;
              unsigned char     gap2;
              unsigned char     RMINCNT;
              unsigned char     gap3;
              unsigned char     RHOURCNT;
              unsigned char     gap4;
              unsigned char     RWEEKCNT;
              unsigned char     gap5;
              unsigned char     RDAYCNT;
              unsigned char     gap6;
              unsigned char     RMONCNT;
              unsigned char     gap7;
              unsigned short    RYEARCNT;
};

//
int RTC_GetDateTime( unsigned char time[7] ){
volatile struct TRTC*pRTC;

   if ( ( OSVersionAsInt() & 0xFFFF0000 ) == OS202GII2 ) pRTC = (TRTC*)0xA413FEC0;
   else pRTC = (TRTC*)0xFFFFFEC0;
   
   time[6] = (*pRTC).RSECCNT;
   time[5] = (*pRTC).RMINCNT;
   time[4] = (*pRTC).RHOURCNT;
   time[3] = (*pRTC).RDAYCNT;
   time[2] = (*pRTC).RMONCNT;
   time[1] = (*pRTC).RYEARCNT & 0x00FF;
   time[0] = (*pRTC).RYEARCNT >> 8;

   return (*pRTC).R128CNT;
}
SimonLothar
 
Beiträge: 228
Registriert: Mi 27. Mai 2009, 10:51
Taschenrechner: fx-9860G, fx-9860G slim, fx-9860G SD, fx-9860GII SD, fx-9750GII, fx-7400GII, fx-CG20, fx-9860GII-2 SD, fx-9750GII-2, fx-7400GII-2, fx-CP330+, fx-CP400

Re: Probleme mit der RTC

Beitragvon Canta » So 18. Nov 2012, 10:34

wie oder wo verwende ich:
Code: Alles auswählen
int RTC_GetDateTime( unsigned char time[7] ){
volatile struct TRTC*pRTC;

   if ( ( OSVersionAsInt() & 0xFFFF0000 ) == OS202GII2 ) pRTC = (TRTC*)0xA413FEC0;
   else pRTC = (TRTC*)0xFFFFFEC0;
   
   time[6] = (*pRTC).RSECCNT;
   time[5] = (*pRTC).RMINCNT;
   time[4] = (*pRTC).RHOURCNT;
   time[3] = (*pRTC).RDAYCNT;
   time[2] = (*pRTC).RMONCNT;
   time[1] = (*pRTC).RYEARCNT & 0x00FF;
   time[0] = (*pRTC).RYEARCNT >> 8;

   return (*pRTC).R128CNT;
}

Ich habe es nicht geschafft, diesen Code ohne Fehlermeldung "ERROR: Process failed with return code: 1" "einzubauen".
Canta
 
Beiträge: 15
Registriert: Mo 3. Sep 2012, 12:52
Taschenrechner: fx-9860 g2

Re: Probleme mit der RTC

Beitragvon SimonLothar » So 18. Nov 2012, 10:58

Vielleicht fehlt Dir OSVersionAsInt() und OS202GII2. Versuch erst mal die reduzierte Form:
(ersetze 0xFFFFFEC0 durch 0xA413FEC0, wenn Du einen GII-2-Rechner hast!)

Code: Alles auswählen
void RTC_GetDateTime( unsigned char time[8] ){
volatile struct TRTC*pRTC;

   pRTC = (TRTC*)0xFFFFFEC0;
   
   time[0] = (*pRTC).RYEARCNT >> 8;
   time[1] = (*pRTC).RYEARCNT & 0x00FF;
   time[2] = (*pRTC).RMONCNT;
   time[3] = (*pRTC).RDAYCNT;
   time[4] = (*pRTC).RHOURCNT;
   time[5] = (*pRTC).RMINCNT;
   time[6] = (*pRTC).RSECCNT;
   time[7] = 0;
}


Ich habe jetzt auch den Rückgabetyp geändert, damit die Funktion kompatibel mit dem Prizm Syscall 0x11E2 ist.

Wenn das nicht hilft, musst Du mal den kompletten Sourcecode Deines Testprogramms posten.

EDIT: Interface korrigiert. void RTC_GetDateTime( unsigned char time[7] ) -> void RTC_GetDateTime( unsigned char time[8] )
SimonLothar
 
Beiträge: 228
Registriert: Mi 27. Mai 2009, 10:51
Taschenrechner: fx-9860G, fx-9860G slim, fx-9860G SD, fx-9860GII SD, fx-9750GII, fx-7400GII, fx-CG20, fx-9860GII-2 SD, fx-9750GII-2, fx-7400GII-2, fx-CP330+, fx-CP400

Re: Probleme mit der RTC

Beitragvon Canta » Di 20. Nov 2012, 14:50

Ich verstehs noch nicht ganz. Hier mein wahrscheinlich total falsches Testprogramm :D :
Code: Alles auswählen
#include "fxlib.h"
#include "stdio.h"

unsigned int key;
unsigned char time[8];
struct TRTC {
              unsigned char     R128CNT;
              unsigned char     gap1;
              unsigned char     RSECCNT;
              unsigned char     gap2;
              unsigned char     RMINCNT;
              unsigned char     gap3;
              unsigned char     RHOURCNT;
              unsigned char     gap4;
              unsigned char     RWEEKCNT;
              unsigned char     gap5;
              unsigned char     RDAYCNT;
              unsigned char     gap6;
              unsigned char     RMONCNT;
              unsigned char     gap7;
              unsigned short    RYEARCNT;
};

void RTC_GetDateTime( unsigned char time[8] ){
volatile struct TRTC*pRTC;

   pRTC = (TRTC*)0xFFFFFEC0;
   
   time[0] = (*pRTC).RYEARCNT >> 8;
   time[1] = (*pRTC).RYEARCNT & 0x00FF;
   time[2] = (*pRTC).RMONCNT;
   time[3] = (*pRTC).RDAYCNT;
   time[4] = (*pRTC).RHOURCNT;
   time[5] = (*pRTC).RMINCNT;
   time[6] = (*pRTC).RSECCNT;
   time[7] = 0;
}

int AddIn_main(int isAppli, unsigned short OptionNum)
{
srand( RTC_GetTicks() );   
Bdisp_AllClr_DDVRAM();

time[0] =  (0x20);
time[1] =  (0x12);
time[2] = (0x11);
time [3] = (0x07);
time[4] = (0x01);
time[5] = (0x01);
time[6] = (0x01);
time[7] = (0x01);
RTC_SetDateTime( &time );
Sleep(600);
RTC_GetDateTime( &time );


    while(1){
        GetKey(&key);
                 }
    return 1;
}


#pragma section _BR_Size
unsigned long BR_Size;
#pragma section

#pragma section _TOP

int InitializeSystem(int isAppli, unsigned short OptionNum)
{
    return INIT_ADDIN_APPLICATION(isAppli, OptionNum);
}

#pragma section

und syscalls:
Code: Alles auswählen
   .SECTION P,CODE,ALIGN=4

         .MACRO SYSCALL FUNO, SYSCALLNAME, TAIL=nop
   .export \SYSCALLNAME'
\SYSCALLNAME'
   mov.l #h'\FUNO, r0
   mov.l #H'80010070, r2
   jmp @r2
   \TAIL'
   .ENDM


   SYSCALL 003B,   _RTC_GetTicks
         SYSCALL 023E,   _RTC_SetDateTime
         SYSCALL 11E2    _RTC_GetDateTime


   .end

und dann noch die Fehlermeldungen:
Code: Alles auswählen
date\date.c(29) : C2225 (E) Undeclared name "TRTC"
date\date.c(29) : C2500 (E) Illegal token ")"
date\date.c(56) : C1016 (W) Argument mismatch
Canta
 
Beiträge: 15
Registriert: Mo 3. Sep 2012, 12:52
Taschenrechner: fx-9860 g2

Nächste

Zurück zu fx-9860G SDK (Alle fx-9860G Modelle)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste

cron