Forum: Mikrocontroller und Digitale Elektronik Mit Tastendruck vorwärtzählen


von Einsteiger (Gast)


Angehängte Dateien:

Lesenswert?

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

von Falk B. (falk)


Lesenswert?


von munter (Gast)


Lesenswert?

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...

von Kai G. (runtimeterror)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Kai G. (runtimeterror)


Lesenswert?

>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...

von Karl H. (kbuchegg)


Lesenswert?

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)

von Einsteiger (Gast)


Lesenswert?

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"

von Karl H. (kbuchegg)


Lesenswert?

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.

von Einsteiger (Gast)


Lesenswert?

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?

von Kai G. (runtimeterror)


Lesenswert?

>> 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?

von Einsteiger (Gast)


Lesenswert?

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?

von Kai G. (runtimeterror)


Lesenswert?

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!

von Einsteiger (Gast)


Lesenswert?

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

von Einsteiger (Gast)


Lesenswert?

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

von Einsteiger (Gast)


Lesenswert?

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.

von Kai G. (runtimeterror)


Lesenswert?

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
Noch kein Account? Hier anmelden.