Forum: Mikrocontroller und Digitale Elektronik Timer ATMega 16 Wartefunktion


von Einsteiger_Timer (Gast)


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

von Matthias S. (Firma: matzetronics) (mschoeldgen)


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.

von Einsteiger_Timer (Gast)


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?

von Einsteiger_Timer (Gast)


Lesenswert?

Sorry hab den Fehler

von Matthias S. (Firma: matzetronics) (mschoeldgen)


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.

von Einsteiger_Timer (Gast)


Lesenswert?

Ich habe einen F_CPU 3686400 Quarz. Hat denn wer auch hierfür einen 
Link?

von Karl H. (kbuchegg)


Lesenswert?

Einsteiger_Timer schrieb:
> Ich habe einen F_CPU 3686400 Quarz. Hat denn wer auch hierfür einen
> Link?


Ein bischen rechnen wirst du ja wohl noch selber können.
FAQ: Timer

von Marcus P. (marc2100)


Lesenswert?

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.

void sleep ( uint8_t ms ) //wartezeit in ms übergeben
{
    for(; ms > 0; ms--) _delay_ms(1);
}


Gruß
Marcus

von Karl H. (kbuchegg)


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.

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.