PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Timer soll zählen, tut er aber nicht. Hilfe!! :)



robo-man
19.07.2009, 15:54
Hallo!! Ich hab ein Problem. Ich möchte das der Timer beim überlauf die konstante [a] um einen Wert erhöht. Das Problem ist aber, dass die konstante immer auf 0 bleibt, weil bei mir PORTC=0x05; die ganze zeit als ausgang ist und sich nichts ändert. Hat vielleicht jemand eine Ahnung :?: , was falsch in meinem Programm ist? Weil ich denke das Programm hat keinen Fehler.
Danke im Vorraus!!!

#define F_CPU 3686400
#include <avr\io.h>
#include <avr/interrupt.h>
#include <util\delay.h>
uint8_t a;

ISR (TIMER1_OVF_vect)
{
a++;
}


int main (void)
{
TCCR1A=0x40;
TCCR1B=0x04;
TCNT1=0x0FFF;
DDRC=0x3F;
SREG=0x80;
TIMSK=0x04;
a=0;
sei();
while (true)
{
switch (a)
{
case 0: PORTC=0x05;
break;
case 1: PORTC=0x01;
break;
case 2: PORTC=0x02;
break;
case 3: PORTC=0x04;
break;
case 4: a=0;
break;
default: PORTC=0x07 ;
break;
}
}
return 0;
}

radbruch
19.07.2009, 16:02
volatile uint8_t a; // ???

Bitte Code-Tags verwenden. Das Timer-Setup habe ich nicht überprüft weil es mir zu mühselig ist die Bits (wie mode, prescal, enable, interrupt?) rauszufummeln. Hilfreich, auch für dich selbst, wäre jeweils ein kleiner Kommentar dazu:

TCCR1A=0x40; // hier wird dies und das eingestellt
TCCR1B=0x04; // noch mehr Einstellungen

Ob die ISR aufgerufen wird könntest du einfach so testen:

ISR (TIMER1_OVF_vect)
{
a++;
PORTC = 0x03;
}

Gruß

mic

robo-man
19.07.2009, 16:11
Cool, es funktioniert jetzt. Vielen Dank!!! :) Danke für die Tipps, die werde ich in zukunft befolgen.
Schönen Tag noch!! \:D/

Hubert.G
19.07.2009, 17:05
Von dem Abgesehen das mein Compiler das while(true) nicht mag, läuft dein Code. Einige Zeilen machen für mich allerdings keinen Sinn.
//TCCR1A=0x40;
TCCR1B=(1<<CS10);
//TCNT1=0x0FFF;
DDRC=0x3F;
//SREG=0x80;
TIMSK=(1<<TOIE1);
Hab das mal auskommentiert.
Variable in einer ISR deklariert man volatile
volatile uint8_t a;

Welchen Kontroller und Compiler du verwendest wäre in der Angabe auch nicht schlecht.

robo-man
19.07.2009, 21:08
Ich benutze den Atmega8. Den compiller WinAvr20081205. Mit dem SisyAvr Program.