Hallo,
ich habe noch nicht sonderlich viel Erfahrung in der programmierung mit
Assembler. Deshalb wollte ich hier mal nachfragen ob mein Quellcode so
funktioniert oder was eben daran falsch ist.
Funktionsweise.
Ich habe im Ram 256 Byte gespeichert, die nach und nach an die Ports C
und E ausgegeben werden sollen. Die position im Ram wird während dessen
immer wieder neu berechnet.
1
SET_LED:
2
3
mov r30, r1 ; r1: Die aktuelle Position
4
rol r30 ; r3 mit 2 multiplizieren um die aktuelle Ramposition zu ermitteln.
5
ldi r27, $1 ; Start Adresse des Rams erst bei 0x0100
6
add r31, r27 ; Startadresse des Rams zur Position hinzu addieren.
7
lds r2, Z ; Wert aus dem Ram an adresse Z (r30, r31) in einem Register speichern
8
out $3, r2 ; Ausgabe an PORTC
9
inc Z ; Z incrementieren
10
lds r2, Z ; Wert aus dem Ram an adresse Z in einem Register speichern
sehr schön, so macht das also ein richtiger Asm-progger :)
aber:
"addi" gibt's nicht bei AVRs!
hast wahrscheinlich
"adiw Z, 0x01"
gemeint (gibt es bei den neueren Typen),
@ Bruno (Gast):
auf jeden Fall das "AVR Instruction Set"-PDF von Atmel besorgen ;)
auch grüße aus Berlin...
@Michael U. Jupp ist AVR. Hab ich aber auch in der Überschrift erwähnt.
Danke für eure Hilfe, ich find C dann doch irgendwie einfacher.
Habe mir das AVR Instruction Set herunter geladen, damit ist vieles
einfacher.
Hallo,
@Jörg X: aua aua, das kommt davon, wenn man mehr auf die eigenen
Kommentare achtet, stimmt natürlich.
adiw geht auch nicht, das kann nur 0...63 als Wertebereich, es müßten
aber in 16Bit 0x100 addiert werden
subi ZH, -0x01 dagegen geht...
Eigentlich würde ich es aber eher so machen:
{avrasm]
-----------------------
.DSEG
.org 0x0100
DATENTAB .byte 256
.CSEG
.def aktuell = r1 ; liest sich wesentlich besser...
.def temp = r2
ldi ZH,high(DATENTAB)
ldi ZL,low(DATENTAB)
mov YL,aktuell
clr YH
lsl YL
rol YH
add ZL,YL
adc ZH,YH
ld temp,Z+
out PORTC,temp
ld temp,Z
out PORTE,temp
{/avrasm]
ist universeller und unabhängig von der Ram-Position der Wertetabelle.
Man hat nur an einer Stelle was anzupassen. ;)
Wenn ich nicht wieder auf die Schnelle Fehler eingebaut habe...
Eigentlich mache ich dazwischen an den KS0108-Routinen für mein
"AVR-Radio weiter, das irritiert dann manchmal ;)
Gruß aus Berlin
Michael
@Michael U.: verdammt, da hab ich nicht aufgepasst :)
@Bruno:
> ich find C dann doch irgendwie einfacher.
was treibt dich zu Asm? schau mal oben links "AVR-GCC-Tutorial" :)