-         

Ergebnis 1 bis 6 von 6

Thema: Funktionsaufruf in Interruptroutine geht nicht

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    09.01.2005
    Alter
    34
    Beiträge
    76

    Funktionsaufruf in Interruptroutine geht nicht

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    Hallo Zusammen

    Ich habe da ein Problem:
    Ich möchte gerne alle 30 sekunden eine Funktion aufrufen.
    Das blöde ist, sobald die 30 sekunden erreicht sind bekommt mein ATmeg128
    ein Reset.
    Wenn ich die Funktionen jedoch normal im main() aufrufe funktionieren sie einwandfrei.

    Ich hoffe Ihr könnt mir helfen, hier mal der Code:
    Code:
    void init_Timer1(void){
    
    	TCCR1B|=(1<<WGM12)|(1<<CS12)|(1<<CS10);		//set timer to CTC mode and prescalor to 1024
    	OCR1BH=0x0F;									//set compare register B to 3907 = ~1second   
    	OCR1BL=0x43;
    	TIMSK|=(1<<OCIE1B);							//enable compare interrupt
    	TCNT1H=0x00;									//set the timer starting position to 0
    	TCNT1L=0x00;
    	
    	sei();										//enable Global interrupt
    }
    
    
    //***Compare match Interrupt Timer 1***
    ISR(TIMER1_COMPB_vect){
    	
    	countSeconds++;
    	lock=0;
    	
    	if(countSeconds==30){
    		send_String_to_Display("ZZ",DispLine_3);
    		
    		wdt_reset();						//reset Watchdog
    			
    		getAddress(6,deviceAddress);
    		tempTankT12=getTemperature(deviceAddress);
    		wdt_reset();						//reset Watchdog
    	countSeconds=0;
    	}
    
    TCNT1H=0x00;								//set the timer starting position to 0
    	TCNT1L=0x00;
    }
    countSeconds ist ein int volatile

    die zwei "Z" erscheinen dabei noch auf dem Display kurz danach wird der AVR wahrscheinlich vom Wachtdog zurück gesetzt, weil er wahrscheinlich in "getTemperature" stecken bleibt.

    Vielen Dank für Eure Hilfe

    Beni

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    Es würde dich genügen, in der ISR nur ein Merker zu setzen, daß 30s vorbei sind, und im Hauptprogramm die Arbeit machen? Wahrscheinlich dauert das alles viel zu lange...
    getTemp... loopt wahrscheinlich ewig in einer ADC-Schleife rum?

    BTW:

    OCR1B = 0xf43;
    TCNT1=0;

    Was soll das TCNT1 = 0 in der ISR?


    Hast du irgendwo Warteschleifen drin, deren Variable in einer ISR gezählt wird? Das kann nicht gehen...
    Disclaimer: none. Sue me.

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    09.01.2005
    Alter
    34
    Beiträge
    76
    Hallo SprinterSB
    Mit dem TCNT1=0 setze ich den counter wieder =0 damit er dann wieder auf 3907 = 1 sec zählen kann und den interrupt auslöst.

    oder verstehe ich da etwas falsch?

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    Du verwendest den Timer doch im CTC-Mode?.

    Wenn überhaupt, sollte das TCNT1=0 an Anfang stehen und nicht am Ende der ISR, weil das ungenauer ist (das Ausführen der Funktionen braucht ja Zeit).

    Die Uhrsache des Reset kannst du Übrigens im MCUSR (oder war's MCUCSR oder so) abfragen.
    Disclaimer: none. Sue me.

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    09.01.2005
    Alter
    34
    Beiträge
    76
    ja das TCNT1 habe ich mir genau aus diesen Gründen auch schon überlegt an den Anfang zu setzen.

    Ja ich verwende den Timer im CTC Mode, also ist das TCNT1=0 nicht nötig?

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    Jo, sollte überflüssig sein bzw. bringt eine Ungenauigkeit rein, die du sonst nicht hast. Wobei ich mir gerade überleg, was ein Tmier macht, wen OC1A und OC1B benutzt werden..., nimmt dann wahrscheinlich nur das Minimum weil er zum zweiten Wert nie (bzw nur 1 Mal) kommt.
    Disclaimer: none. Sue me.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •