Hallo,
das ist mein erstes ASM Programm.
Leider funktioniert es nicht. Aber einen Fehler kann ich irgendwie nicht
entdecken.
Eigentlich soll wenn Taste1 gedrückt LED1 leuchten und wenn Taste2
gedrückt LED2 leuchten. Wenn keine Taste gedrückt dann sollen auch keine
LED leuchten.
1
.DEVICE ATtiny2313
2
.INCLUDE "tn2313def.inc"
3
4
5
.EQU TAKT = 8000000
6
7
8
.CSEG
9
10
start:
11
LDI R16, 0b0010100 ;lade wert in r16
12
OUT DDRD, R16 ;pin2 und pin4 auf Eingang setzten
13
14
LDI R18,0x00 ;setze vergleichsregister auf 00
15
16
loop:
17
LDI R17, 0x00 ;setze R17 auf 0
18
LDI R16, 0x00 ;setze R16 auf 0
19
SBIC PIND,PIND2 ;prüfe ob PIN2 gesetzt
20
LDI R17, 0xff ;wenn JA dann setze R17 auf FF
21
SBIC PIND,PIND4 ;prüfe ob PIN4 gesetzt
22
LDI R16, 0xff ;wenn JA dann setze R16 auf FF
23
24
25
CP R17,R18 ;vergleiche R17 mit R18(00)
26
BRNE weiter1 ;wenn ungleich 00 dann spring zu weiter1
27
CP R16,R18 ;vergleiche R16 mit R18(00)
28
BRNE weiter2 ;wenn ungleich 00 dann spring zu weiter2
29
30
LDI R16,0b0000000 ;lade wert in r16
31
OUT PORTD5,R16 ;lösche led an pin6 und lösche led an pin5
32
RJMP loop
33
34
;
35
;unterprogramme
36
;
37
weiter1:
38
LDI r16,0b1000000
39
OUT PORTD5,r16 ;setze led an pin6 und lösche led an pin5
40
RJMP loop
41
42
weiter2:
43
LDI r16,0b0100000
44
OUT PORTD5,r16 ;setze led an pin5 und lösche led an pin6
45
RJMP loop
Vielleicht seht ihr ja was was mir nicht auffällt als Anfänger?
> Vielleicht seht ihr ja was was mir nicht auffällt als Anfänger?
auf anhieb nicht, aber warum geht du nicht einfach mit dem Simulator
durch - im Einzelschritt modus.
Es könnte ja auch an der Hardware liegen - inverierte eingänge oder
ausgänge?
Also ich hab den Simulator drüber laufen lassen.
Dort wurden jedenfalls schonmal keine Fehler festgestellt.
Allerdings weiß ich nicht wo ich mir die Ausund eingänge anzeigen lassen
kann...? Sorry, bin echt noch voll der Anfänger. :(
Danke Anton, das hab ich im Buch dann wohl genau falschrum gelesen.
1
.DEVICE ATtiny2313
2
.INCLUDE "tn2313def.inc"
3
4
5
.EQU TAKT = 8000000
6
7
8
.CSEG
9
10
start:
11
LDI R16, 0b1101011 ;lade wert in r16
12
OUT DDRD, R16 ;pin2 und pin4 auf Eingang setzten
13
14
LDI R18,0x00 ;setze vergleichsregister auf 00
15
16
loop:
17
LDI R17, 0x00 ;setze R17 auf 0
18
LDI R16, 0x00 ;setze R16 auf 0
19
SBIC PIND,PIND2 ;prüfe ob PIN2 gesetzt
20
LDI R17, 0xff ;wenn JA dann setze R17 auf FF
21
SBIC PIND,PIND4 ;prüfe ob PIN5 gesetzt
22
LDI R16, 0xff ;wenn JA dann setze R16 auf FF
23
24
25
CP R17,R18 ;vergleiche R17 mit R18(00)
26
BRNE weiter1 ;wenn ungleich 00 dann spring zu weiter1
27
CP R16,R18 ;vergleiche R16 mit R18(00)
28
BRNE weiter2 ;wenn ungleich 00 dann spring zu weiter2
29
30
LDI R16,0b0000000 ;lade wert in r16
31
OUT PORTD,R16 ;lösche led an pin6 und lösche led an pin5
32
RJMP loop
33
34
;
35
;unterprogramme
36
;
37
weiter1:
38
LDI r16,0b1000000
39
OUT PORTD,r16 ;setze led an pin6 und lösche led an pin5
40
RJMP loop
41
42
weiter2:
43
LDI r16,0b0100000
44
OUT PORTD,r16 ;setze led an pin5 und lösche led an pin6
45
RJMP loop
So klappt es jetzt wie es soll.
>Und warum haben deine Binärkonstanten nur 7 Bit?
Das 8. Bit ist in AVR Studio eingegraut. daher dachte ich brauch ich es
auch nicht zu setzten.
>Deine internen Pullups sin ausgeschaltet.
Woran siehst du das? Bzw. wie schalt ich sie ein?
Die Pullups werden auch über den PORT gesetzt.
Du must natürlich keine 8 Bit hinschreiben aber es macht es für mich und
andere leichter lesbar.
zb. bei 0b1000000 denk ich spontan das oberste Bit ist gesetzt.
Sehe sozusagen 0b10000000
>Die Pullups werden auch über den PORT gesetzt.
Wie jetzt, das versteh ich nicht.
Ich dachte mit
LDI R16, 0xFF
OUT PORTD,R16
setz ich die Ausgänge auf HIGH?
>Du must natürlich keine 8 Bit hinschreiben aber es macht es für mich und>andere leichter lesbar.
Okay, merk ich mir.
Ah jetzt hab ich das geblickt.
Also allen PIN's die auf Eingang geschaltet sind muß per PORTx der
Pull-Up zugeschaltet werden.
So, da hab ich aber ein Problem:
Meine Ein- und Ausgänge liegen ja auf einem Port. Wie schalte ich nun
die Wiederstände für die Eingangspin's ein, aber lasse die andren
Ausgangspin's in ruhe?
wenn du die Ausgangspins in Ruhe lassen willst musst du erstmal
feststellen wie die stehen und dann mit einer OR-Verknüpfung die Pins
auswählen die die ändern willst.
11110000
00001111
= 11111111
Okay, dass das so geht hab ich mir schon gedacht.
Muß ich dann jedesmal wenn ich eine LED über OUT PORTD schalte auch
wieder die Wiederstände mitschalten?
1
weiter1:
2
LDI r16,0b1000000
3
OUT PORTD,r16 ;setze led an pin6 und lösche led an pin5
4
RJMP loop
5
6
weiter2:
7
LDI r16,0b0100000
8
OUT PORTD,r16 ;setze led an pin5 und lösche led an pin6
9
RJMP loop
Da schalt ich ja jetzt nur die LED und würde ja die Wiederstände wieder
auf 0 setzten. Muß ich dann das so schreiben?
LDI r16,0b11010100
OUT PORTD,r16 ;setze led an pin5 und lösche led an pin6
Peter schrieb:
>> Stackpointer initialisiert?> braucht er hier nicht, es wird kein (r)call verwendet und auch keine ISRNoch nicht :-o
Die Anlagen dafür sind aber da:
1
;
2
;unterprogramme
3
;
Wenn blub² mal herausgefunden hat, dass Unterprogramme mit call
aufgerufen werden, dann gibts das nächste Problem.
@ blub²
Lass die Kommentare weg. Diese sind überflüssig:
1
CP R16,R18 ; vergleiche R16 mit R18(00)
2
BRNE weiter2 ; wenn ungleich 00 dann spring zu weiter2
3
LDI R16,0b0000000 ; lade wert in r16
Das steht kompakter im Befehl selbst.
Und der hier falsch:
1
OUT PORTD,r16 ;setze led an pin6 und lösche led an pin5
Der Befehl macht nicht das, was im Kommentar steht :-/
@Thomas O.
Danke für super Hilfe und Datei. Die hab ich noch garnicht entdeckt
gehabt.
So, jetzt hab ich das ein bissel umgeschrieben.
Gemäß Simulation sollte das auch alles klappen. Aber wenn ich es dann im
µC laufen lasse passiert folgendes:
Taste 1 gedrückt: beide LED leuchten
Taste 2 gedrückt beide LED leuchten
Das versteh ich jetzt nicht so richtig. Wo liegt der Fehler?
Ändert aber nix. Es leuchten trotzdem beide LED wenn ich eine Taste
drücke.
Es gibt noch eine 3. Taste die im Programm nicht verwendet wird, aber
trotzdem die LED's einschaltet????
1. schlecht weil led's ständig an und aus geschaltet werden, wenn taste
gedrückt (theoretisch)
2. funktioniert auch nicht, weil wieder beide led'S leuchten (praktisch)
:(
man muss den Pin abfragen wenn er high ist, die LED einschalten
ansonsten verzweigen und die LED ausschalten, wenn man die nicht
auschaltet ist ja klar das die anbleibt. Ich jage den Code mal kurz
durch den Simulator
> 1. schlecht weil led's ständig an und aus geschaltet werden, wenn taste> gedrückt (theoretisch)
Ist doch erst einmal Wurst....
Entweder hängen die Taster oder die LED nicht an den richtigen Ports
@Thomas O.
Danke. Nur leider funzt das auch nicht. Ich drücke eine Taste und beide
LED gehen an. :(
Ich hau das Ding gleich in die Tonne. :'(
Gestern abend hatte ich das noch per Unterprogramm gemacht. Incl.
Statckinit und da hat es geklappt. und mit den SBI CBI Befehlen funzt
das nicht. Ich kapier nicht warum. Der Simulator zeigt doch an das es
klappen sollte...
Sooooo, manchmal sieht man echt den Wald vor Bäumen nicht.
Man,man,man. Logisch, wenn man einen externen Pullup hat, braucht, bzw.
sollte, man nicht noch den internen einschalten. OMFG
Also, Programm funzt. Danke euch, besonderst Thomas, dass ihr euch mit
mir den Kopf zerbrochen habt.