Forum: Mikrocontroller und Digitale Elektronik assambler-problem


von baer (Gast)


Lesenswert?

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

von Udo S. (urschmitt)


Lesenswert?

Wie entprellst du den Taster?

von Otto (Gast)


Lesenswert?

Du musst sicherstellen, dass pro Tastendruck nur 1x weitergezählt wird. 
Bei deiner Variante wird gezählt, solange der Taster betätigt ist.

Otto

von baer (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Michael (Gast)


Lesenswert?

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.

von Udo S. (urschmitt)


Lesenswert?

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.

von Theo (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Udo S. (urschmitt)


Lesenswert?

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.

von Theo (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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?

von Theo (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Uwe (Gast)


Lesenswert?

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

von Martin (Gast)


Lesenswert?

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.

von baer (Gast)


Lesenswert?

wow, da ist man mal 24 stunden nicht online und ich kann mich vor Tipps 
und Anregungen kaum retten^^
vielen dank an euch!!
Echt ein super Forum hier!

von Theo (Gast)


Lesenswert?

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.

von baer (Gast)


Lesenswert?

ich sehe gerade, dass der befehl
1
breq again
 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

von Peter D. (peda)


Lesenswert?

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

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.