Seite 2 von 2

Re: Probleme mit der RTC

BeitragVerfasst: Di 20. Nov 2012, 18:09
von SimonLothar
Syscall 11E2 ist ein Prizm-syscall. Nimm

SYSCALL 11E2 _RTC_GetDateTime

mal raus. Das geht nicht auf einem fx-9860.

In addin_main() muss Du noch die variable "time" deklarieren:

unsigned char time[8];

Die Aufrufe von RTC_SetDateTime und RTC_GetDateTime müssen so aussehen
RTC_SetDateTime( (unsigned char*)time );
RTC_GetDateTime( (unsigned char*)time );

arrays werden automatisch als Zeiger übergeben.

"&time" übersetzt der Compiler Zeiger auf Zeiger, das geht in diesem Fall schief.

Es wäre besser, den C++-Compiler zu nutzen. Der hat mehr Warnhinweise.

Re: Probleme mit der RTC

BeitragVerfasst: Mi 21. Nov 2012, 17:06
von Canta
ok, ich hab das jetzt so gemacht. Die Datei auch unter .cpp gespeichert.
Code: Alles auswählen
#include "fxlib.h"
#include "stdio.h"
#include "stdlib.h"

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)
{
unsigned char time[8];
unsigned int key;



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( (unsigned char*)time );

Sleep(600);
RTC_GetDateTime( (unsigned char*)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


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

jetzt kommt aber die Fehlermeldung:
Code: Alles auswählen
date\date.cpp(55) : C5020 (E) Identifier "RTC_SetDateTime" is undefined


wenn ich den gleichen code in .c speichere, bekomme ich andere Meldungen:
Code: Alles auswählen
date\date.c(26) : C2225 (E) Undeclared name "TRTC"
date\date.c(26) : C2500 (E) Illegal token ")"

Re: Probleme mit der RTC

BeitragVerfasst: Do 22. Nov 2012, 09:18
von SimonLothar
Du musst noch das Interface

Code: Alles auswählen
void RTC_SetDateTime( unsigned char time[8] );


einfügen.
Z. B. unterhalb der #includes.

Normalerweise kommen die Interfaces in *.h- oder *.hpp-Dateien (hier z. B. fx9860_syscall.h). Die werden dann mit include zu Beginn eingebunden.

Wenn Du C++ verwendest, musst Du den kompletten Quelltext normalerweise in

Code: Alles auswählen
extern "C" {

}

einfassen.

Re: Probleme mit der RTC

BeitragVerfasst: Do 22. Nov 2012, 17:16
von Canta
ok, danke. Wie sähe eine korrekte Abfrage aus? Bei mir zählen z.B. die Sekunden immer auf 90 bevor die Minute erhöht wird.
Code: Alles auswählen
RTC_GetDateTime( (unsigned char*)time );
PrintMini(5,30,(unsigned char*)"Sekunde:",MINI_OVER);
sprintf(buffer,"%d",time[6]);
PrintMini(50,30,(unsigned char*)buffer,MINI_OVER);
GetKey(&key);

Re: Probleme mit der RTC

BeitragVerfasst: Do 22. Nov 2012, 18:05
von SimonLothar
Die Rückgabe ist BCD-codiert. Du musst die Hex-Nibbles auswerten. 0x60 ist in diesem Fall 60. Wenn Du das als einfache Zahl interpretierst, dann gibt das 96.

Re: Probleme mit der RTC

BeitragVerfasst: Do 22. Nov 2012, 20:53
von Canta
geht das mit
Code: Alles auswählen
sprintf(buffer,"%x",time[6]);
PrintMini(50,30,(unsigned char*)buffer,MINI_OVER);
?

Re: Probleme mit der RTC

BeitragVerfasst: Fr 23. Nov 2012, 06:58
von SimonLothar
Canta hat geschrieben:geht das mit
Code: Alles auswählen
sprintf(buffer,"%x",time[6]);
PrintMini(50,30,(unsigned char*)buffer,MINI_OVER);
?

Im Prinzip ja. Ich benutze die printf-Funktionen selbst nicht, aber im Handbuch steht, dass im Ergebnisstring "0x" vorangestellt wird. Das muss Du dann berücksichtigen. Außerdem kann man gleich auch die Ausgabebreite 2 in das Format einbauen. Müsste dann "%2x" lauten.

Re: Probleme mit der RTC

BeitragVerfasst: Fr 23. Nov 2012, 13:33
von Canta
Jetzt habe ich glaube alles was ich wollte und es funktioniert. Vielen Dank! :D