Ja, hallo erstmal, ja ich steige gerade mir Programmierung mit ein Atmega8 und ich habe ein Projekt am laufenden und zwar: ich besitze eine STK500 und ich möchte per Tastendruck immer vorwärtszählen. Also die Led sind meine Anzeige und solle die entsprechende Zahl als binär zeigen. Kann mir ja jemanden helfen, ich bin ratlos. Hier angehangt ich was ich so mit Befehle gebastelt habe. Ich danke euch schon mal
Hallo. evtl. solltest Du mal eine ordentliche Frage stellen. Sicher kann Dir hier jemand helfen, aber alles vorkauen bringt Dich auch nicht weiter! Wo ist Dein Problem? Hast Du Dir schon über prellende Taster Gedanken gemacht? Und wenn Du per Tastendruck eine Led an und aus machen kannst, dann kannst Du doch auch eine Variable hochzählen lassen...weiss jetzt nicht, wo das Problem sein soll...
Spontan sehe ich nichts Ungewöhnliches. Mit den Pull-Ups bin ich mir gerade nicht sicher, ob die stimmen. Tu dir und uns bitte den Gefallen und kommentier deinen Code ein wenig. Man kann zwar raten, was du meinst, aber Lust hat da keiner zu. Außerdem zeigst du damit, dass du dich mit dem Problem schon selbstauseinandergesetzt hast - oft löst man damit sogar selbst die Probleme. - Was genau funktioniert denn nicht? Leuchtet nichts oder nur willkürlich? - Hast du die LEDs mal getestet? Alles an, alle aus, eine an, etc.? Damit stellst du sicher, dass die Schaltung und das Flashen grundlegend funktioniert. - Wenn der Taster nicht entprellt wird (z.B. per Software oder Kondensator), dann produziert dein Code eine zufällige Erhöhung um mehr als eins. - Taster und LEDs am richtigen I/O? (Mein STK500 kommt morgen - dann kann ich selber gucken ;) ) An deinem Code gibt es noch einiges an Verbesserungspotenzial, aber da können wir drauf eingehen, sobald der erstmal läuft. Zum Einstieg finde ich die Aufgabe gut gewählt. Gruß Kai
Kai Giebeler wrote: > Spontan sehe ich nichts Ungewöhnliches. Hmm Ungewöhnlich. Wenn wir mal die prellenden Taster beiseite lassen, sehe ich nicht, wo auf das Loslassen der Taste gewartet wird. Sobald also die Taste gedrückt wird, blinken die LED wie verrückt. Die an Bit 0 mit mindestens 1Mhz (wenn wir mal vom internen Takt ausgehen), die an Bit 7 mit immer noch knapp 4Khz > An deinem Code gibt es noch einiges an Verbesserungspotenzial, aber da > können wir drauf eingehen, sobald der erstmal läuft. Zum Einstieg finde > ich die Aufgabe gut gewählt. Ist keine gute Aufgabe. Das Problem sind die prellenden Taster. Für den Einstieg sind Szenarien die auf 'solange eine Taste gedrückt ist' basieren, besser geeignet.
>Wenn wir mal die prellenden Taster beiseite lassen, sehe ich >nicht, wo auf das Loslassen der Taste gewartet wird. Hmmm, bei genauer Betrachtung hast du Recht. Nicht weit genug reingedacht. >Ist keine gute Aufgabe. Das Problem sind die prellenden Taster. Hatte ich ja angemerkt, dass man sich drum kümmern muss, wenn die Schaltung das nicht übernimmt - denke mal, auf dem Board ist was zum Entprellen drauf. Ansonsten natürlich AVR-Tutorial oder eine einfachere Aufgabe. Ich warte jetzt erstmal ab, was eigentlich nicht geht...
Kai Giebeler wrote: > Ich warte jetzt erstmal ab, was eigentlich nicht geht... Das ist einfach erklärt. Da nirgends auf das Loslassen gewartet wird, zählt der Port rasend schnell durch. D.h. nach dem Drücken der Taste leuchten erst mal alle LED und wenn mann dann die Taste loslässt, ist da irgendeine Bitkombination zu sehen nur nicht die, die dem um 1 erhöhten Wert entspricht. Und das verwirrt den OP. Will man das korrigieren, muss man auf das Loslassen der Taste nach dem Erhöhen des Registers warten. Aber auch dann würde es durch das Prellen nicht sehr zuverlässig funktionieren. (*) Das Prellen könnte man jetzt noch mit Warteschleifen kompensieren. Wird sind uns aber wahrscheinlich einig, dass das kein wirklich guter Weg ist. OK. Für den Anfang mags gehen (man kann ja nicht alles auf einmal lernen), muss aber im Hinterkopf behalten, dass es da bessere Lösungen gibt (die leider auch komplizierter sind). (*) Wenn die Taster neu sind, oder auf dem STK wirklich ein paar Prellkondensatoren sind, hätte man dann schon eine Lösung. Eine Übung für den OP wäre es zb. das Programm so zu modifizieren, dass das Programm hochzählt, solange eine Taste gedrückt ist, aber das Hochzählen in einem Tempo zu machen, so dass man es auch noch sehen kann. Das würde zwar immer noch zu Warteschleifen führen, es würde aber ein Gefühl dafür vermittlen, wie schnell die Dinger eigentlich arbeiten. Und das wäre dann doch ein gutes Zwischenziel (das Vermitteln der Schnelligkeit, nicht die Warteschleifen)
eigenlich in der Zeile: warten: sbis PINB, 0 rjmp warten warte das programm solange die ein "1" Pegel als die Taste gedrückt wird und dann folgt die incrementierung mit inc r17 und dann die Ausgabe und dann springt es wird auf warten: und warte halt solange noch eine Taste gedrückt wird SO habe ich mir das gedacht. Was mache ich denn falsch??? Und was meinst du " auf dem Board es ist was zum prellen drauf"
Einsteiger wrote: > eigenlich in der Zeile: > > warten: > > sbis PINB, 0 > rjmp warten > > warte das programm solange die ein "1" Pegel als die Taste gedrückt Yep > wird > und dann folgt die incrementierung mit > > inc r17 > Yep > und dann die Ausgabe und dann springt es wird auf > > warten: > > und warte halt solange noch eine Taste gedrückt wird Nein. Dein Prozessor ist vieeeeeeel schneller als du denkst. Wenn er das erste mal aus der 'rjmp warten' Schleife rausfällt, weil du eine Taste gedrückt hast, dann ist die Taste beim Erneuten Sprung nach warten immer noch gedrückt. UNd deshalb geht er dann gar nicht mehr in Warteposition sondern fällt sofort wieder aus der Warteschleife heraus und incrementiert sofort wieder Register r17 > Was mache ich denn falsch??? Du darfst nicht nur warten, bis eine Taste gedrückt wurde. Du musst auch warten, bis die Taste wieder losgelassen wird! Erst dann soll ein erneuter Tastendruck wieder zu einer Erhöhung von r17 führen. Wenn. Na ja. Wenn da nicht noch prellende Taster wären. Ob dein Board da jetzt Hardwaremaessig was dagegen hat oder nicht, weiss ich nicht.
danke erstmal für deine Erklärung. Es ist mein 2. Porgramm nach Lauflicht, das ich schreibe. Ich hatte noch nicht die Taster benutzt. Das mit dem Prellen weiß ich überhauot nicht was es ist. Ich möchte gern das es funktiert egal ob es komplizierte Lösungen gibt. Also wie muss ich denn es ändert, damit es erstmal auf die Taste wenigsten reagieren kann?
>> Ich warte jetzt erstmal ab, was eigentlich nicht geht... >Das ist einfach erklärt. >Da nirgends auf das Loslassen gewartet wird, zählt der Port >rasend schnell durch. D.h. nach dem Drücken der Taste leuchten >erst mal alle LED und wenn mann dann die Taste loslässt, ist >da irgendeine Bitkombination zu sehen nur nicht die, die dem >um 1 erhöhten Wert entspricht. Und genau das wollte ich von ihm hören :) Vielleicht ist sein Problem ja auch, dass der Code gar nicht auf den Taster reagiert, immer dasselbe Muster rauskommt, oder die roten LEDs grün leuchten ;) Wollte deshalb einfach mal seine Version hören, bevor ich munter rumrate - auch wenn das von dir beschriebene Verhalten am wahrscheinlichsten ist. Wir sind uns da schon einig, dass eine SW-Entprellung für den Einstieg wahrscheinlich ungeeignet ist. @Einsteiger Entspricht das Verhalten denn jetzt Karls Beschreibung, oder geht's um ein ganz anderes Problem?
Das Problem ist alle Led's sind an nach dem Start, und eine Tastendrück bewirkt nix. also du meinst ich sollte die encrementierung durch Tastendruck führen?
Beantworte doch bitte noch die obigen Fragen: >- Hast du die LEDs mal getestet? Alles an, alle aus, eine an, etc.? >Damit stellst du sicher, dass die Schaltung und das Flashen grundlegend >funktioniert. >- Taster und LEDs am richtigen I/O? ...und schreib bitte mal was ausführlicher, Karl und ich nehmen uns ja auch Zeit!
mein Verhalten entspricht Kalrs Beschreibung nicht so 100%, denn bei Start sollte ertmal alle Led's an sein, und dann nach dem Druck einer taste sollte was passieren. Ich denke auch du meinst Kai, erstmal mein Programm reagiert nicht auf meine Taste
ja mein Board ist ok. Ich habe auch damit Lauflicht simuliert. Die Led's sind ok, nur wie gesagt habe ich noch nicht ein Programm mit Tastendruck geschrieben, sodass ich nicht weiß ob man die auf den Board aktivieren soll oder reicht einfach, Port B als eingang und die mit den Tasten zu verbinden
Sorry der Stecker war nicht richtig eingesteckt. Jetzt reagiert es nur auf die erste Taste (SW0). Ich habe auch festgestellt wenn ich die Tasten lange druckt dann kommt eine höher wert als wenn ich die kurz drücke. Auf jedenfalls der Register wird weiter incrementiert. Wie mache ich das damit es nicht weiter incrementiere während dem Druck.
Du musst vor dem Rücksprung
1 | rjmp warten |
darauf warten, dass die Taste losgelassen wurde.
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.