rtc interrupt funktioniert nicht - Freescale mc9s08JM60

OP #2658485
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;
}
#2658572
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.
OP #2658797
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren