atmega168 Zeitmessung

OP #2566772
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.
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
}
OP
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
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.
OP
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
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

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.