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.
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.
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!
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.
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?
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.
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.
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)
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.
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 :-)
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?
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.