Ich würde gern eine Warteschleife mit Timer realisieren. Die erst verlassen werden soll wenn das wenn ab einem Wert der Interrupt ausgelöst wird gesetzt wird. Jetzt habe ich mal einen Code geschrieben nur geht er nicht, vielleicht weiss jemand von euch, ob ich etwas übersehen habe. Achso ich habe einen Atmega16 und benutzte den Timer1: TIMSK |= (1<<OCIE1A); //Timer 1 Output Compare A Match Interrupt Enable OCR1A = 10799; // von 0 bis zu diesem Wert wird gezählt TCCR1B |= 1<<CS10 | 0<<CS11 | 1<<CS12 |(1<<WGM12); //CTC MODE & Teiler 8 sei (); //Globale Interrupts freigeben while (TOV1 != 0) //Solange Schleife durchlaufen, bis TOV1 gesetzt wird {} TOV1 = 1 // TOV1 wieder Rücksetzen
Funktioniert so nicht, weil du einen Interrupt frei gibst (TIMSK |= (1<<OCIE1A);) für den du keine ISR hast.
1 | #include <avr/io.h> |
2 | #include <avr/interrupt.h> |
3 | |
4 | volatile uint8_t timer1_done; |
5 | |
6 | ISR(TIMER1_COMPA_vect) |
7 | {
|
8 | timer1_done = 1; |
9 | }
|
10 | |
11 | int main(void) |
12 | {
|
13 | TCNT1 = 0; |
14 | OCR1A = 10799; |
15 | TIMSK |= (1<<OCIE1A); |
16 | // CTC Modus und Prescaler 8
|
17 | TCCR1B |= (1<<CS10) | (1<<CS12) |(1<<WGM12); |
18 | sei (); |
19 | |
20 | while ( !timer1_done ) {} |
21 | |
22 | TIMSK &= ~(1<<OCIE1A); |
23 | cli(); |
24 | |
25 | while (1) {} |
26 | }
|
TOV1 ist das Timer1 Overflow flag, was du willst ist warscheinlich OCF1A (Timer1 Compare A Match flag).
> volatile uint8_t timer1_done; > TCCR1B |= (1<<CS10) | (1<<CS12) |(1<<WGM12); Danke dir für den Lösungsvorschlag. Muss ich aber nicht auch den (0<<CS10) setzen oder kann ich den weglassen, da er eh schon im Standart 0 ist. volatile uint8_t timer1_done; ----> Hast du das Volatile nur zum Simulieren geschrieben, oder hat das noch eine andere Funktion?
> (0<<CS10) Ein Bit mit dem Wert 0 verODERn (|) ist sinnlos. C-Grundlagen und Artikel Bitmanipulation. > volatile C-Fortgeschrittene und Artikel Interrupt.
Vergiss den Interrupt. Du musst nur den Timercounter abfragen:
1 | TCCR1B |= (1<<CS10) | (1<<CS12) |(1<<WGM12); |
2 | |
3 | TCNT1 = 0; |
4 | while(TCNT1 < 10799); |
Aber warum (1<<CS10) | (1<<CS12)? Prescaler 8 wäre doch (0<<CS10) | (1<<CS11) | (0<<CS12).
> Aber warum (1<<CS10) | (1<<CS12)? > Prescaler 8 wäre doch (0<<CS10) | (1<<CS11) | (0<<CS12). Heiko, du hast doch mit dieser Bitkombination selbst angefangen Beitrag "Warteschleifer mit Timer?" >> TCCR1B |= 1<<CS10 | 0<<CS11 | 1<<CS12 | (1<<WGM12); >> //CTC MODE & Teiler 8 I.d.R. geht man davon aus, dass so triviales richtig aus dem Datenblatt abgeschrieben wurde und kontrolliert das nicht mehr bzw. konzentriert sich auf die anderen offensichtlicheren Probleme.
Serieller schrieb: >> Aber warum (1<<CS10) | (1<<CS12)? >> Prescaler 8 wäre doch (0<<CS10) | (1<<CS11) | (0<<CS12). > > Heiko, du hast doch mit dieser Bitkombination selbst angefangen > > Beitrag "Warteschleifer mit Timer?" >>> TCCR1B |= 1<<CS10 | 0<<CS11 | 1<<CS12 | (1<<WGM12); >>> //CTC MODE & Teiler 8 > > I.d.R. geht man davon aus, dass so triviales richtig aus dem Datenblatt > abgeschrieben wurde und kontrolliert das nicht mehr bzw. konzentriert > sich auf die anderen offensichtlicheren Probleme. Okay Sorry mein Fehler, habe das Anfangs Falsch geschrieben. Hatte grad nen Brett vorm Kopf ;o)
Also dein Vorschlag scheint zu funtionieren. Mit der Interruptmethode hatte ich nen paar Probleme bezüglich der Zeiten. Danke für den Typ.
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.