hallo,
ich bin noch neu in sachen µC-Programmierung und wollte mich zum anfang
an einem 4Bit-Binärzähler (step-by-step durch Taster) versuchen mit
meinem Atmega8.
Hier der Code:
1
.include "m8def.inc"
2
3
ldi r16, 0xFF
4
out DDRB, r16 ;PORTB Ausgang (extern LEDs)
5
6
ldi r16, 0x00
7
out DDRD, r16; ;PORTD Eingang (extern Taster)
8
9
ldi r16, 0xFF
10
out PORTD, r16 ;PullUps an PORTD aktivieren
11
12
again:
13
ldi r16, 0xFF
14
15
loop:
16
out PORTB, r16
17
sbic PIND, 0 ;Wenn Taster0 gedrückt
18
rjmp loop
19
20
wait: ;warte
21
sbis PIND, 0 ;bis Taster0 wieder offen
22
rjmp wait
23
24
breq again ;r16==0?
25
dec r16 ;r16--
26
rjmp loop
Bei Tastendruck wird zwar gezählt, aber leider nicht der Reihe nach
(0-1-2-...).
Es kommen die kuriosesten LED-Kombinationen raus, zb folgt auf 6
manchmal 9 oder so.
Weiß jemand, wo der Fehler liegt?
Danke schon mal im Voraus!!
@otto:
deswegen habe ich ja die "wait"-schleife eingebaut, damit quasi erst
gezählt wird wenn der Taster wieder losgelassen wird.
ich überprüfe noch mal den "entprell-apparat"...
rein vom code sollte es eigentlich richtig sein oder?
1) dein 'erstes' Programm ist noch zu kompliziert für dich.
Nicht lachen. Deine Aufgabenstellung mag sich simpel anhören,
ist es aber nicht
2) im AVR-Tutorial gibt es ein Kapitel über Tastenentprellen.
http://www.mikrocontroller.net/articles/AVR-Tutorial:_Tasten
Und davor gibt es noch gefühlte 20 andere Kapitel, die alle
mehr oder weniger Voraussetzung sind um das Entprellkapitel
zu verstehen.
baer schrieb:> deswegen habe ich ja die "wait"-schleife eingebaut, damit quasi erst> gezählt wird wenn der Taster wieder losgelassen wird.
Das Problem ist, dass die meisten Taster mehrfach zu und wieder auf
machen, wenn du sie einmal drückst.
Michael schrieb:> Das Problem ist, dass die meisten Taster mehrfach zu und wieder auf> machen, wenn du sie einmal drückst.
Eben, les das Tutorial hier. Für einen ersten Test kannst du ja eine
einfache Entprellung mit einem RC Glied vornehmen daß dich die
Entprellroutinen nicht erschlagen.
Aber später solltest du die Entprellroutinen mit dem Timer nutzen.
Mach mal aus dem "sbis" (überspringe nächsten Befehl bei "1"), nach wait
ein "sbic" (überspringe nächsten Befehl bei "0"), billig variante einer
Entprellung funktioiert in den meisten Fällen, wenn nicht hier im
Tut mal nachschauen da findest Du die Schulmäßige Entprellung, die
funktioniert dann auf jeden Fall.
Theo schrieb:> Mach mal aus dem "sbis" (überspringe nächsten Befehl bei "1"), nach wait> ein "sbic" (überspringe nächsten Befehl bei "0"),
Das bringt ihm aber nichts. Denn in der Zeitspanne die vergeht bis der
µC aus der ersten Schleife in die 2-te wechselt ist der Taster ja
geschlossen. Nur geht er für den µC eben noch ein paar mal auf und zu,
ehe er dann dauerhaft auf zu bleibt.
Karl Heinz Buchegger schrieb:> ehe er dann dauerhaft auf zu bleibt
Du musst dich schon entscheiden auf oder zu :-)
Die deutsche Sprache kann schon verwirrend sein.
Karl Heinz Buchegger schrieb:> Theo schrieb:>> Mach mal aus dem "sbis" (überspringe nächsten Befehl bei "1"), nach wait>> ein "sbic" (überspringe nächsten Befehl bei "0"),>> Das bringt ihm aber nichts. Denn in der Zeitspanne die vergeht bis der> µC aus der ersten Schleife in die 2-te wechselt ist der Taster ja> geschlossen. Nur geht er für den µC eben noch ein paar mal auf und zu,> ehe er dann dauerhaft auf zu bleibt.
Glaube mir das ist sehr stark vom Schalter bzw. Taster abhängig.
Und wenn es so nicht gehen sollte, was aber auf jeden Fall einen
Versuch wert ist, kann er ja immer noch die Entprellung von hier
aus dem Tut benutzen. Ich weiß nur nicht mehr genau wo ich die
gesehen habe, wird sich aber finden lassen.
Theo schrieb:> Karl Heinz Buchegger schrieb:>> Theo schrieb:>>> Mach mal aus dem "sbis" (überspringe nächsten Befehl bei "1"), nach wait>>> ein "sbic" (überspringe nächsten Befehl bei "0"),>>>> Das bringt ihm aber nichts. Denn in der Zeitspanne die vergeht bis der>> µC aus der ersten Schleife in die 2-te wechselt ist der Taster ja>> geschlossen. Nur geht er für den µC eben noch ein paar mal auf und zu,>> ehe er dann dauerhaft auf zu bleibt.>> Glaube mir das ist sehr stark vom Schalter bzw. Taster abhängig.
Ohne Frage.
Aber bei 1 Mhz hat der µC wieviel Zeit bis er von einem sbic durch
überspringen des rjmp auf den nächsten kommt und damit die Warteschleife
sofort wieder abbricht? Und in welchem zeitlichen Zusammenhang steht das
zu den typischen Prellzeiten eines Tasters?
Karl Heinz Buchegger schrieb:> Theo schrieb:>> Karl Heinz Buchegger schrieb:>>> Theo schrieb:>>>> Mach mal aus dem "sbis" (überspringe nächsten Befehl bei "1"), nach wait>>>> ein "sbic" (überspringe nächsten Befehl bei "0"),>>>>>> Das bringt ihm aber nichts. Denn in der Zeitspanne die vergeht bis der>>> µC aus der ersten Schleife in die 2-te wechselt ist der Taster ja>>> geschlossen. Nur geht er für den µC eben noch ein paar mal auf und zu,>>> ehe er dann dauerhaft auf zu bleibt.>>>> Glaube mir das ist sehr stark vom Schalter bzw. Taster abhängig.>> Ohne Frage.> Aber bei 1 Mhz hat der µC wieviel Zeit bis er von einem sbic durch> überspringen des rjmp auf den nächsten kommt und damit die Warteschleife> sofort wieder abbricht? Und in welchem zeitlichen Zusammenhang steht das> zu den typischen Prellzeiten eines Tasters?
Bleib locker, von der theoretischen Seite hast Du absolut recht,
die Praxis zeigt hier nur oft was anderes. Das müssen wir beide nicht
alles verstehen, ist aber mal oft genug so.
Theo schrieb:> Bleib locker, von der theoretischen Seite hast Du absolut recht,> die Praxis zeigt hier nur oft was anderes.
Das zeigt noch nicht mal die Praxis.
Dein µC ist rund um einen Faktor 1000 zu schnell, als das du mit diesem
Austausch eines SBIS durch einen SBIC hier auch nur ansatzweise
irgendetwas reißen könntest.
> Das müssen wir beide nicht alles verstehen, ist aber mal oft genug so.
Im Regelfall versteh ich sehr gut, warum Programme nicht funktionieren.
Hi!
Also ich kenne Taster die prellen nicht. Waren allerdings mit
Hallschaltern bestückt. Sein Problem dürfte aber doch das Dingdong
seines Tasters sein. Aber:
> breq again ;r16==0?> dec r16 ;r16--> rjmp loop
ich halte diesen Construct für recht gefährlich, vor allem die 1.Zeile.
Wann wurde denn die Prüfung auf 0 gemacht. Wenn auch nur ein einziger
Befehl davorsteht der die Flags beeinflusst sind die Preller total
unwichtig. Besser wäre also:
dec r16 ;r16--
breq again ;r16==0?
rjmp loop
Viel Erfolg, Uwe
Theo schrieb:> ..., von der theoretischen Seite hast Du absolut recht,> die Praxis zeigt hier nur oft was anderes.
Dann ist wohl die Theorie falsch, die Praxis ist nun mal so, wie sie
ist.
Der µC wird mit 1 MHz Takt wohl um einen Faktor 1000 bis 10000 schneller
sein, als das Tastenprellen.
Martin schrieb:> Theo schrieb:>> ..., von der theoretischen Seite hast Du absolut recht,>> die Praxis zeigt hier nur oft was anderes.>> Dann ist wohl die Theorie falsch, die Praxis ist nun mal so, wie sie> ist.
Genau so ist es. Aber man sollte fairerweise schon erwähnen das auch
die Theorie ihre Daseinsberechtigung hat. Und die von mir hier erwähnte
"billig Entprellung", wirklich nur in den meisten ab halt nicht immer
funktioniert. Wenn der verwendete Taster wirklich sehr schlecht ist
wird man um eine aufwendige Entprellung nicht herum kommen.
> Der µC wird mit 1 MHz Takt wohl um einen Faktor 1000 bis 10000 schneller> sein, als das Tastenprellen.
Nur so hat die Geschichte überhaupt eine Chance auf Erfolg.
ja eigentlich gar nicht benötigt wird, weil nach 0b11110000 ja
0b11101111 kommt und der 4-bit-zähler damit intern ja automatisch wieder
auf 0xF springt, nachdem er 0x0 erreicht hat
Theo schrieb:> Wenn der verwendete Taster wirklich sehr schlecht ist> wird man um eine aufwendige Entprellung nicht herum kommen.
Wenn die Entprellung aufwendig ist, dann ist eher die Umsetzung
suboptimal.
Eine gute Entprellung auch für sehr schlechte Tasten muß überhaupt nicht
aufwendig sein (wenig Flash, RAM, CPU-Last).
Eventuell muß man zum Verstehen etwas Gehirnschmalz "aufwenden".
Was man auf alle Fälle vermeiden muß, sind blockierende Entprellungen!
Es macht keinen guten Eindruck, wenn z.B. die Uhrzeitanzeige stehen
bleibt, solange eine Taste gedrückt gehalten wird.
Um zu zeigen, daß man die Entprellung beherrscht, schreibe man folgendes
Programm:
Man nehme mindestens 2 Taster und 2 LEDs.
Jede Taste muß beim Drücken ihre LED umschalten (togglen), egal ob die
andere Taste gedrückt gehalten wird oder nicht.
Man kann dann leicht auf 8 Taster + 8 LEDs erweitern, das Programm wird
nur minimal größer.
Es macht keinen Sinn, eine Programm mit Tasten zu schreiben, solange man
keine vernünftige Entprellung zustande bringt.
Ist quasi wie Haus bauen mit dem Dach zuerst, es fällt immer wieder
runter.
Peter