- 3D-Druck Einstieg und Tipps         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: Timer2 overflow Interrupt will nicht

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    09.11.2004
    Ort
    Wernigerode
    Alter
    44
    Beiträge
    51

    Timer2 overflow Interrupt will nicht

    Anzeige

    Praxistest und DIY Projekte
    Hi,

    irgendwie will bei mir Timer2 keinen Interrupt auslösen.

    Code:
    void timer0 (void){
    	TIMSK = _BV(TOIE2);	//overflow flag setzen--> ab jetzt kann overflow interrupt ausgelöst werden
    	TCNT2 = 0;//Rücksetzen des Timers
    	TCCR2 = _BV(CS21);//Prescaler 8 ~ 0,000032 s ~0,032ms
    }
    Ich weis nicht warum und wieso und weshalb.
    Der Timer1 läuft supi.

    Die Interruptmethode für Overflow-Interrupt 2 wird nicht ausgeführt:
    Code:
    SIGNAL (SIG_OVERFLOW2) {
        PORTB&=~(1<<PB7);//led an <--debug warum geht sie nicht an
    	count++;//counter inkrement
    	if(count==t2max){ //prüfe ob ziel erreicht
    	 if(PORTB & (1<<PB7)){
    	  PORTB&=~(1<<PB7);
    	 } 
    	 else{
    	  PORTB|=(1<<PB7);
    	 }
    	 //led wieder aus
    	 PORTB|=(1<<PB1);
    	 //reset
    	 count=0;
    	 TIMSK &= ~(1<<TOIE2); //timer auslösen deaktivieren	
    	}
    }
    Nicht verwirrt sein, an und aus ist vertauscht weil das STK500 die Ausgänge negiert auf die LED's bringt.
    MFG

    Bomb

  2. #2
    Gast
    sei (); ???

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    09.11.2004
    Ort
    Wernigerode
    Alter
    44
    Beiträge
    51
    Hab ich. Deshalb läuft der 16bit Timer und auch die UART Interrupts ohne Probleme.
    Hat mich jetzt völlig verwirrt. Auch das Umstellen auf Timer 0 hat nix gebracht. Kommt einfach nicht in die Routine. Es sollte auch nix da sein was den Timerint ständig blockiert. Es ist nur der 16 bit Timer am laufen. Der läuft nur mit ner recht kleinen Frequenz undohne große Aktionen (LED blinken)Die anderen Interrupts werden nicht erzeugt.

    edit:
    Was ich vergessen hab zu sagen:
    Der Timer wird nur zu bestimmten Ereignissen durch die timer0 Methode scharf gemacht. Die letzte Aktion im Timer ist das abschalten des Overflow Ints. Kann ich das überhaupt machen? Oder ist das die Wurzel allen übels?

    edit2: Muss ich evtl. nach dem 'Scharfschalten' des Overflow interrupts erneut sei() ausführen?
    MFG

    Bomb

  4. #4
    Gast
    Hallo

    Was sagt denn eine Simulation im AVR Studio ??

    Mit den Code Auszügen ist es schwer, da was zu sagen.

    MFG
    Dieter

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    09.11.2004
    Ort
    Wernigerode
    Alter
    44
    Beiträge
    51
    Guten Morgen,

    leider simuliert da nix. Ihc werd mich mal mit der Simulation beschäftigen. Irgendwie mag er c nicht. Ich hab aber gelesen, dass das AVR Studio seit version 4.08 C debugen kann. Bei mir aber nicht...
    MFG

    Bomb

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    09.11.2004
    Ort
    Wernigerode
    Alter
    44
    Beiträge
    51
    .text 1504 0
    .data 88 8388704
    .bss 31 8388792
    .noinit 0 8388823
    .eeprom 0 8454144
    .stab 2676 0
    .stabstr 2586 0
    Total 6885

    kann mir das mal einer übersetzen?
    es läuft grad kein timer interrupt mehr. hab das gefühl, das sich den armen kleinen(mega 16) schon zu voll hab
    MFG

    Bomb

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    09.11.2004
    Ort
    Wernigerode
    Alter
    44
    Beiträge
    51
    Hi,
    nochmal mein Problem mit schlankem code

    [code#include <avr/io.h>
    #include <progmem.h>
    #include <avr/signal.h>
    #include <avr/interrupt.h>
    //Arbeitstakt angeben
    #define SYSCLK 8000000UL
    //usart ansprechen

    volatile unsigned int count=0;
    volatile unsigned int count2=0;
    volatile unsigned int Stellweg=1;

    void timer (void){
    TIMSK = _BV(TOIE0); //overflow flag setzen--> ab jetzt kann overflow interrupt ausgelöst werden
    TCNT0 = 0; //Rücksetzen des Timers
    TCCR0 = _BV(CS01); //Prescaler 8
    }
    void timer1 (void){
    TIMSK = _BV(TOIE1); //overflow flag setzen--> ab jetzt kann overflow interrupt ausgelöst werden
    TCNT1 = 0; //Rücksetzen des Timers
    TCCR1B = _BV(CS00); //Prescaler 1
    }


    int main(void) {
    timer ();
    timer1();
    sei (); //interrupts ein
    DDRB = 0xff;//PortB = Ausgabe
    PORTB = 0xff;
    for (; {
    }
    return 0;
    }

    //lässt led blinken
    SIGNAL (SIG_OVERFLOW0) {
    count++;
    if (count==Stellweg){
    if(PORTB & (1<<PB0)){
    PORTB&=~(1<<PB0);
    }
    else{
    PORTB|=(1<<PB0);
    }
    count=0;
    }
    }
    SIGNAL (SIG_OVERFLOW1) {
    count2++;
    if (count2==31){
    if(PORTB & (1<<PB1)){
    PORTB&=~(1<<PB1);
    }
    else{
    PORTB|=(1<<PB1);
    }
    count2=0;
    }
    }[/code]

    hier laufen 2 Timer ein 16 und ein 8 bittiger.

    In o.g. Fall wird nur der Timer1, also der 16 bittige, abgearbeitet.
    Es scheint also nur ein Timer als Counter arbeiten zu können.
    Hat jemand mal nen Link wo ich erfahre, wie man das AVR Studio als C Debuger nutzt? Das auf mikrocontroller.net ist irgendwie recht alt.
    MFG

    Bomb

  8. #8
    Gast
    Hallo

    Böser Fehler hat sich da eingeschlichen.

    Code:
    void timer (void){
    	TIMSK = _BV(TOIE0); // Hier setzt du das Flag OK !!!!!!!!!!!!!!!!!!!!!!!!!!
    	TCNT0 = 0; //Rücksetzen des Timers
    	TCCR0 = _BV(CS01); //Prescaler 8
    }
    void timer1 (void){
    	TIMSK = _BV(TOIE1); //hier löschst du aber gleichzeitig das TOIE0 Flag, da du das Register überschreibst. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    	TCNT1 = 0; //Rücksetzen des Timers
    	TCCR1B = _BV(CS00); //Prescaler 1
    }
    Also besser so, da TIMSK ein Register ist.

    Code:
    void timer (void){
    	TIMSK |= _BV(TOIE0); //overflow flag setzen--> ab jetzt kann overflow interrupt ausgelöst werden
    	TCNT0 = 0; //Rücksetzen des Timers
    	TCCR0 = _BV(CS01); //Prescaler 8
    }
    void timer1 (void){
    	TIMSK |= _BV(TOIE1); //overflow flag setzen--> ab jetzt kann overflow interrupt ausgelöst werden
    	TCNT1 = 0; //Rücksetzen des Timers
    	TCCR1B = _BV(CS00); //Prescaler 1
    }
    Simulieren in AVR Studio ganz grob

    Neuen Ordner anlegen / C File schreiben und in den Ordner speichen / MFILE aufrufen / Einstellugen vornehmen in Menuezeile MAKEFILE / MAIN file name = Name des C Files / MCU Type = uC wählen / OUTPUT Format = ihex / DEBUG FORMAT = AVR ext coff .

    Dann unter FILE das Makefile in den Ordner speichern und Make All ausführen.

    Im AVR Studio OPEN/ den Ordner öffnen / C Filename mit der Endung *.cof öffnen / AVR Simulator wählen / uC wählen fertig.


    MFG
    Dieter

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    09.11.2004
    Ort
    Wernigerode
    Alter
    44
    Beiträge
    51
    DANKE! Mein Held!!!! <<--Will sagen es geht jetzt

    Edit: Es Simuliert!!! Schick. Schick.
    MFG

    Bomb

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    30.01.2006
    Ort
    Irgendwo im Nirgendwo
    Alter
    50
    Beiträge
    62
    Zwar sehr spät für diesen Beitrag, aber ich habe ja auch erst gerade danach gesucht:

    SIMULATION eines WinAVR-C-Projekts im AVR-Studio klappt ja supi!!! Bix Thx!

    Gruß, Bernd

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

12V Akku bauen