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
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.
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.
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?
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!
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.