Forum: Mikrocontroller und Digitale Elektronik Mega16 verrechnet sich: 0+0 = 1!


von Vallery (Gast)


Lesenswert?

Hallo zusammen...
Ich wollte (zum Anfang) etwas ausprobieren:

.INCLUDE "m16.def.inc"
.ECU TAKT = 8000000
.DEF akku = r16
.CSEG
rjmp start
ORG $2A

Warte20ms:
push XL
push XH
ldi XL,LOW(TAKT/250)
ldi XH,HIGH(TAKT/250)

Warte20ms1:
nop
sbiw XL,1
brne Warte20ms1
pop XH
pop XL
ret

start:
ldi akku,LOW(RAMEND)
out SPL,akku
ldi akku, HIGH(RAMEND)
out SPH,akku
ldi akku,$ff
out DDRB,akku
ldi r18,$00

loop:
rcall warte20ms
in akku,PIND
neg r16
add r16,r18
adc r18,r16
neg r16
out PORTB,akku
rjmp loop
.EXIT

Ich habe das Programm eingegeben, überspielt, aber der Atmega16 zählt 
hoch (ohne daß ich einen Taster gedrückt habe!) (von LED0 bis LED7 und 
von vorn)
:-(

Wenn ich die Zeile mit dem adc r18,r16 weglasse, blinkt nur die zum 
Taster gehörige LED.  :-)

Wenn ich jetzt noch die Zeile add r16,r18 gegen adc r16,r18 austausche, 
leuchtet (ohne daß ein Taster gedrückt wird) die LED0 (PortB).  :-(

Irgendwie habe ich das Gefühl, daß da mit dem Carrybit etwas nicht 
hinhaut.
Wer kann mir weiterhelfen ?

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Nimm mal nicht

neg r16

sondern

com r16

Die ganze Addition hingegen erschließt sich mir nicht.
Wenn Du r16 schon akku genannt hast kannst Du auch diese Bezeichnung 
weiterhin verwenden, dann wird´s übersichtlicher ;-)

von Otto (Gast)


Lesenswert?

wie kommst Du auf die Idee, dass hier 0+0=1 sind ????

Otto

von Falk B. (falk)


Lesenswert?

@ Vallery (Gast)

1
loop:
2
rcall warte20ms
3
in akku,PIND
4
neg r16

Das sollte sicher eher com r16 heissen. Aber dein "Stil" ist gefährlich. 
Einmal nutzt du akku und einmal r16, was aber das gleiche ist. Da 
schiesst man sich schnell ins Knie.

>Ich habe das Programm eingegeben, überspielt, aber der Atmega16 zählt
>hoch (ohne daß ich einen Taster gedrückt habe!) (von LED0 bis LED7 und
>von vorn)
>:-(

Was in gewisser weise auch verständlich ist. Der Code ist recht 
mysteriös.
Was soll denn rauskommen? Dass bei jedem Tastendruck um eins hochgezählt 
wird?

MFG
Falk

von Vallery (Gast)


Lesenswert?

"wie kommst Du auf die Idee, dass hier 0+0=1 sind ????

Otto"

wenn ich ihn "0" aus r18 und "0" (kein Taster gedrückt) addieren lasse, 
und er mit eine leuchtende LED präsentiert ?
mir erscheint dieser Fehler recht komisch.

von Vallery (Gast)


Lesenswert?

...
Das sollte sicher eher com r16 heissen. Aber dein "Stil" ist gefährlich.
Einmal nutzt du akku und einmal r16, was aber das gleiche ist. Da
schiesst man sich schnell ins Knie.

>Ich habe das Programm eingegeben, überspielt, aber der Atmega16 zählt
>hoch (ohne daß ich einen Taster gedrückt habe!) (von LED0 bis LED7 und
>von vorn)
>:-(

Was in gewisser weise auch verständlich ist. Der Code ist recht
mysteriös.
Was soll denn rauskommen? Dass bei jedem Tastendruck um eins hochgezählt
wird?

MFG
Falk
...

Eigenlich war mein Ziel, daß ich ihn zwei Zahlen zusammenzählen lasse.
(ein Vergleich, ob die Zahlen identisch sind, kann später kommen).
Nur verstehe ich nicht, wieso er mir wenn ich die Eingabe mit etwas 
addieren lasse, ein Wert rauskommt, der 1 zu hoch ist.

von spess53 (Gast)


Lesenswert?

Hi

Wie ist denn die Led beschaltet? Meist leuchten die bei L.

MfG Spess

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

>wenn ich ihn "0" aus r18 und "0" (kein Taster gedrückt) addieren lasse,
>und er mit eine leuchtende LED präsentiert ?
>mir erscheint dieser Fehler recht komisch.


Der Fehler sitzt zwischen Deinen Ohren, nicht im Controller ;-)

von Vallery (Gast)


Lesenswert?

Die LED leuchtet wenn der Ausgang LOW ist.

@Travel: das weiss ich auch! aber wo ist mein Denkfehler ?

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Der Ausgang ist Low, wenn 0+0=0 ist ;-)

von Falk B. (falk)


Lesenswert?

@ Vallery (Gast)

>Eigenlich war mein Ziel, daß ich ihn zwei Zahlen zusammenzählen lasse.

Ja wo sind denn deine beiden Zahlen?

>Nur verstehe ich nicht, wieso er mir wenn ich die Eingabe mit etwas
>addieren lasse, ein Wert rauskommt, der 1 zu hoch ist.

Wer addiert denn bitte Eingaben? Und dazu noch ohne gescheite 
Tastenauswertung. Nein, einfach 20ms warten reicht nicht.

MFg
Falk

von Vallery (Gast)


Lesenswert?

...   ;-(
GRRR!
 ... die 2 Negierungen habe ich eingebaut, weil die Ein und Ausgänge mit 
negativer (sagt man das so ?) Logik arbeiten.

von Vallery (Gast)


Lesenswert?

..die beiden Zahlen sollen in r16 und 18 sein.
im ersten Durchlauf sollte dann r16 um null erhöht werden und später 
immer um den im vorangegangenen Durchlauf in r18 eingegangenen Wert.

von Falk B. (falk)


Lesenswert?

@ Vallery (Gast)

>GRRR!
> ... die 2 Negierungen habe ich eingebaut, weil die Ein und Ausgänge mit
>negativer (sagt man das so ?) Logik arbeiten.

Sagt man so. Schon klar, nur dass du leider dem Irrtum des Befehls neg 
aufsitzt. Der berechnet das negative Zweierkomplement. Du willst aber 
die Bit alle invertieren, das macht der Befehl com.

neg 1  -> 0xFF
neg 16 -> 0xF0
com 1  -> 0xFE
com 16 -> 0xEF

MFG
Falk

von Falk B. (falk)


Lesenswert?

@ Vallery (Gast)

>..die beiden Zahlen sollen in r16 und 18 sein.
>im ersten Durchlauf sollte dann r16 um null erhöht werden und später
>immer um den im vorangegangenen Durchlauf in r18 eingegangenen Wert.

Dann solltest du vielleicht aber das auch etwas geordneter hinschreiben.

[avrasm]
.INCLUDE "m16.def.inc"
.ECU TAKT = 8000000
.DEF akku = r16
.def tmp  = r17
.def old  = r18
.CSEG
rjmp start
ORG $2A

Warte20ms:
push XL
push XH
ldi XL,LOW(TAKT/250)
ldi XH,HIGH(TAKT/250)

Warte20ms1:
nop
sbiw XL,1
brne Warte20ms1
pop XH
pop XL
ret

start:
ldi tmp,LOW(RAMEND)
out SPL,tmp
ldi tmp, HIGH(RAMEND)
out SPH,tmp
ldi tmp,$ff
out DDRB,tmp

clr akku
ldi old,1

loop:
rcall warte20ms
in tmp,PIND
com tmp
breq loop          ; keine Taste gedrückt, nochmal

loop_1:
rcall warte20ms
in tmp,PIND
com tmp
brne loop_1        ; Taste immer noch gedrückt, nochmal

add akku,old       ; Addieren
mov old, akku      ; aktuellen Wert für nächste Akkumulation kopieren
out PORTB,akku

rjmp loop
[avrasm]

MFG
Falk

von Vallery (Gast)


Lesenswert?

Danke, werde ich probieren.
Gibt es außer der englischen Beschreibung zum Atmel Mega 16 evtl eine 
Deutsche mit Beispielen?

von Falk B. (falk)


Lesenswert?

@ Vallery (Gast)

>Gibt es außer der englischen Beschreibung zum Atmel Mega 16 evtl eine
>Deutsche mit Beispielen?

Nein. Aber es gibt ja noch das

AVR-Tutorial

mit vielen, deutschen Beispielen.

MFG
Falk

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.