-
Inline Assembler
Hallo liebe Leute,
nach einer Weile des grübelns und überlegens hab ich mich dazu entschieden, ein bischen Assembler zu "lernen".
So weit, so gut.
Allerdings macht mir mein erstes Programm schon Probleme :-(
Hier mal der Code:
Code:
$regfile = "m32def.dat"
$crystal = 16000000
$framesize = 30
$hwstack = 30
$swstack = 30
$asm
ldi r16, 0xFF
Out Ddrc , R16
ldi r16, 0b11110000
Out Portc , R16
Lop:
rjmp lop
$end Asm
End
Nach meinem Verständnis sollten jetzt ja 4 leds leuchten und die anderen 4 nicht. Jedoch leuchtet keine!
Hier mal der Code, der meiner Meinung nach genau das selbe macht:
Code:
$regfile = "m32def.dat"
$crystal = 16000000
$framesize = 30
$hwstack = 30
$swstack = 30
DDRC = 255
PORTC = &b11110000
Do
Loop
End
Dieser Code funktioniert.
Könnt ihr mir sagen, wo mein Fehler ist?
Vielen Dank
Gruß
Chris
-
Versuch mal die Schreibweise des Wertes zu ändern:
Code:
$regfile = "m32def.dat"
$crystal = 16000000
$framesize = 30
$hwstack = 30
$swstack = 30
$asm
ldi r16, &hFF
Out Ddrc , R16
ldi r16, &b11110000
Out Portc , R16
Lop:
rjmp lop
$end Asm
End
-
Hallo peterfido,
vielen dank, jetzt funzts :-)
Aber kannst du mir erklären, warum das so gemacht werden muss??
Gruß
Chris
-
Hallo,
das DDRC bestimmt welche Ports am Port C als Eingänge und welche als Ausgänge verwendet werden sollen. Erst wenn man dann auf den Port schreibt, steht ein Wert an.
In Deinem Fall waren die Port-Ausgänge auf Low nachdem das DDRC gesetzt wurde. Deine LED's sind vermutlich vom Port über Vorwiderstand auf Masse geschaltet.
Mitch.
-
-
Vielen Dank für eure Antworten,
aber ich meinte eigentlich, worin der Unterschied besteht, wenn ich astatt
dieses schreibe:
??
Das sind doch eigentlich die gleichen Werte, oder nicht?
Gruß
Chris
-
"&H" ist das, was Bascom versteht, "0x" ist was für "C" und diverse andere Sprachen.
Da is wohl noch jeder schon mal ins Schleudern gekommen *g*
-
Vielen Dank, jetzt weis ich das auch :-)
Jetzt habe ich aber wieder mal eine Frage:
Mit folgendem Code möchte ich bei Tastendruck (Pina.0) eine Led an Portc.0 toggeln.
Allerdings wird diese nicht getoggelt, sondern sie leuchtet nur solange, solange ich den Taster drücke.
Hier der Code:
Code:
$regfile = "m32def.dat"
$crystal = 16000000
$framesize = 30
$hwstack = 30
$swstack = 30
$asm
.def Null = R20
.def Eins = R21
.def K = R22
.def I = R23
.def J = R24
ldi null, &b00000000
ldi eins, &b11111111
ldi r16, &b11111111
Out Ddrc , R16
ldi r16, &b00000000
Out Ddra , R16
ldi r16, &b11111111
Out Portc , R16
ldi r16, &b11111111
Out Porta , R16
Lop:
sbis pina , 0
rjmp taster_an
rjmp lop
Taster_an:
ldi r16, &b00000000
sbis pinc , 0
ldi r16, &b11111111
cpi r16 , &b00000000
breq led_ein
sbi portc,0
rjmp ende_taster_an
Led_ein:
cbi portc,0
Ende_taster_an:
'rcall wait
ret
Wait:
ldi k,10
loop_k:
nop
nop
dec k
cpi k,0xFF
brne loop_k
dec j
cpi j,0xFF
brne Wait
dec i
cpi i,0xFF
brne Wait
ret
$end Asm
End
Warum wird die Led immer wieder ausgeschaltet (also 0 = ein und 1 = aus)??
Gruß
Chris
-
Du setzt r16 auf 1 und vergleichst im nächsten Schritt auf 0.. Das Ergebnis wird immer 1 sein...
Hier mal ein Wechsellicht zwischen PortD 5 und PortD 6. Der Taster liegt auf PinD2, Pulldown, geschlossen auf High:
Code:
$regfile = "m32def.dat"
$crystal = 8000000
$framesize = 30
$hwstack = 30
$swstack = 30
$asm
ldi r16, &b01100000
Out Ddrd , R16
ldi r16, &b01000000
Out Portd , R16
Lop:
sbic Pind , 2
rcall Invled
rjmp lop
Invled:
ldi r16, &b00100000
sbis pind,6
ldi r16, &b01000000
Out Portd , R16
Loslassen:
sbic pind,2
rjmp Loslassen
ret
$end Asm
End
-
Hallo Leute,
erstmal vielen Dank für eure Antworten.
Aber ich hab mich grad soooo stark aufgeregt!
Der einzige Fehler in meinem Programm ist der, dass ich im Mainloop (lop)
Code:
Lop:
sbis pina , 0
rjmp taster_an
rjmp lop
anstatt
Code:
Lop:
sbis pina , 0
rcall taster_an
rjmp lop
geschrieben habe.
Der einzige Fehler war also das "RJMP" ...
Kann mir jemand erklären, warum ich hier "RCALL" benutzen muss??
Gruß
Chris