Forum: Mikrocontroller und Digitale Elektronik MSP430 Real Time Clock Interrupt


von RizzoRat (Gast)


Lesenswert?

Hallo zusammen

ich programmiere gerade mein ersten richtig großes Projekt und habe 
folgendes Problem.

Ich benutze den Msp430F1611 und programmiere in C mit IAR Workbench

Ich will die RTC (Real Time Clock) Library von TI fürs Timinung benutzen

(http://focus.ti.com/general/docs/techdocsabstract.tsp?abstractName=slaa290)

Ich hab die eingebunden und mich für die Variante mit der eignene ISR 
entschieden.


Mein Problem ist jetzt folgendes.

Ist mein MSP im Ruhezustand, zählt der Timer schön brav hoch und tut was 
er soll, zählen. Ich hab mir die Variablen in IAR im debug modus 
anzeigen lassen, das funzt wunderbar.

Werden jetzt allerdings Daten an meinen MSP übertragen lößt nach ende 
der DAtenübertragung die ISR des UART1 eine Fuktion names Sequenz aus. 
In dieser Funktion soll 10sekunden ein DAtensatz generiert werden und an 
den PC geschickt werden und nach einer Variablenzeit >>>10sekunden zum 
nächsten DAtensatz gesprungen werden.

Problem ist, sobald ich in die Funktion springe, hört der Timer auf zu 
zählen......und ich kapier ned wieso, ich gebe dazu nicht die anweisung:

So initialisiere ich den Timer, das scheint zu funktionieren:
1
void main( void )
2
{  
3
    WDTCTL = WDTPW + WDTHOLD;             // Stop WDT
4
5
    //andere initialisierung routinen
6
7
    setTime(0x12, 0, 0, 0);           // Timer intitialisieren
8
    CCR0 = 32768-1;
9
    TACTL = TASSEL_1+MC_1;
10
    CCTL0 |= CCIE;
11
12
13
    _EINT();                          // Enable interrupts

Die ISR für den Timer sieht so aus:
1
//Timer ISR
2
#pragma vector=TIMERA0_VECTOR
3
__interrupt void TIMER_A (void)
4
{
5
  incrementSeconds();
6
  Intervall_1 = Intervall_1 + 1; //benutze ich zum abfragen des 10sekunden interwalls
7
}



So ist der msp im Wartezustand funzt der timer tadellos, wird jetzt 
allerdings in eine Funktion gesprungen, die durch den UART Interrupt 
ausgelößt wird geht nix mehr....

1
void Run_Sequenz(void)
2
{
3
  
4
5
  Intervall_1 = 0;
6
  
7
    while(1)
8
    {
9
10
      if (Intervall_1 == 10)
11
      {
12
        //datensatz an UART senden und Intevall_1 wirder auf 0 setzen um wieder 10 sekunden zu warten
13
      }
14
      if(2. bedingung)
15
      {
16
        befehle;
17
      }   
18
    }
19
}


Was er macht ist das er meinen Intervall_1 zähler auf 0 zurücksetzt 
(weil die Daten ja nicht kommen, sobald ich den msp einschalte), danach 
geht aber nix mehr, weil der timer nicht mehr zählt.

Warum? Ich sitz hier seit 3h und schnall ned.

von Johnny (Gast)


Lesenswert?

Hängst Du vielleicht im UART Interrupt fest? Mal gucken, ob im IRQ das 
entsprechende Flag rückgesetzt wird nach der Abarbeitung...

von Stefan (Gast)


Lesenswert?

Wenn Du die Funktion "Run_Sequenz()" aus Deiner UART-ISR heraus 
ausrufst, dann ist GIE = 0! Der Timer zählt zwar weiter, aber Deine 
Timer-ISR kann nicht mehr aufgerufen werden!
In dem Fall besser in UART-ISR ein Flag setzen und aus'm Hauptprogramm 
"Run_Sequenz()" starten...

von RizzoRat (Gast)


Lesenswert?

Hm,

stimmt, wenn man logisch drüber nachdenkt macht das sinn.

Sprich ich lass im hauprogramm einfach ne schleife laufen, die den Flag 
überwacht......

Okey das probier ich morgen gleich mal aus, thx.

von RizzoRat (Gast)


Lesenswert?

Jau das war des Problems Lösung. Vielen Dank.

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.