Hallo zusammen,
bin ganz neu in der AVR-ASM-Programmierung und mein erstes kleines
Programm läuft auf dem ATmega8 und macht sogar das, was es soll ;-).
Das Programm macht nix anderes als die ganze Zeit 5 LEDs nach der Reihe
ein und wieder auszuschalten.
Jetzt ist das doch ein schöner Brocken Code...besonders mit der
Programmierung zum Ausschalten der LEDs bin ich noch nicht ganz
zufrieden (ist das Einschalten über Bitshifting in Ordnung?).
Kann mir jemand dazu einen Tipp geben? Auch allgemein zu dem Programm,
ich möchte mir nämlich da nicht was "falsches" angewöhnen...Danke
schonmal.
1
.NOLIST
2
.INCLUDE "m8def.inc" ; Definitionsdatei für ATmega8
ldi r17,0x02 ;Lade 0x02 in r17
MOV r16,r17 ;Kopiere r17 in r16
Warum nicht direkt ldi r16? Und die Mnemonics entweder groß oder
kleinschreiben, aber nicht beides gleichzeitig.
LSL funktioniert leider nicht (zumindest bekomm ichs nicht hin). r16 ist
ja 0, wenn ich da dann einen Linksshift mache, bleibts weiterhin 0.
Die Addition war eigentlich nur eine Rechenerleichterung für mich ;-)
Hi
> ldi r16, 0x3F ; lade 0x3F in r16> out DDRB, r16 ; Inhalt von r16 in DDRB ausgeben> ldi r16,0b00111111 ; Alle LEDs aus
Hast du nun 5 oder 6 LEDs?
>ist das Einschalten über Bitshifting in Ordnung?>ein: lsr r16> out PORTB,r16 ;Ausgabe über PORTB> BREQ aus ;
Das funktioniert nur, weil 'out' keine Flags beeinflußt. Glück gehabt.
Außerdem shiftest du weiter als du must. Besser wäre
1
ein: lsr r16
2
out PORTB,r16 ;Ausgabe über PORTB
3
andi r16,0b00111111
4
BREQ aus
Deine Aus-Routine lässt sich auch durch Schieben realisieren:
[avrasm]
aus: clr r16 ; r16 = $00
aus10: sec ; Carry-Flag setzen
rol r16 ; nach r16 schieben
out PORTB,r16
rcall WARTEN ;Warteschleife
cpi r16,0b00111111
BREQ loop
rjmp aus10
[avrasm]
MfG Spess
Danke für die Tipps...es funktioniert und ich kapier zum Glück auch,
warum :-)
ich hab 5 LEDs, nur an PB1 bis PB5 angeschlossen. Hab ich vorhin
vergessen, sorry.