www.mikrocontroller.net

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


Autor: Vallery (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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 ;-)

Autor: Otto (Gast)
Datum:

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

Otto

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Vallery (Gast)

loop:
rcall warte20ms
in akku,PIND
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

Autor: Vallery (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Vallery (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

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

MfG Spess

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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 ;-)

Autor: Vallery (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die LED leuchtet wenn der Ausgang LOW ist.

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

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Vallery (Gast)
Datum:

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

Autor: Vallery (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Vallery (Gast)
Datum:

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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

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.