-         

Ergebnis 1 bis 4 von 4

Thema: Zeit zwischen 2 INT0-Impulsen messen (Denkfehler?...)

  1. #1
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    35
    Beiträge
    1.987

    Zeit zwischen 2 INT0-Impulsen messen (Denkfehler?...)

    Anzeige

    Moin.

    Mal wieder ein Problem, deren Lösung an einem Denkfehler scheitert.

    Bei nem ATMega2560 läuft Timer1 zur Aufbereitung der Uhrzeit
    (Config Timer1 = Timer , Prescale = 1024:Timer1 = 49910).

    Nun soll (ohne einen weiteren Timer zu verwenden) die Zeit zwischen
    Impulsen gemessen werden, die an INT0 ankommen. Es geht nicht darum,
    dass die Zeit auf ms/µs exakt bekannt ist, sondern es muss lediglich eine Entscheidung getroffen werden, ob der Impuls länger als ca. 1 sec ausbleibt.

    Da bis jetzt schon einige Programmversuche eher für die Tonne waren, wollte ich jetzt mal die Denkweise hier prüfen lassen, ob ich überhaupt richtig vorgehe:


    Timer Läuft, zählt hoch, springt bei Überlauf (1-sec-Takt) zur ISRTimer1.
    INT0 reagiert auf Pegelwechsel und springt dabei zu ISRINT0.

    Bei jedem ISRTIMER1 wird u.a. ÜBERLAUF um 1 erhöht.

    Erfolgt INT0, wird folgendes gemacht:
    T1 = Timer1 (aktuellen zählstand zuweisen)
    T2 = T1 (Alten Zählerstand sichern)
    ÜBERLAUF = 0 (Anzahl Überläufe seit letztem INT0 löschen).

    Die Berechnung der Dauer müsste dann so erfolgen:
    x = ABS(T1-T2) + ÜBERLAUF * (65535-49910),
    also Differenz der beiden Timer + Überlauf-Blöcke.
    Die Zeit ist dann die Anzahl der Takte, also Zeit = x * 0,064 ms

    Stimmt die Annahme soweit?

    MfG
    S.C

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    14.12.2005
    Beiträge
    161
    hatte kürzlich das gleiche Problem:

    Zeit zwischen zwei INT und gleichzeitiges Zählen der INT mit Timer1

    Ich habe es so gelöst:

    Mit Messung =1 vor der Loop- Schleife beim allerersten INT den Timer auf 0 setzen. Messung wird auf 0 gesetzt. kommt der nächste INT wird der Timer ausgelesen, Wert gesichert und wieder auf 0 gesetzt usw.


    Der timer1 rennt und in der Irq von INT0 passiert das:
    Code:
    Messung = 1
    
    Do
    
    *** tu irgend was ***
    
    Loop
    '-------- IrQ ----------------
    
    Irq0:
    
    Portc.1 = 0
    
    Incr Impulse
    If Messung = 0 Then
          Impcount = Timer1
          Timer1 = 0
          Messung = 1
    
    Else
       Timer1 = 0
       Messung = 0
       End If
    
    
    Portc.1 = 1
    
    Return
    
    
    '-------------- Timer IRQ -------------
    
    Timerirq:
    
    Impcount = 0
    Return
    Evtl. hilft es Dir.

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    35
    Beiträge
    1.987
    Also 1:1 hab ichs nun nicht übernommen; aber es hat mir zumindest ne Idee gegeben; Machs einfach so, dass bei jedem INT0 in einer Variable die aktuellen Sekunden der Uhrzeit gespeichert werden. In jedem Timer-Überlauf wird die Differenz überprüft. Liegt dort die Differenz zwischen 2 Impulsen bei mehr als 1 Sekunde, wird ausgelöst. Reicht für meinen Fall vollkommen aus. Die Berechnungen konnt ich nicht mehr in den INT0 mitnehmen, da die Impulse etwas zu schnell kommen und das Programm sonst nicht mehr fertig wird mit rechnen.

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    14.12.2005
    Beiträge
    161
    na freut mich das es dir weitergeholfen hat....

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •