mikrocontroller.net

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


Autor: Einsteiger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo liebe Mikrocontroller Fans,

ich steige in der Programmierung mit dem Atmega8 und hier ist mein 2. 
selbstgeschriebenes Code.
Mein Ziel ist binär vorwärtszählen, nach tastendruck, also:

1.Tastendruck : Led: 00000001
2.Tastendruck : Led: 00000010
3.Tastendruck : Led: 00000011
usw

aber nachdem ich das Code auf die Platine geflascht habe, zeigen die 
Leds folgend:

Led: 00000001 (also 1 dezimal)

Also es zählt ab 1 (dezimal) statt ab 0(dezimal)

was mache ich denn falsch?

Danke schon mal

Hier das COdes:


.equ DDRD =$11
.equ DDRB =$17
.equ PINB =$16
.equ PORTD =$12
.def temp1 =r19
.def temp2 =r20

ldi  r16,0xFF     ; Port D als Ausgang
out  DDRD,r16

ldi  r16,0x00  ; Port B als Eingang (wo die Taster angeschossen sind)
out  DDRB,r16

ldi r17,0x00      ; initialieren den register mit 0d

ldi r16, 0xFF     ;Alle Leds an
out PORTD, r16

warten:

sbis PINB, 0     ;solange keine Taste gedrückt wird
rjmp warten       ; wird gewartet, dann wenn gedrückt
                  ; springt raus

ldi temp1, 0xFF   ; wegen Entprellung habe ich temp1

warten2:
ldi temp2, 0xFF   ; und temp2 definiert, die werden

warten3:

dec temp2       ; bis 0x00 decrementiert nach dem
brne warten3    ; Tastendruck, damit der µC das Loslassen
dec temp1            ; nicht merkt also
brne warten2         ; ein paar millisekunden

inc r17            ; dann wir r17 incrementtiert und

out PORTD, r17    ; seinen Wert wird ausgeben

warten4:
sbic PINB,0      ; wenn die Taste losgelassen ist dann
rjmp warten4        ; springt aus dem Schleifen sonst warten

cpi r17, 0xFF       ; wenn r17 den wert 256 erreicht hat, dann
breq ende      ; springt zum ende, sonst springt wieder zum
rjmp warten         ; warten
ende:
rjmp ende

Autor: Niels Hüsken (monarch35)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie ist denn der Taster am uc angeschlossen?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Drück mal deine Taste gaaaanz langsam.
Wann genau erfolgt das Umschalten der Led auf
die nächste Ziffer?
Nachdem du die Taste gedrückt hast?
Oder nachdem du die Taste losgelassen hast?


Hintergrund (Niels vermutet dasselbe).

Meist sind Taster so angeschlossen, dass der Grundzustand,
also Taster nicht gedrückt, einer 1 entspricht und der PortPin
auf 0 wechselt wenn der Taster gedrückt wird.

Wenn das Verhalten deines Programmes so ist, dass das Höherschalten
erst nach dem Loslassen passiert, dann ist das bei dir auch so.
sbis und sbic tauschen.

Autor: Niels Hüsken (monarch35)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger wrote:

> Hintergrund (Niels vermutet dasselbe).

Naja, eigendlich vermute ich, das der Taster ohne Pullup oder sonstwas 
betrieben wird; also der Port im "ungedrückten" Zustand einfach offen 
ist.

Autor: Thilo M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Pullup hat er drin, 'da wo die Taster angeschossen ;) sind'

Autor: Niels Hüsken (monarch35)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thilo M. wrote:

> Pullup hat er drin, 'da wo die Taster angeschossen ;) sind'

Pullups? also sind die taster low-aktiv. Ist das vieleicht schon das 
Problem? Kenn mich jetzt mit Assembler nicht genau aus....

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Niels Hüsken wrote:

> Pullups? also sind die taster low-aktiv. Ist das vieleicht schon das
> Problem?

Könnte sein. Solange Einsteiger sich nicht meldet werden wir
es nicht erfahren.

> Kenn mich jetzt mit Assembler nicht genau aus....

Er hat zur Zeit seine Taste auf high-aktiv programmiert.
Ohne internen Pullup.

sbis  bedeutet: Skip (next instruction) if Bit Is Set
sbic            Skip (next instruction) if Bit Is Cleared

damit müsstest da das Programm nachvollziehen können.
Der Rest vom Programm ist ja eher selbsterklärend.

Autor: Niels Hüsken (monarch35)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann ist der Code offensichtlich High-Aktiv programmiert und die Logic 
muss umgedreht werden...entweder software- oder hardwaremässig.

> Also es zählt ab 1 (dezimal) statt ab 0(dezimal)

Das ist auch nicht ganz richtig. Der Code initialisiert PortD mit 0xFF.

Autor: Thilo M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Er hat zur Zeit seine Taste auf high-aktiv programmiert.

Und genau deshalb zählt er beim Start (RESET) schon eins hoch.

Autor: Thilo M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ups, PINB wären die Tasten, da sind natürlich kein Pullups programmiert!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Niels Hüsken wrote:
> Dann ist der Code offensichtlich High-Aktiv programmiert und die Logic
> muss umgedreht werden...entweder software- oder hardwaremässig.
>
>> Also es zählt ab 1 (dezimal) statt ab 0(dezimal)
>
> Das ist auch nicht ganz richtig. Der Code initialisiert PortD mit 0xFF.

Sieh es ihm für den Moment nach:-)
Seine Led dürften ebenfalls low-activ sein.

Das wird dann die nächste Frage: Warum zählt der so komisch?
Zuerst brennt keine Led, drücke ich die Taste brennen dann auf
einmal alle.

Autor: Niels Hüsken (monarch35)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sondern? Wie sieht die verdrahtung am uc aus?

Autor: Niels Hüsken (monarch35)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger wrote:
> Seine Led dürften ebenfalls low-activ sein.
>
> Das wird dann die nächste Frage: Warum zählt der so komisch?
> Zuerst brennt keine Led, drücke ich die Taste brennen dann auf
> einmal alle.

Okey, gehen wir mal davon aus, das die Logic am Taster jetzt stimmt....
Wenn die LEDs Low-Aktiv sind, bedeutet das, das der Zustand des Zählers 
"negiert" dargestellt wird, wenn du ihn "ungefilterert" auf die Ports 
ausgibst.

Zuerst wird der Port mit 0xFF initialisiert. Keine LED leuchtet.
Nach dem ersten Tastendruck wird das register R17, das mit 0x00 
initialisiert worden ist, auf 0x01 hochgezählt und auf dem Port 
ausgegeben. Alle LEDs, bis auf die erste, leuchten.... so müsste es laut 
code zumindest sein.

Möchtest du(ihr) die negierung aufgeben, macht ihr das entweder 
Hardwaremässig (LEDs umpolen bzw umdrehen) oder Softwaremässig (über ein 
zwischenregister den Wert von R17 negieren)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.