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 ;-)
@ 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
"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.
Hi Wie ist denn die Led beschaltet? Meist leuchten die bei L. MfG Spess
>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 ;-)
Die LED leuchtet wenn der Ausgang LOW ist. @Travel: das weiss ich auch! aber wo ist mein Denkfehler ?
@ 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
... ;-( GRRR! ... die 2 Negierungen habe ich eingebaut, weil die Ein und Ausgänge mit negativer (sagt man das so ?) Logik arbeiten.
..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
Danke, werde ich probieren. Gibt es außer der englischen Beschreibung zum Atmel Mega 16 evtl eine Deutsche mit Beispielen?
@ 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.