Forum: Mikrocontroller und Digitale Elektronik atmega168 Zeitmessung


von Nino K. (lnino)


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.

von Oliver J. (skriptkiddy)


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
}

von Nino K. (lnino)


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.

von Wolfgang (Gast)


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.

von Nino K. (lnino)


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?

von Wolfgang (Gast)


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"

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.