Komm nicht weiter mit Zählvariable



  • Hallo,

    ich habe folgendes Problem:

    Ich möchte einen watchdog nutzen und habe dafür auch schon alle Register gesetzt. Die Zeiten des Watchdogs sind aber zu kurz. Einen richtigen Timer kann ich nicht schreiben, weil dafür zu wenig Speicherplatz übrig ist.
    Also habe ich mich für folgendes entschieden:
    Ich habe einen Interrupttimer, der alle 10ms aufgerufen wird. In diesem Interrupt-Timer nutze ich ein global definierte Variable, die ich herunterzählen lasse. wenn diese auf 0 ist wird der Watchdog aktiviert. Funktioniert bis dahin auch wunderbar. Jetzt habe ich in meinem Main-Programm eine Funktion, in der wiederrum eine While-Schleife aufgerufen wird um somit das Hängenbleiben des benutzen Displays zu simulieren. Nach dieser Funktion im Main-Programm setze ich die globale Zählvariable wieder hoch. FEHLER: Sobalt ich also diese While-Schleife habe setz er mir immer wieder die Variable hoch, obwohl er da niemals hinkommen darf und es eigentlich auch nicht macht.

    Weis da vielleicht jemand bescheid??? 😕

    Hier der Quellcode:

    MAIN:

    void main(void)
    {   
    
        Init();
    
        while(1)
    	{
    	BoxCtrInterfaceTask();  //in dieser Fkt. ist ne while-Schleife
      	iCounterInterrupt =250;
            }
    }
    
    void Init (void)
    {
    iCounterInterrupt =250;
    TimerA_Init();
    ...
    }
    

    Interruptimer:

    unsigned int iCounterInterrupt;

    @interrupt void tima_it(void)
    {
    	unsigned char v;
    
    	v=TACSR;
    	v=TACLR;
    
        iCounterInterrupt--;      Zählwarible herunterzählen
    
        if (!iCounterInterrupt)  //Abfrage wenn 0, dann Watchdog starten
        {
        WDGCR=0x8F;
        }
    
    }
    
    void TimerA_Init(void)      //Injtialisierung einzelner Register
    {  
    int i; 
     _asm("bset _TACSR,#2 ");
     TAOC2HR=0x23;
     TAOC2LR=0xFB;    
     TACR1=0x20; 
     TACR2=0x18;
     i=TACSR; 									// Reset TOF Flag
     i=TACLR; 
     _asm("bres _TACSR,#2 ");  
    
    }
    

    zugehörige Header zum Interruptimer:

    #ifndef _timer_h
    #define _timer_h 1
    ...
    @interrupt void tima_it(void);
    
    void TimerA_Init(void);
    
    #endif
    


  • void main(void)
    {

    Init();

    while(1)
    {
    BoxCtrInterfaceTask(); //in dieser Fkt. ist ne while-Schleife
    iCounterInterrupt =250; //wenn While-Schleife und diese Codezeile drin, dann stänig neu auf 250 gesetzt. kommt aber eigentlich garnicht dort hin
    }
    }

    void Init (void)
    {
    iCounterInterrupt =250;
    TimerA_Init();
    ...
    }



  • so ist es übersichtlicher

    void main(void)
    {
    
    Init();
    
    while(1)
    {
    BoxCtrInterfaceTask(); //in dieser Fkt. ist ne while-Schleife
    iCounterInterrupt =250; //wenn While-Schleife und diese Codezeile drin, dann stänig neu auf 250 gesetzt. kommt aber eigentlich garnicht dort hin
    }
    }
    
    void Init (void)
    {
    iCounterInterrupt =250;
    TimerA_Init();
    ...
    }
    


  • bei dieser Variante ist es genauso. BoxCtrInterfaceTask wird aufgerufen und das Programmläuft ab, bis es die while-Schleife dort erreicht. Dort drin setzt sich das display fest. Trotzalledem wird anscheind a auf 2 gesetzt und gehjt somit in die if-Schleife. wie soll das gehen, wenn er ständig in der while-Schleife in der Funktion BoxCtrInterfaceTask() ist?

    Ich weis nicht mehr Weiter!!!!

    void main(void)
    {   
    
        Init();
    
        while(1)
    	{
    	BoxCtrInterfaceTask();
      	a = 2;
    
    	if (a == 2)
        	{
        	iCounterInterrupt = 500;
    
        	}
    
    	}
    }
    


  • Wie sieht denn die zweite while-Schleife aus ?
    Und wozu die erste überhaupt ?



  • Wenn mit dem Aufruf von BoxCtrInterfaceTask ein Thread gestartet wird, wird die main-Funktion weiter abgearbeitet und nicht auf die Rückkehr von BoxCtrInterfaceTask gewartet.

    Setz mal im Debugger einen Abbruch auf "a = 2;"


Anmelden zum Antworten