Forum: Mikrocontroller und Digitale Elektronik Uhreinstellung per Taster


von Maximilian P. (mad_max)


Angehängte Dateien:

Lesenswert?

Guten Abend allerseits,
ich bin neu hier im Forum (und auch ein Anfänger in Assembler), falls es 
also bereits einen thread geben sollte, der genau mein Problem 
behandelt, bitte ich um schnellstmögliche Umleitung ;)

Nun zu meinem Problem:
Ich möchte in Assembler eine "Binäruhr" schreiben, die auf einem 
Steckbrett auf 4 + 6 LEDs jeweils "binär" ausgegeben werden soll. Die 
Uhr an sich funktioniert (ich habe einen CTC-Timer verwendet + einen 
externen Quarzoszillator mit 4,000 MHz). Allerdings wäre es natürlich 
von Vorteil, wenn man diese Uhr auch einstellen könnte.
An der Verwirklichung dieses features hänge ich jetzt schon seit Tagen. 
Anfangs hatte ich mir in den Kopf gesetzt, es sollte über externe 
Interrupts an INT0 und INT1 laufen, aber das war ein völliges Chaos 
(Teile davon sind noch auskommentiert in meinem Code zu sehen). Heute 
habe ich versucht, das Ganze über eine normale Schleife zu machen, die 
einfach in regelmäßigen Abständen den Zustand an einem Tasterpin 
überprüft und dann bei einer Veränderung am Pin die gewünschte Aktion 
(in diesem Fall die Minute erhöhen), durchführt.

Wenn mir jemand einen Tipp geben könnte, ob ich es lieber mit Interrupts 
oder der Schleife probieren sollte, wäre ich sehr dankbar!

Zu meinem Code:
1. Die Markos sind nicht zu beachten, sie galten nur als Test für den 
Interrupt (da habe ich wahrscheinlich schon den ersten großen Fehler 
drin, warum er nicht funktioniert hat), deswegen habe ich den Code auch 
etwas verändert, um zu sehen, ob das Makro funktioniert

2. StundeTaste ist das Beispiel, wie ich es mit einem Interrupt versucht 
habe und MinuteTaste eines für den Pin-Auslesen. (Pin auslesen war sehr 
unprofessionell, das ist mir bewusst, wer mir da weiterhelfen kann, dem 
wäre ich wie gesagt sehr dankbar)

Wie gesagt, ich bin ein Anfänger, möchte aber gerne Assembler besser 
können, ich bin also für konstruktive Kritik gern zu haben ;)

Außerdem ist das Einstellen meiner Uhr die letzte große Hürde für mein 
erstes sinnvolles Projekt, an dem ich jetzt doch schon ein bisschen 
länger arbeite, und damit reizt es mich umso mehr, dass ich das zum 
Laufen bekomme ;)

Mein verwendeter Controller ist der ATmega8.

Lieben Gruß, Mad Max

: Bearbeitet durch User
von Jürgen S. (jurs)


Lesenswert?

Maximilian Prakesch schrieb:
> Wie gesagt, ich bin ein Anfänger, möchte aber gerne Assembler besser
> können, ich bin also für konstruktive Kritik gern zu haben ;)

Mit Assembler kann ich Dir überhaupt nicht weiterhelfen, aber Deine 
Tasterabfrage machst Du besser niemals mit den Hardware-Interrupts INT0 
und INT1.

Zur Abfrage von prellenden, mechanischen Tastern gibt es zwei 
praktikable Methoden:
a) in einer Schleife
b) in einem Timer-Interrupt

Die typische Prellzeit mechanischer Taster beträgt unter 1ms, so dass Du 
mit etwas Sicherheit am besten Abfragen realisierst, die zeitlich zum 
Beispiel 5ms auseinander liegen.

Also entweder in einer Schleife alle 5 ms den Taster abfragen.
Oder in einem Timer-Interrupt alle 5 ms den Taster abfragen.
Wobei die Zeit nicht so kritisch ist. Also wenn die Abfrage in einer 
Schleife je nachdem mal alle 5 ms und mal alle 50 ms erfolgt, fällt das 
bei manueller Bedienung kaum auf.

von JoergL (Gast)


Lesenswert?

Maximilian Prakesch schrieb:
> Ich möchte in Assembler ..

Ganz wichtig ist: NIEMALS dazuschreiben, was für eine CPU das ist.
Es kennt ja jeder hier alle Controller dieser Welt.

von Maximilian P. (mad_max)


Lesenswert?

JoergL schrieb:
> Maximilian Prakesch schrieb:
>> Ich möchte in Assembler ..
>
> Ganz wichtig ist: NIEMALS dazuschreiben, was für eine CPU das ist.
> Es kennt ja jeder hier alle Controller dieser Welt.

Verstehe ich was falsch? Ich habe doch unten erwähnt, dass ich auf dem 
ATmega8 arbeite. Was für Informationen benötigt ihr noch?

von Maximilian P. (mad_max)


Lesenswert?

Jürgen S. schrieb:

> Mit Assembler kann ich Dir überhaupt nicht weiterhelfen, aber Deine
> Tasterabfrage machst Du besser niemals mit den Hardware-Interrupts INT0
> und INT1.
>
Vielen Dank erstmal für die schnelle Antwort! Ich muss dazu sagen, ich 
kenne mich einigermaßen gut mit Java aus, u.a. auch mit C. Wenn du in C 
programmierst, hättest du da evtl. ein Code-Beispiel für mich? Oder 
einen Link zu diesem Thema? Das würde mir sehr helfen!

von chris (Gast)


Lesenswert?

Maximilian Prakesch schrieb:
> JoergL schrieb:
>> Maximilian Prakesch schrieb:
>>> Ich möchte in Assembler ..
>>
>> Ganz wichtig ist: NIEMALS dazuschreiben, was für eine CPU das ist.
>> Es kennt ja jeder hier alle Controller dieser Welt.
>
> Verstehe ich was falsch? Ich habe doch unten erwähnt, dass ich auf dem
> ATmega8 arbeite. Was für Informationen benötigt ihr noch?

Nee, du verstehst nichts falsch.
Hier gibt es halt einige, die nur so weit lesen, bis sie was zum Maulen 
finden. Einfach ignorieren.

von Jürgen S. (jurs)


Lesenswert?

Maximilian Prakesch schrieb:
> Vielen Dank erstmal für die schnelle Antwort! Ich muss dazu sagen, ich
> kenne mich einigermaßen gut mit Java aus, u.a. auch mit C. Wenn du in C
> programmierst, hättest du da evtl. ein Code-Beispiel für mich?

Ich programmiere nur "Arduino". Da ist das alles ein wenig anders, weil 
mit der "Arduino Core Library" programmiert wird, die bereits über den 
Timer0 die Funktionen millis() und micros(), delay() und 
delayMicroseconds() bereitstellen, als Milli- und Mikrosekundenzähler 
und entsprechende Delay-Funktionen, die sich für vielfältige Zwecke 
nutzen lassen.

Softwaremäßiges "Entprellen für Arme" mittels einem kleinen delay für 
mehrere Taster unter der Arduino-Software habe ich hier mal gezeigt, wie 
man es auf dem Arduino machen kann:
Beitrag "Re: Danneggers Entprellroutine im Arduino benutzen"

Weiter unten im Thread auch Codes um zwischen kurzen und langen 
Tastendrücken  und Tasten-Doppelklick zu unterscheiden.

> Oder einen Link zu diesem Thema?

Hier im Forum gibt es bestimmt mehrere hundert Threads zum "Entprellen 
nach Dannegger", da geht es meistens um C. Der entsprechende Artikel ist 
hier:
http://www.mikrocontroller.net/articles/Entprellung

Wie ich sehe, ist da auch AVR Assembler Code enthalten.

Wenn Du es einfacher machen möchtest: In Deinem Code ist doch bereits 
eine Abfrage enthalten, ob eine hundertel Sekunde vergangen ist oder 
nicht. Eine hundertstel Sekunde sind 10 Millisekunden und das ist eine 
gute Zeitspanne, um danach immer den Zustand eines Tasters abzufragen. 
Also einfach immer nach der hundertstel Sekunde den Tasterzustand 
auslesen, dann hast Du schon mal den "Status", des Tasters, also ob der 
Pegel HIGH oder LOW ist. Dann brauchst Du nur noch eine Variable als 
Merker, um Dir den Zustand bei der letzten Abfrage zu merken. Wenn sich 
der Status geändert hat HIGH/LOW oder LOW/HIGH, dann wurde der Taster 
gedrückt oder losgelassen.

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.