C Timer0 funktioniert nicht

codeman

Neues Mitglied
12. März 2009
27
0
0
Sprachen
Hallo,
ich habe folgenden Quellcode geschrieben. Die ISR soll jede ms ausgeführt werden.


Code:
#include <avr/io.h> 
#include <avr/interrupt.h>

#define F_CPU 1000000l


volatile unsigned int counter;

int main(void)
{
	//Ein- und Ausgaenge definieren
	DDRA = 0xFF; // PORTA Ausgang
	DDRB = 0x00; // PORTB Eingang
	DDRC = 0xFF; // PORTA Ausgang
	DDRD = 0xFF; // PORTA Ausgang	
 
	// Timer 0 konfigurieren
	TCCR0 = (1<<CS01) | (1<<WGM01);	// Prescaler von 8 | CTC-Modus
  	OCR0 = 131;					//131..255 dann Overflow
	 
	TIMSK |= (1<<TOIE0);	// Compare Interrupt erlauben

  	sei(); 	// Global Interrupts aktivieren


	while(1)
	{
		if(counter == 2000)
	  	{
	  		PORTA = 0x00; // alle LEDs an
	  		PORTC = 0x00; // alle LEDs an
	  		PORTD = 0x00; // alle LEDs an
		}
		
		if (counter == 4000)
		{
			PORTA = 0xff; // alle LEDs an
			PORTC = 0xff; // alle LEDs an
			PORTD = 0xff; // alle LEDs an	
		}

		if(counter == 6000)
		{
			counter = 0;
		}
	}
	return 1;
}


ISR (TIMER0_OVF_vect)
{
  counter++;
}

Der Builder läuft ohne Fehler durch. Jedoch Toggeln die Ausgänge nicht hin und her. Finde meinen Fehler nicht, kann mir einer helfen?

Gruß und danke schon einmal!
 
Hallo Codeman,

einen TimerOverflow gibt es nicht, da der Timer bei <OCR0> auf 0 zurückgesetzt wird (Clear Timer on Comparematch - CTC).
Anstelle des TimerOverflow Interrupt TOIE0 musst du den ComapreMatch Interrupt OCIE0 verwenden. Der Compare Interurpt wird dann ausgelöst, wenn der Timer den Wert <OCR0> hat.

Der Timer läuft also immer von 0 bis <OCR0>, nicht von <OCR0> bis 0xFF. Den Inhalt von OCR0 musst du also nochmal neu berechnen, geht ja schnell, du kennst sicherlich unseren TimerCalculator, der kann dir dabei helfen.

Grüße,
Dirk
 
Super, danke! So funktionier es:

Code:
#include <avr/io.h> 
#include <avr/interrupt.h>

#define F_CPU 1000000l


volatile unsigned int counter;

int main(void)
{
	//Ein- und Ausgaenge definieren
	DDRA = 0xFF; // PORTA Ausgang
	DDRB = 0x00; // PORTB Eingang
	DDRC = 0xFF; // PORTA Ausgang
	DDRD = 0xFF; // PORTA Ausgang	
 
	// Timer 0 konfigurieren
	TCCR0 = (1<<CS01) | (1<<WGM01);	// Prescaler von 8 | CTC-Modus
  	OCR0 = 124;					//131..255 dann Overflow
	 
	TIMSK |= (1<<OCIE0);	// Compare Interrupt erlauben

  	sei(); 	// Global Interrupts aktivieren


	while(1)
	{
		if(counter == 2000)
	  	{
	  		PORTA = 0x00; // alle LEDs an
	  		PORTC = 0x00; // alle LEDs an
	  		PORTD = 0x00; // alle LEDs an
		}
		
		if (counter == 4000)
		{
			PORTA = 0xff; // alle LEDs an
			PORTC = 0xff; // alle LEDs an
			PORTD = 0xff; // alle LEDs an	
		}

		if(counter == 6000)
		{
			counter = 0;
		}
	}
	return 1;
}


ISR (TIMER0_COMP_vect)
{
  counter++;
}
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)