Guten Abend, ich möchte eine Wartefunktion schreiben, die us genaue Auflösung bietet. Die delay - Funktion scheidet aus (kann keine Variablen verarbeiten). Ich habe an den Timer des ATMega 16 gedacht. Ich möchte quasi eine Funktion: void wartezeit(int us) { }; #include <avr/interrupt.h> #ifndef F_CPU #define F_CPU 3686400 #endif // Timer 0 konfigurieren TCCR0 = (1<<CS01); // Prescaler 8 // Overflow Interrupt erlauben TIMSK |= (1<<TOIE0); // Global Interrupts aktivieren sei(); Kann mir wer eventuell einen Link senden, wo ich so eine Funktion findet. Habe noch nie mit Timern gearbeitet. Danke
Diese kleine Funktion wartet, bis der Timer überläuft:
1 | void TimersWait(void) |
2 | {
|
3 | //Clear Timer0 Overflow event flag.
|
4 | TIFR = (1 << TOV0); |
5 | |
6 | //Wait for new event flag.
|
7 | while ( !(TIFR & (1 << TOV0)) ) |
8 | {
|
9 | }
|
10 | }
|
Erweiterbar wäre sie durch setzen von TCNT0, also z.B.
1 | void TimersWait(uint8_t zeit) |
2 | {
|
3 | TCNT0 = 256 - zeit; |
4 | //Clear Timer0 Overflow event flag.
|
5 | TIFR = (1 << TOV0); |
6 | |
7 | //Wait for new event flag.
|
8 | while ( !(TIFR & (1 << TOV0)) ) |
9 | {
|
10 | }
|
11 | }
|
Interrupt wird hier nicht benutzt.
Vielen Dank. Ich bekomme folgende Fehler: error: conflicting types for 'TimersWait' error: previous definition of 'TimersWait' was here Also kann ich die Funktion TimersWait(1000) im Hauptprogramm aufrufen, um 1 ms zu warten?
Einsteiger_Timer schrieb: > Also kann ich die Funktion TimersWait(1000) im Hauptprogramm aufrufen, > um 1 ms zu warten? Nö. Timer0 ist typisch ein 8-bit Timer und kann nur bis max. 255 zählen, also bei 1Mhz Takt 255 uSec. Wenn du längere Zeiten brauchst, solltest du dir einen 16-bit Timer vorknöpfen, dann gehen (bei 1 Mhz Timertakt) maximal 65535 uSec = 65 mSec.
Ich habe einen F_CPU 3686400 Quarz. Hat denn wer auch hierfür einen Link?
Einsteiger_Timer schrieb: > Ich habe einen F_CPU 3686400 Quarz. Hat denn wer auch hierfür einen > Link? Ein bischen rechnen wirst du ja wohl noch selber können. FAQ: Timer
Hi, schau dir doch mal das AVR-GCC-Tutorial -> Warteschleifen (delay.h) an, da findet man diesen "Trick", falls dein Problem wirklich nur darin besteht das man keine Variablen übergeben kann. void sleep ( uint8_t ms ) //wartezeit in ms übergeben { for(; ms > 0; ms--) _delay_ms(1); } Gruß Marcus
Marcus P. schrieb: > Hi, > schau dir doch mal das AVR-GCC-Tutorial -> Warteschleifen (delay.h) an, > da findet man diesen "Trick", falls dein Problem wirklich nur darin > besteht das man keine Variablen übergeben kann. Eher nicht. In einem hinreichend komplexen Programm (mehr als 10 Zeilen), ist ein variabler _delay eine ziemlich sichere Bank für ein 'der Programmansatz ist schon falsch' Von daher ist es nicht verkehrt, wenn er sich mit Timern vertraut macht. Die ganze Notation von "als nächstes wird eine Zeit abgewartet" (ausser für ganz kurze Zeiten) ist schon der falsche Weg.
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.