Warteschleifer mit Timer?

Gast #2095039
Lesenswert?

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
Gast #2095064
Lesenswert?

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
}
Gast #2095079
Lesenswert?

> 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?
Gast #2095726
Lesenswert?

> 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.
Gast #2095737
Lesenswert?

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)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren