- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 4 von 4

Thema: Timer Problem

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    08.06.2009
    Beiträge
    18

    Timer Problem

    Hallo ich verzweifel hier gerade ein bisschen.

    Ich versuche den Timer0 des ATMEGA32 zu verwenden. allerdings habe ich so das Gefühl, dass nur einmal die ISR ausgelöst wird und danach nichts mehr passiert.

    ich währe euch sehr dankbar wenn ihr mir bei dem Problem helfen könntet.

    Code:
    #include <avr/io.h>
    #include <avr/interrupt.h>
    
    
    uint16_t t = 0;
    uint8_t c = 0x00;
    
    
     void servo_init()
    {
    	//Die Steuersignale der Servos liegen an Port D an!
    	//Port D als Ausgang definieren
    	DDRD = 0xff;
    	PORTD = 0x00;
    
    	//Timer initialisieren
    	TCCR0 = (1<<CS00);
    	TCNT0 = 96;
    	TIMSK|=(1<<TOIE0);
    	//Intrerrupts einschalten
    	sei();
    	PORTD = 0x01;
    }
    
    //ISR beim überlauf des Timers T0
    ISR(TIMER0_OVF_vect){
    	TCNT0 = 96;
    
    	PORTD = 0x03;
    
    	t++;
    	if(t>999){
    		PORTD = c;
    		t = 0;
    		c++;
    	}
    
    	sei();
    
    }
    
    
    int main( void )	//Funktion die automatisch ausgeführt wird
    {
    
    	//PORTD
    	DDRD = 0xff;
    	//PORTD = 0b11111111;
    
    	//PortC
    	DDRC  = 0x00;
    	PORTC = 0b11111111; // Pull ups -> High && reie 3 aktiviert
    
    	//PORTA
    	DDRA  = 0b11100000;
    	PORTA = 0b01011111;
    
    	servo_init();
    	sei();
    
    	while( 1 ) {                // Endlosschleife ' verhindert unkontrollierten zustand
    
    		
    
        }
    
        return 0; // Wird von int main()  verlangt
    }
    Das Problem ist, das die Variable t in der ISR nicht hochgezählt wird und somit auch die Variable nicht am PORTD ausgegeben wird und auch nicht incrementiert wird. Das PORTD = 0x03; welches in der ISR steht wird allerdings ausgeführt.

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    25.04.2010
    Beiträge
    1.249
    Wenn t>999 ist, wird PORTD = c gesetzt. Dann wird aber beim nächsten Interrupt PORTD wieder gleich 0x03 gesetzt.
    Das passiert wahrscheinlich so schnell das du das PORTD = c garnicht siehst.

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    42
    Beiträge
    2.009
    Ein sei(); gehört NICHT in eine ISR. Da sorgt der Compiler selbst dafür, dass nichts passiert. Da bringt man den Controller eher durcheinander, da der Interrupt dann z.b. schon angesprungen werden kann, während er noch läuft => Problem.

    Zwar kein Fehler aber unnötigt: Du initialisiert einiges doppelt; Z.b. sei() reicht 1x in der Main, ebenso DDRD.
    #ifndef MfG
    #define MfG

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    08.06.2009
    Beiträge
    18
    Danke für die schnelle hilfe. das port d bei jedem aufruf der ISR auf 0x03 gesetzt wird habe ich irgendwie total verpennt.

Berechtigungen

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

Solar Speicher und Akkus Tests