atmega168 Zeitmessung

#2566772
Lesenswert?

Hi an alle.

Ich möchte in einer If Verzweigung einen Sekunden-Zähler aktivieren und 
im Else Zweig den Sekunden-Zähler beenden.

Es soll die vergangene Zeit zwischen Start und Stop gemessen werden.

Aber wie implementiere ich das mit meinem atmega168?
Ich schreibe in ANSI C.

Vielleicht kann mir da jemand weiterhelfen?


Es sollte in etwa so aussehen(Pseudocode):

  while(1) {
     if (Bedingung = Ja)
     {
        initialisiere_timer();
        start_timer();

        // do something
     }
     else
     {
        stop_timer();
     }

     // Ausgabe timer_wert
  }

Vielen Dank.
#2566778
Lesenswert?

Versuchs mal so:
1
uint8_t count=0, counter_started=0;
2

3
int main(void)
4
{
5
  initialisiere_timer();
6
  while(42) {
7
    if (count==1 && counter_started == 0)
8
    {
9
       start_timer();
10
       counter_started = 1; 
11
    }
12
    else if (count==0 && counter_started == 1)
13
    {
14
       stop_timer();
15
       counter_started = 0;
16
       // Ausgabe timer_wert
17
    }
18

19
    // Mach was Anderes, was z.B. count manipuliert
20
    // wenn count=1 dann wird gezählt  
21
    // wenn count=0 dann wird aufgehört und das Zählergebnis ausgegeben
22
  }
23
}
#2566906
Lesenswert?

Danke für deine Rückmeldung.

Die Funktionen start_timer stop_timer und initialisiere_timer sind bei 
nur noch leer und ohne Funktion. Wie muss ich diese befüllen damit sie 
das tun was sie tun sollen?

Und in welchem Wert oder Register versteckt sich dann der Zaehlwert?

Müssen irgendwo im Quellcode noch weitere Codezeilen hinzugefügt werden 
damit der Timer funktioniert? Aktivierung des entsprechendes Register.
Gast #2566967
Lesenswert?

El Nino schrieb:
> Wie muss ich diese befüllen damit sie das tun was sie tun sollen?

Mit initialisiere_timer sorgst du dafür, dass z.B. ein Timer als 
Zeitbasis läuft, mit start_timer liest du die Startzeit ab und merkst 
sie dir in einer Variable, mit stop_timer liest du die Stopzeit ab und 
berechnest die Differenz.
#2566994
Lesenswert?

Wolfgang schrieb:
> Mit initialisiere_timer sorgst du dafür, dass z.B. ein Timer als
> Zeitbasis läuft, mit start_timer liest du die Startzeit ab und merkst
> sie dir in einer Variable, mit stop_timer liest du die Stopzeit ab und
> berechnest die Differenz.

Was die Funktionen machen sollen ist mir schon klar. Ich weiss aber 
nicht wie ich diese Funktionen befüllen soll. Oder sind das 
vorgefertigte AVR Funktionen?

Der obrige Code wird wohl kaum funktionieren, wenn die Funktionen 
start_timer, stop_timer weder definiert und noch befüllt sind. Oder bin 
ich da auf dem Holzweg?
Gast #2567012
Lesenswert?

El Nino schrieb:
> Oder sind das vorgefertigte AVR Funktionen?

Nein, da mußt du für die Initialisierung nach Datenblatt die Vorteiler 
und Timerregister z.B. vom Timer1 passend zu deiner geforderten 
Zeitauflösung setzen, dafür sorgen, dass z.B. bei einem Timerüberlauf 
per Interrupt in einem Register die Überläufe gezählt werden und den 
Interrupt freigeben. In start_timer bzw. stop_timer liest du dann den 
Timerwert und die Variable mit dem Überlaufzähler aus. Für die 
Initialisierung findest du hier im Forum genug Beispiele, z.B. bei 
diversen Uhrenprojekten.

Eine genaue 1s-Zeitbasis hat z.B. Peter D. realisiert
Beitrag "Die genaue Sekunde / RTC"

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