Forum: Mikrocontroller und Digitale Elektronik Problem bei Zeitmessung mit ATTiny45


von Peter P. (tremlzwolchen)


Angehängte Dateien:

Lesenswert?

Hallo!
Ich hab da ein Problem

Der ATTINY 45 soll ein 1 bis 2 ms langen LOW Pegel messen und mit einem
bestimmten Wert vergleichen (zb. 1,5ms).
Dauert der LOW Pegel länger als 1,5ms= grüne LED ein/ rote LED aus.
Ist der LOW Pegel kürzer als 1,5ms= grüne LED aus/ rote LED an.

Programmerkläerung:
Die Messung wird durch "INT0 External Interrupt" am PIN 7 gestartet.
Dabei wird ein Zählregister auf 0 gesetzt und der Timer 0 aktiviert.
Der Timer 0 löst alle 10µs einen "TIMER0 OVF Int." aus der das
Zählregister um 1 erhöht.
Die Hauptschleife überprüft den Eingang und springt zur "Auswert"
Rotiene wenn das Eingangssignal von LOW auf HI zurückwechselt.
In der Auswert rotiene wird der Timer 0 angehalten und das Zählregister
mit "BRANCH" ausgewertet.

Das asm. Programm (im Anhang) funktioniert nur zum Teil.
Ist das Eingangssignal LOW < 1,5ms ist alles OK.
Ist das Eingangssignal LOW > 1,5ms entsteht ein unregelmässiges
flakern!!!

Ich hab schon das gesammte Tutorial durchforstet und keinen hinweis auf
mein Problem gefunden.

Es währe schön wenn jemand mir einen Hinweis geben kann.
Danke im voraus!
Peter P.

von Corni (Gast)


Lesenswert?

Peter PLAINER schrieb:
> Ist das Eingangssignal LOW > 1,5ms entsteht ein unregelmässiges
> flakern!!!

Was bedeutet das?


Eine Sache ist mir aufgefallen (abgesehen davon, daß ich natürlich alles 
GAAANZ anders machen würde :-) ):
Wenn in TIMSK der Timeroverflow Interrupt disabled wird, läuft der 
Timer0 trotzdem noch weiter mit dem Effekt, daß auch das TOV0 Flag 
gesetzt wird. Sobald der Overflow Interrupt wieder freigegeben wird wie 
in Messstart, tritt sofort der Interrupt auf, unabhängig vom Wert in 
TCNT0. Das Flag kann man manuell vor Freigabe des Interrupt löschen.

von Peter P. (tremlzwolchen)


Lesenswert?

Corni schrieb:
>> Ist das Eingangssignal LOW > 1,5ms entsteht ein unregelmässiges
>> flakern!!!
>
> Was bedeutet das?

Danke für die Antwort!

Ich hab die 10µs Zeitbasis des Timer 0 auf 20ms vergrössert und mit dem 
MyAVR Experimentierboard ein dazupassendes Testsignal erzeugt um das 
Problem mit "freien Auge" zu beobachten.

Ergebniss:
Wenn der "Zählwert" grösser als der Vergleichswert ist wird manchmal nur 
bei der fallenden Flanke (messstart) das Unterprogramm "Aus" 
aufgerufen.Dadurch wird das Flackern erzeugt (bei 10µs Zählschritte).

Den Grund dafür ist mir nicht klar!

von Karl H. (kbuchegg)


Lesenswert?

Hmm
Du hast hier
1
zehnus:      in    r25,SREG    ; sicherung des Statusregisters
2
      push    r25
3
      inc    r18      ; erhöhe messregister um 1
keinerlei Sicherung drinn, dass dir r18 nicht größer als 255 werden 
darf. Wenn das (aus irgendeinem Grund) passieren sollte, dann sind deine 
Ergebnisse falsch.

von Peter P. (tremlzwolchen)


Lesenswert?

Karl Heinz schrieb:
> Hmm
> Du hast hierzehnus:      in    r25,SREG    ; sicherung des
> Statusregisters
>       push    r25
>       inc    r18      ; erhöhe messregister um 1
> keinerlei Sicherung drinn, dass dir r18 nicht größer als 255 werden
> darf. Wenn das (aus irgendeinem Grund) passieren sollte, dann sind deine
> Ergebnisse falsch.

Da das zu messende Signal max. 2ms lang ist sollte das r18 nur bis 200 
zählen.
Deshalb hab ich hier keine andere Lösung gewählt.

Eine Frage zu dem Timer0:
Wie kann ich den Int. bei Overflow deaktivieren und aktivieren ohne 
irgendwelche Probleme zu bekommen?

von Karl H. (kbuchegg)


Lesenswert?

Peter PLAINER schrieb:
> Karl Heinz schrieb:
>> Hmm
>> Du hast hierzehnus:      in    r25,SREG    ; sicherung des
>> Statusregisters
>>       push    r25
>>       inc    r18      ; erhöhe messregister um 1
>> keinerlei Sicherung drinn, dass dir r18 nicht größer als 255 werden
>> darf. Wenn das (aus irgendeinem Grund) passieren sollte, dann sind deine
>> Ergebnisse falsch.
>
> Da das zu messende Signal max. 2ms lang ist

Wir reden von Servo-Signalen?

> sollte das r18 nur bis 200
> zählen.
> Deshalb hab ich hier keine andere Lösung gewählt.

Da kann ich nur sagen: Hätti wari.

(Aussage Gerhard Berger, seines Zeichens ehemaliger Formel 1 Pilot: 
Hätti mehr Rennen gwunna, wari Wötmasta. (Übersetzung: Hätte ich mehr 
Rennen gewonnen, wäre ich auch Weltmeister geworden).

> Eine Frage zu dem Timer0:
> Wie kann ich den Int. bei Overflow deaktivieren und aktivieren ohne
> irgendwelche Probleme zu bekommen?

Du brauchst nur das Flag zu löschen, welches einen Overflow anzeigt. 
Aber das ist nicht dein Problem. Denn dadurch verfälscht sich deine 
Messung maximal um 10µs. Und das sollte nicht das beobachtete Symptom 
zeigen.

Mach eine Sicherung auf Overflow von r18 rein. Gerade bei Servosignalen 
gilt: grau lieber Freund ist alle Theorie.
Ob deine 4Mhz tatsächlich stimmen steht auf dem einen Blatt. Ob die 2ms 
beim Umlegen eines Schalters am Sender halten, steht auf dem anderen 
Blatt.

von Karl H. (kbuchegg)


Lesenswert?

Eines geht mir allerdings noch nicht ein.
Deine Beschreibung klingt in der Tat nach Servosignalen.
Aber warum Low-Pegel?

von Peter P. (tremlzwolchen)


Lesenswert?

Karl Heinz schrieb:

> Mach eine Sicherung auf Overflow von r18 rein. Gerade bei Servosignalen
> gilt: grau lieber Freund ist alle Theorie.

Danke für den Tip.
Werd mir eine Sicherung überlegen (zb. zwei Register mit Übertrag,...)

MfG
Peter P.

von Karl H. (kbuchegg)


Lesenswert?

Peter PLAINER schrieb:
> Karl Heinz schrieb:
>
>> Mach eine Sicherung auf Overflow von r18 rein. Gerade bei Servosignalen
>> gilt: grau lieber Freund ist alle Theorie.
>
> Danke für den Tip.
> Werd mir eine Sicherung überlegen (zb. zwei Register mit Übertrag,...)

den inc durch einen subi ersetzen (weil es keinen addi gibt). Danach das 
Carry Flag abfragen. Wenn du einen Überlauf von 255 auf 0 hast (Carry 
Flag), setzt du r18 wieder auf 255

(inc beeinflusst das Carry Flag nicht, daher der umweg über eine 
explizite Addition)

: Bearbeitet durch User
von Peter P. (tremlzwolchen)


Lesenswert?

Karl Heinz schrieb:
> Eines geht mir allerdings noch nicht ein.
> Deine Beschreibung klingt in der Tat nach Servosignalen.
> Aber warum Low-Pegel?

Ja es geht um Servosignale.
Zwischen dem ATTINY und dem RC- Empfänger hab ich einen Optokoppler 
gesetzt der das Signal 180° dreht.

von Karl H. (kbuchegg)


Lesenswert?

Peter PLAINER schrieb:
> Karl Heinz schrieb:
>> Eines geht mir allerdings noch nicht ein.
>> Deine Beschreibung klingt in der Tat nach Servosignalen.
>> Aber warum Low-Pegel?
>
> Ja es geht um Servosignale.
> Zwischen dem ATTINY und dem RC- Empfänger hab ich einen Optokoppler
> gesetzt der das Signal 180° dreht.

Ah. ok. Deshalb.
Ich dachte schon, du wärst am Summensignal drann.
(Oder eine alte Graupner Anlage :-)

von Karl H. (kbuchegg)


Lesenswert?

Hmm, wenn ich mirs so durch den Kopf gehen lasse, wird ein
1
zehnus:      in    r25,SREG    ; sicherung des Statusregisters
2
      push    r25
3
      cpi    r18, 255
4
      beq    no_inc
5
      inc    r18      ; erhöhe messregister um 1
6
no_inc:
7
      out    TCNT0,r17    ; aufwärtszähler wird mit ausgangswert (10us) geladen

es wohl auch tun.

Mal sehen, ob das das Problem löst.

: Bearbeitet durch User
von Peter P. (tremlzwolchen)


Lesenswert?

Hab deinen Vorschlag probiert doch leider besteht das Problem mit den 
flackernden Led´s weiterhin.

Der Fehler tritt auf beim Ext. Interrupt wenn die Messung beginnt.
Da wird manchmal das Unterprogramm "aus" aufgerufen ohne das zu diesem 
Zeitpunkt eine Auswertung von r18 passiert.
Am ende der Messung wird dann wieder Unterprogramm "ein" aktiviert 
(vorausgesetzt r18 >150).

Könnte es sein das wenn in der "mainloop" schleife zwischen dem Befehl 
"in" und "sbrc" der Ext. Int. ausgelöst wird das Problem entsteht?
Weil dann würde sofort nach "messstart" gleich die "auswert" beginnen.

Gäbe es da eine Lösung?

von Peter P. (tremlzwolchen)


Lesenswert?

Hab die Lösung gefunden!

> Könnte es sein das wenn in der "mainloop" schleife zwischen dem Befehl
> "in" und "sbrc" der Ext. Int. ausgelöst wird das Problem entsteht?
> Weil dann würde sofort nach "messstart" gleich die "auswert" beginnen.
>
In der Hauptschleife zwischen Pinabfrage und Sprungadresse den "Global 
Int." deaktivieren bzw. wieder aktivieren löst das Problem.

mainloop:   cli
            sbic   PINB,2
            rjmp   auswert
            sei
            rjmp   mainloop

Vielen danke für die Hilfe!
Peter P.

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.