Forum: Mikrocontroller und Digitale Elektronik rtc interrupt funktioniert nicht - Freescale mc9s08JM60


von stefan m. (milchshake)


Lesenswert?

hallo,
habe folgendes problem:
will den code im debug mode testen aber irgendwie wird die Interrupt 
Service Routine nie aufgerufen.
Wäre gut wenn jemand mal meinen code anschauen könnte :/

Danke im Vorraus

controller: mc9s08JM60


#include <hidef.h> /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */
#include "MCUinit.h"

#ifdef __cplusplus
extern "C"
#endif
void MCU_init(void); /* Device initialization function declaration */

Bool Tick = FALSE;

void main(void) {
  MCU_init();  /* call Device Initialization */

  EnableInterrupts;

  RTCMOD= 0x00;
  RTCSC = 0x1F | 0x80;


  for(;;){
    if (Tick == TRUE)
    {
    RTCMOD = 0x00;//Re-setting the counter value
    RTCSC = 0x1F; //Re-enabling the interrupt re-configuring the clock 
source
    Tick = FALSE;
    }
  }
}

__interrupt void RTC_ISR(void)
{
  RTCSC = RTCSC | 0x80;
  Tick = TRUE;
}

von Christian G. (christiang)


Lesenswert?

Moin,

(1) also eigentlich tut man zuerst alles initialisieren und dann erst 
die Interrupts freigeben.

(2) das zyklische ReInit der RTC in der Endlosschleife macht nichts 
besser sondern ist einfach nur schwachsinnig. Wenn du das Datenblatt 
liest, dann wirst du sehen, dass hier nichts erneut beschreiben werden 
muss.

(3) wenn du die Variable "Tick" im Interrupt setzt und in der 
Hauptschleife löscht und womöglich vielleicht auch noch auswerten 
willst, dann mit "volatille" deklarieren

(4) und daran wird es liegen, dass der Interrupt nicht aufgerufen wird: 
Beim Debuggen werden meistens die Interrupts deaktiviert (I-Flag wird 
vom Debugger gesetzt). Dies läßt sich irgendwo einstellen oder im 
vermute jetzt mal, dass du den Hiwave nimmst, dann lösche doch einfach 
das I-Flag im CCR.

von stefan m. (milchshake)


Lesenswert?

danke für die schnelle antwort..

volatile Bool Tick = FALSE;

void main(void) {
  MCU_init();  /* call Device Initialization */

  RTCMOD= 0x00;
  RTCSC = 0x17 | 0x80;

  EnableInterrupts;

  for(;;){
    if (Tick == TRUE)
    {
    RTCMOD = 0x00;//Re-setting the counter value
    //RTCSC = 0x1F; //Re-enabling the interrupt re-configuring the clock 
source
    Tick = FALSE;
    }
  }
}

__interrupt void RTC_ISR(void)
{
  RTCSC = RTCSC | 0x80;
  Tick = TRUE;
}

habe den code soweit geändert..
habe in codewarrior in der debug config die option gefunden dass 
interrupts disabled sind. komme jedoch immer nohc nicht in den interrupt

habe jetzt auch versucht in das linker file (.prm)
den vector zu definieren:
INTVECTS =  READ_WRITE    0xFFC4 TO 0xFFC5;

__interrup <vectornumber> void RTC_ISR
code:

__interrupt 29 void RTC_ISR(void)
{
  RTCSC = RTCSC | 0x80;
  Tick = TRUE;
}

sobald ich debug starte bekomme ich folgende fehlermeldung
 Faileed writing target adress ffc4.
Expected value: 0x1a7d4f00
 Actual value: 0xfff2900

von stefan m. (milchshake)


Lesenswert?

so wie es scheint funktionert die rtc nicht...

rtccnt bleibt immer auf 0

von stefan m. (milchshake)


Lesenswert?

hat sich erledigt, funktioniert jetzt. habe der simulation die rtc 
komponente hinzufügen müssen, ansonsten wird es anscheinend in 
codewarrier nicht simuliert.
danke für die hilfestellung

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.