www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Timer funktioniert nicht


Autor: RevolT3c (Gast)
Datum:
Angehängte Dateien:
  • Code.s (2,69 KB, 102 Downloads)

Bewertung
0 lesenswert
nicht lesenswert
Hi @ all,

ich möchte über einen Taster einen Ausgang steuern jedoch zeitverzögert.

Ich drücke die Taste und der Ausgang schaltet zeitverzögert. Der Ausgang 
ist solange geschaltet bis ich den Taster wieder loslasse.
Entprellen spielt momentan noch keine Rolle.

Leider funktioniert es noch nicht und ich weiss nicht an was es liegt.
Beim Drücken der Taste passiert nichts, Ausgang schaltet nicht.


Programm im Anhang


Gruss Ralph

Autor: RevolT3c (Gast)
Datum:
Angehängte Dateien:
  • Code.s (2,68 KB, 143 Downloads)

Bewertung
0 lesenswert
nicht lesenswert
Edit:// hier aktuelle Version

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ganze Program ist so wie es ist, ziemlicher Müll.
Du übernimmst dich momentan, indem du nicht zielgerichtet mit einfachen 
Dingen anfängst und dich zu schwierigeren Dingen systematisch 
durcharbeitest.

Konzepte, die du anscheinend nicht verstanden hast
* Unterprogramme
* Interrupt Service Handler
* wie man mit Timern grundsätzlich arbeitet
* Das Konzept einer Hauptschleife

> Beim Drücken der Taste passiert nichts, Ausgang schaltet nicht.

Kannst du einen Ausgang abhängig vom einem Taster ohne irgendewelchen 
sonstigen Schnickschnack schalten? Ohne Timer, ohne sonst irgend etwas. 
Einfach nur: Taster gedrückt -> Ausgang geschaltet; Taster nicht 
gedrückt -> Ausgang nicht geschaltet.

Autor: RevolT3c (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja das hab ich schon versucht das geht.

Wie arbeitet man denn grundsätzlich mit einem Timer?
Das Beispiel im Tutorial ist doch auch ziemlich einfach gehalten und 
nach dem hab ich es versucht aufzubauen.

Interner Takt 1Mhz
Vorteiler 1024
macht 3,8 Overflows / Sekunde

Wenn man dann noch ein Register entsprechend hochtzählt dann komme ich 
ja auf meine paar Sekunden Verzögerungszeit. (noch nicht im Code 
enthalten)

Gruss Ralph

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Wie arbeitet man denn grundsätzlich mit einem Timer?

Das ist nicht dein primäres Problem.

Z.B. Interrupt: Du löst einen Interrupt aus und springst von dort zurück 
ins Hauptprogramm. *Das geht nicht.* Der Rücksprung aus einer ISR 
erfolgt grundsätzlich mit RETI. Und zwar an die Stelle, an der dein 
Programm unterbrochen wurde. Beim Sprung in eine Interruptroutine wird 
nämlich die Rückkehradresse auf dem Stack gespeichert und mit 'reti' 
wieder zurückgeholt. Ein 'rjmp' macht das nicht, und du produzierst 
unweigerlich einen Stacküberlauf, der dein Programm ins Nirvana schickt.
In der ISR muss das SREG und die veränderten Register, soweit nicht 
gewollt, mit 'push' gesichert und mit 'pop' restauriert werden.

MfG Spess

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
spess53 schrieb:
> Hi
>
>>Wie arbeitet man denn grundsätzlich mit einem Timer?
>
> Das ist nicht dein primäres Problem.
>
> Z.B. Interrupt: Du löst einen Interrupt aus und springst von dort zurück
> ins Hauptprogramm.

Wenns nur das wäre.
Da wird ge-callt und ge-rjmp-t, auf Teufel komm raus. Quer durch die 
Gegend.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Wenns nur das wäre.
>Da wird ge-callt und ge-rjmp-t, auf Teufel komm raus. Quer durch die
>Gegend.

Ich weiss. Habe nur keine Lust einen Roman zu verfassen.

MfG Spess

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was soll denn das sein?
begin:
  wdr
  rjmp  main  ; 1    POWER ON RESET

Was sucht das wdr da? Damit sind deine Interrupt-Vektoren alle um eins 
verschoben.
Ansonsten ist, wie Karl Heinz schon schreibt, die ganze Struktur vom 
Programm so nix, bzw. gar nicht wirklich vorhanden. Du springst kreuz 
und quer in der Gegend rum, und rennst aus deinen Funktionen am Ende 
einfach raus in den dahinterliegenden Code. Und dann wartest du in der 
ISR noch in einer Schleife auf den Taster.

Autor: RevolT3c (Gast)
Datum:
Angehängte Dateien:
  • Code.s (2,89 KB, 122 Downloads)

Bewertung
0 lesenswert
nicht lesenswert
Auf die Gefahr hin mich hier unbeliebt zu machen hier der nächste 
Versuch.

Funktionieren tut es jetzt schon. Aber formlich bestimmt nicht das 
Wahre.

Bin im ISR direkt auf Ausgang gesprungen. Darf man das in dem Fall oder 
sollte man das anders lösen?

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Funktionieren tut es jetzt schon. Aber formlich bestimmt nicht das
>Wahre.

Was funktioniert? Früher oder später, aber eher früher, sitzt dein 
Programm bei:

loop:  rjmp  loop

fest. Und das wars.

Eine 'mainloop' sollte so aussehen:

mainloop:    .....
             .....
             rjmp mainloop

MfG Spess

Autor: RevolT3c (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mhh ich hab Taster gedrückt nach ca 5sek wird Ausgang gsetzt.
Lass ich Taster los ist Ausgang nichtmehr gesetzt.
Hab das ganze 5x wiederholt ging ohne Probleme.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Auf die Gefahr hin mich hier unbeliebt zu machen hier der nächste
> Versuch.

Keine Sorge.

> Funktionieren tut es jetzt schon. Aber formlich bestimmt nicht das
> Wahre.

Immerhin ist es jetzt strukturmäßig schon deutlich besser. Du wartest 
allerdings immer noch in der ISR. Deine mainloop ist eigentlich auch 
keine loop, denn sie wird nur einmal ausgeführt.

Übrigens: das cli und sei in der ISR kannst du dir sparen. Das macht der 
Prozessor schon selbst für dich.

> Bin im ISR direkt auf Ausgang gesprungen. Darf man das in dem Fall oder
> sollte man das anders lösen?

Das ist schon ok. Dieses Label gehört von der Ausführungslogik gesehen 
zur ISR. Du mußt nur darauf achten, daß die ISR, wenn sie fertig ist, 
ein reti ausführt, und das ist bei dir jetzt der Fall.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Mhh ich hab Taster gedrückt nach ca 5sek wird Ausgang gsetzt.
>Lass ich Taster los ist Ausgang nichtmehr gesetzt.
>Hab das ganze 5x wiederholt ging ohne Probleme.
AVR-Studio-Simulator und ich sind der gleichen Meinung. Erkläre mal, wie 
der Controller aus der Schleife wieder herauskommen soll.

Oder ist das nicht dein aktuelles Programm?

MfG Spess

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Erkläre mal, wie der Controller aus der Schleife wieder herauskommen
> soll.

Bei der Programmstruktur muß er das gar nicht, weil alles in der ISR 
abgehandelt wird.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
RevolT3c schrieb:

> Hab das ganze 5x wiederholt ging ohne Probleme.

Ohne zwischendurch den Reset Taster zu benutzen?
Erstaunlich!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rolf Magnus schrieb:
>> Erkläre mal, wie der Controller aus der Schleife wieder herauskommen
>> soll.
>
> Bei der Programmstruktur muß er das gar nicht, weil alles in der ISR
> abgehandelt wird.

Bis auf das Niederdrücken des Tasters.
So wie ich das sehe, läuft das Programm nach dem ersten Tastendruck so 
weiter:

Alle 40 Timeroverflows wird
  * der Port auf 1 gesetzt
  * darauf gewartet, dass der Taster nicht gedrückt ist
  * der Prt wieder auf 0 gesetzt

Unter der Annahme, dass die 40 Overflows in etwa 5 Sekunden sind, müsste 
man daher am Oszi bei nicht gedrückten Taster (nach dem ersten 
Tastendruck) sehen:
  alle 5 Sekunden gibt es einen kurzen Spike am Port B

Beim ersten mal Tastendrücken wird die Verzögerungszeit sogar 
einigermassen stimmen. Aber bei den weiteren Tastendrücken ist es 
Zufall, ob die Verzögerungszeit eingehalten wird oder nicht. 
Hauptsächlich deshalb, weil die ISR ja weiter brav bis 40 zählt und ihr 
das völlig egal ist, ob der Taster gedrückt wurde oder nicht.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Bei der Programmstruktur muß er das gar nicht, weil alles in der ISR
>abgehandelt wird.

Dort wartet es nur auf das Loslassen der Taste. Und danach läuft das 
Programm in die loop-Schleife.

MfG Spess

Autor: RevolT3c (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erstmal danke. Es klingt aufjedenfall plausibel. Das heisst ich muss 
wenn ich bei "Ausgang" bin den Interrupt deaktivieren und deaktiviert 
lassen und am Ende bei Warten wieder hoch zum Mainloop wo der Taster 
wieder eingelesen wird?

Dann hab ich aber zum Schluss kein reti durchgeführt. Muss ich nach dem 
"Ausgang" das TOIE0 Bit im TIMSK Register wieder auf 0 setzen?


Gruss Ralph

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.