Hallo, ich versuche gerade krampfhaft den 16 Bit Timer des Atmega8 zu programmieren, nur irgendwie ist der Wurm drin. #include <avr/io.h> #include <avr/interrupt.h> #include <avr/signal.h> unsigned char time_ist = 0; SIGNAL (SIG_OVERFLOW1) { time_ist++; } void timer (unsigned char time_soll) { unsigned char time_ist = 0; TCNT1 = 0; //Rücksetzen des Timers TCCR1B = _BV(CS11) | _BV(CS10); //Prescaler 64 TIMSK = _BV(TOIE1); //Timer Overflow Interrupt enable sei (); while (time_soll >= time_ist) {} } int main (void) { DDRB = 0xff; for (;;) { PORTB = 0xff; timer (1); PORTB = 0x00; timer (1); } } Eigentlich sollten die LEDs ca. im Sekundentakt blinken. 4MHz/64/2^16 liefert ungefähr eine Frequenz von einem Hertz. Wo liegt nun der Fehler? Thomas
> Wo liegt nun der Fehler? Im Nicht-Lesen der FAQ. FAQ#1: wann muß ich volatile benutzen? (Die FAQ steht als Teil der avr-libc Doku im doc/ Verzeichnis Deines WinAVR.)
Hallo Joerg, falls du "volatile unsigned char time_ist = 0;" meinst, das hatte ich vorher schon stehen. Ich hatte mich dabei an Peters Programm mit der genauen Sekunde gehalten. Dort wird die Variable ja auch so initialisiert. Ich habe dann nur rumexperimentiert, da mir nicht klar war, warum nix geht. Allerdings funktioniert es mit diesem Präfix auch nicht. Thomas
> falls du "volatile unsigned char time_ist = 0;" meinst, ...
volatile unsigned char time_ist;
genügt. Statische Variablen (und globale sind immer statisch) werden
automatisch auf 0 initialisiert.
Wenn's das aber nicht war, vielleicht beschreibst Du ja dann erstmal
Dein Fehlerbild?
void timer (unsigned char time_soll) { unsigned char time_ist = 0; Damit hast Du eine lokale Variable gleichen Namens erzeugt und dann ist die globale Variable in dieser Funktion nicht mehr zugreifbar. Sowas ist in C zwar erlaubt aber kein guter Programmirstil. Um sowas zu vermeiden, kann man globale Variablen mit einem großen Anfangsbuchstaben kennzeichnen: unsigned char Time_ist = 0; Peter
Ich würde die lobale Variable einfach weglassen, und die globale auf volatile setzen. Dann müsste es eigentlich klappen. mfG Harald
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.