Hallo.
Habe grad mal n Progrämmchen geschrieben, welches sobald PA0 oder 1 High
ist (Welche über ein oder auf PD0 gehen) anfangen soll die Ausgänge
PD3-5 sowie PB0-2 je nachdem welcher von den beiden High ist hochzählen
soll.
Als ich nun fertig war (meine ich zumindest) wollte ich das mal testen,
bekomme aber die angegebene Fehlermeldung.
1
.include "tn2313def.inc" ; Definitionsdatei für den Prozessortyp einbinden
2
3
4
;Aus/Eingänge einstellen
5
ldi r16, 0x00 ; 0x00 in r16 laden
6
out DDRA, r16 ; Inhalt von r16 ins IO-Register DDRA ausgeben
7
ldi r16, 0x00 ; 0x00 in r16 laden
8
out PORTA, r16 ; Inhalt von r16 ins IO-Register PORTA ausgeben
9
10
ldi r16, 0b00111000 ; 0b11111100 in r16 laden
11
out DDRD, r16 ; Inhalt von r16 ins IO-Register DDRD ausgeben
12
ldi r16, 0x00 ; 0x00 in r16 laden
13
out PORTD, r16 ; Inhalt von r16 ins IO-Register PORTD ausgeben
14
15
ldi r16, 0b00000111 ; 0b00000111 in r16 laden
16
out DDRB, r16 ; Inhalt von r16 ins IO-Register DDRB ausgeben
17
ldi r16, 0x00 ; 0x00 in r16 laden
18
out PORTB, r16 ; Inhalt von r16 ins IO-Register PORTB ausgeben
19
20
21
loop:
22
23
24
sbis PIND, 0 ; Wenn Blinkersignal anliegt nächsten Befehl überspringen
25
ldi r16 0x00 ; 0x00 in r16 schreiben
26
sbic PIND, 0 ; Wenn Blinkersignal nicht anliegt nächsten Schritt überspringen
27
rcall Blink1
28
sbrc r16, 7 ; Wenn r16 voll ist (0xFF) nächsten Schritt ausführen
29
ldi r16 0x00 ; r16 auf 0 setzen
30
rjmp loop
31
32
33
34
Blink1:
35
36
lsl r16 ; 1 in r16 einschieben
37
push r16 ; r16 in Stack laden
38
pop r17 ; In Stack geladenen Wert auf r17 schreiben
39
rol r17 ; drei Nullen von links in r17 einschieben
40
rol r17
41
rol r17
42
andi r17, 0b00111000
43
sbic PINA 0 ; Wenn PortA0 Low nächsten Schritt überspringen
44
out PORTD, r17 ; r17 ins Ausgangsregister PORTD laden
45
sbic PINA 1 ; Wenn PinA1 Low nächsten Schritt überspringen
46
out PORTB, r16 ; r17 ins Ausgangsregister PORTB laden
> bekomme aber die angegebene Fehlermeldung.
Copy&Paste der Fehlermeldung vergessen?
> rcall Blink1> ...> push r16 ; r16 in Stack laden> pop r17 ; In Stack geladenen Wert auf r17 schreiben> ...> ret
Crasht beim RET von Blink1, weil Stackpointer uninitialisiert ist.
Tipp: AVR-Tutorial zum Stack lesen.
> ldi r16, 0x00 ; 0x00 in r16 laden> out DDRA, r16 ; Inhalt von r16 ins IO-Register DDRA ausgeben> ldi r16, 0x00 ; 0x00 in r16 laden> out PORTA, r16 ; Inhalt von r16 ins IO-Register PORTA ausgeben
Diese Kommentare sind "wertlos". Das was die aussagen, sieht man in
Code. Besser du beschreibst, was der Code bewirken soll ala "active-high
Taster an PORTA als Eingang initialisieren"
> Habe grad mal n Progrämmchen geschrieben, welches sobald PA0 oder> 1 High ist (Welche über ein oder auf PD0 gehen) anfangen soll die> Ausgänge PD3-5 sowie PB0-2 je nachdem welcher von den beiden High> ist hochzählen soll.
Kannst du das auch in einem deutschen Satz wiedergeben?
AVR Neuling schrieb im Beitrag #2051021:
> Fehlermeldung:>> (25): error: syntax error, unexpected INTEGER
25 = Zeilennummer?
Ist das diese Zeile?
> ldi r16 0x00 ; 0x00 in r16 schreiben
Da fehlt ein Komma zwischen 1. und 2. Operanten. Später im Code fehlen
noch drei Kommata.
Zu Stefan:
Dachte mit rcall schreibt er es in den Stack sodass er bei ret die
Position wieder auslesen kann.
Zu kbuchegg:
Es gibt drei Eingänge: PA0, PA1 und PD0
PA0 und PA1 bekommen unabhängig vonneinander Ihre Signale (High, Low).
Diese Signale sind zudem über ein ODER Gatter auf PD0 geleitet.
Dieses Programm soll nun je nachdem welcher High ist (PA0 und/oder PA1)
die Ausgänge PD3-5 sowie PB0-2 nach und nach auf High setzen (z.B. PB
0b00000000, 0b00001000, 0b00011000, 0b00111000).
Komma! Es fehlten 4Kommas ^^ Fehler gefunden.
Ich werde aber wiederkommen sobald ich das nächste Problem habe ^^ ...
zumindest weiß ich das mit den Zeilen jetzt ^^
AVR Neuling schrieb im Beitrag #2051029:
> Dachte mit rcall schreibt er es in den Stack sodass er bei ret die> Position wieder auslesen kann.
Das würde der µC auch so machen, wenn ein Stackpointer initialisiert
wäre. Ist er aber nicht, weil der entsprechende Codeteil am Anfang
deines Programms nicht vorhanden ist. Im Tutorial steht wie dieser
Codeteil auszusehen hat.
nächste Problem: wie war der befehl um eine 1 von links nachzuschieben
z.B. 0b0000001 zu 0b00000011 zu machen?
(Versuch hier mal möglichst viele Infos zu bekommen um nicht so viel zu
Spämmen
> um eine 1 von links nachzuschieben> z.B. 0b0000001 zu 0b00000011 zu machen?
LINKS (Binärmuster) RECHTS
00000001 alt
00000011 neu
hm, jetzt überleg mal, wo links und wo rechts ist, und ob du von links
nach rechts oder von rechts nach links schieben möchtest ....
Hi
>nächste Problem: wie war der befehl um eine 1 von links nachzuschieben>z.B. 0b0000001 zu 0b00000011 zu machen?
Da gibt es keinen Befehl. Aber
sec
rol rxy
geht.
MfG Spess