PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : timer will nicht starten?



panzerkeks
11.05.2008, 20:33
Hallo zusammen,

Ich sitze schon seit gestern an diesem Problem rum...
Warum will der Timer nicht inkrementieren?
AVR Studio zeigt in der Simulation TCNT0 konstant 0x00 an...
Und auf meinem STK500 gehts natürlich auch nicht.

hier der komplette code:


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

volatile uint8_t timer = 0; // Speichert den aktuellen Zählerwert

ISR(TIMER0_OVF_vect)
{
timer++;
}

void initTimer(void)
{
// Initialisierung:
TIMSK |= (1<<TOIE0); // Interrupt aktivieren
TCCR0A |= (1 << CS00 ) | (1 << CS02); // Timer0 initialisierung, Vorteiler ist 1024
sei();
}

void initPorts(void)
{
DDRB = 0xff; //PortB als Ausgang
PORTB = 0xff; // alle LEDs aus
}

int main()
{
initPorts();
initTimer();

while (1)
{
PORTB = ~timer;
if(timer==255) timer=0;
}
return 0;
}



Ich hoffe Ihr könnt mir helfen...

linux_80
12.05.2008, 00:14
Hallo,

Was verwendest du für einen AVR, wegen der Register ?
Wie schnell wird der AVR getaktet, wegen Timertakt ?
Hast Du ausgerechnet wie lange es dauert bis der Timer das erstemal überläuft ?
Die Abfrage nach 255 kannst Du dir bei einer 8Bit Variaben sparen, denn die kann nicht grösser werden, ebenso das return.

Ceos
12.05.2008, 08:29
zunächst es ist irgendein atmega mit 16bit-timer, soweit lieg ich doch richtig

aber ich finde im mom echt nicht WELCHER das sein soll der timer0 als 16bit hat sonst kenn cih timer0 nur als 8bit und timer1 als 16bit

jedenfalls hast du rund alle 1minute einen überlauf bei 1MHz takt

16bit = ~56000
1MHz / 16bit = ~17,9
17,9 überschläge / 1024 prescaler = 0,0179 überschläge pro sekunde

schraub ma den prescaler runter

Gock
12.05.2008, 14:46
Es könnte ein Mega644 sein, der hat einen 8Bit Timer mit einem TCCR0A.
Jedenfalls wird Deine "Timer" Variable vermutlich nicht hochgezählt, weil Du die Klammern des if-Befehls vergessen hast.
Gruß

panzerkeks
12.05.2008, 16:13
Es ist ein AtTiny2313 mit 4 MHz
Timer0 ist ein 8-Bit timer
Den timertakt hab ich nicht ausgerechnet, ich wollte nur erstmal dass er überhaupt zählt, und nachdem er das ja nicht tut, wird das irrelevant sein denk ich...

wenn ich in einem unsigned char 255 +1 rechne, kommt dann 0 raus? Ich dachte immer, wenn nach einem If nur 1 Befehl steht, kann man die Klammern weglassen? (Sorry, bin kein C-Profi)

McJenso
12.05.2008, 16:39
Hallo,

uint8_t 255+1 wird zu 0, das ist richtig
Bei einem Befehl benötigt man keine Klamme hinter der If-Bedingung, ist Geschmackssache und richtig.
Schau im Datenblatt noch einmal nach zu welchem Register CS00 und CS02 gehören. :idea:

Gruß

Jens

panzerkeks
12.05.2008, 17:34
ahja wieder dazugelernt :)

CS00 CS01 und CS02 gehören zum Register TCCR0B... Aber ich dachte, nachdem TCCr0A und TCCR0A zum selben timer gehören wär das egal? im TCCR0A kann man auch den Prescaler nirgendwo einstellen...
TCCR0A => COM0A1 COM0A0 COM0B1 COM0B0 – – WGM01 WGM00
TCCR0B => FOC0A FOC0B – – WGM02 CS02 CS01 CS00

Edit: klappt übrigens auch nicht, wenn ich in initTimer() statt TCCR0A TCCR0B schreibe...

panzerkeks
12.05.2008, 17:38
WOW doch es klappt doch^^ Vielen Dank :D