Timer ATMega 16 Wartefunktion

Gast #2724307
Lesenswert?

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
(Firma: matzetronics) #2724320
Lesenswert?

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

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?
(Firma: matzetronics) #2724354
Lesenswert?

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

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.

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