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 ?
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 ;-)
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
"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.
...
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.
>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 ;-)
@ 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
..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.
@ 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
@ 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
@ 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