www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Warteschleifer mit Timer?


Autor: heiko_h (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Helfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Funktioniert so nicht, weil du einen Interrupt frei gibst (TIMSK |= 
(1<<OCIE1A);) für den du keine ISR hast.
#include <avr/io.h>
#include <avr/interrupt.h>

volatile uint8_t timer1_done;

ISR(TIMER1_COMPA_vect)
{
  timer1_done = 1;
}

int main(void)
{
  TCNT1 = 0;
  OCR1A = 10799;
  TIMSK |= (1<<OCIE1A);
  // CTC Modus und Prescaler 8
  TCCR1B |= (1<<CS10) | (1<<CS12) |(1<<WGM12);  
  sei ();

  while ( !timer1_done ) {}

  TIMSK &= ~(1<<OCIE1A);
  cli();

  while (1) {}
}

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warteschleifen sind kontraproduktiv.

Autor: Daniel Gröber (dxld)
Datum:

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

Autor: heiko_h (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Helfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> (0<<CS10)

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

> volatile

C-Fortgeschrittene und Artikel Interrupt.

Autor: mitleser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vergiss den Interrupt.
Du musst nur den Timercounter abfragen:
TCCR1B |= (1<<CS10) | (1<<CS12) |(1<<WGM12);

TCNT1 = 0;
while(TCNT1 < 10799);

Autor: heiko_h (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber warum (1<<CS10) | (1<<CS12)?

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

Autor: Serieller (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: heiko_h (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: heiko_h (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also dein Vorschlag scheint zu funtionieren. Mit der Interruptmethode 
hatte ich nen paar Probleme bezüglich der Zeiten. Danke für den Typ.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.