Forum: Mikrocontroller und Digitale Elektronik Warteschleifer mit Timer?


von heiko_h (Gast)


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

von Helfer (Gast)


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
}

von Peter (Gast)


Lesenswert?

Warteschleifen sind kontraproduktiv.

von Daniel G. (dxld)


Lesenswert?

TOV1 ist das Timer1 Overflow flag, was du willst ist warscheinlich OCF1A 
(Timer1 Compare A Match flag).

von heiko_h (Gast)


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?

von Helfer (Gast)


Lesenswert?

> (0<<CS10)

Ein Bit mit dem Wert 0 verODERn (|) ist sinnlos.
C-Grundlagen und Artikel Bitmanipulation.

> volatile

C-Fortgeschrittene und Artikel Interrupt.

von mitleser (Gast)


Lesenswert?

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);

von heiko_h (Gast)


Lesenswert?

Aber warum (1<<CS10) | (1<<CS12)?

Prescaler 8 wäre doch (0<<CS10) | (1<<CS11) | (0<<CS12).

von Serieller (Gast)


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.

von heiko_h (Gast)


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)

von heiko_h (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.