Hallo hab gerade mein erstes programm geschrieben und bekomme eine fehlermeldung im avrstudio.Ich kann leider nichts damit anfangen und wollt mal eure Hilfe in anspruch nehmen. FEHLERMELDUNG;; error: syntax error, unexpected INTEGER ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Erstes programm 1taster 2led schalten pollin board ; ;Attiny2313 Interner takt 1Mhz ; ;PD2 Taster High Aktiv ; ;PD5 LED1 High Aktiv ; ;PD6 LED2 High Aktiv ; ;mit jedem tasten druck led sequenz ändern ; ;1tes mal tasten LED 1 an ; ;2tes LED 2 an LED 1 aus ; ;3tes LED 1 + 2 an ; ;4tes Alle aus und wieder von vorne ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; .include "tn2313def.inc" .def Temp1 =r16 .def Temp2 =r17 .def Temp3 =r18 ldi Temp1 11111011 ;PortD pin7-3+1-0 ausgang ,pin2 eingang ; out DDRD Temp1 ; ldi Temp1 00000000 ;ausgänge auf 0 ,pullup abschalten ; out PORTD Temp1 ; ldi Temp2 00000000 ;register leer vorladen ldi Temp3 00000000 ;register leer vorladen TASTE: sbic PIND 2 ;PIN 2 PortD abfragen bei 0 schleife ansonsten weiter ;nächsten befehl überspringen rjmp TASTE ; sbic PORTD 5 ;LED 1 abfragen bei 0 springe ansonsten weiter ldi Temp2 10000000 ;Status LED1 laden in r17 sbic PORTD 6 ;LED 2 abfragen bei 0 springe ansonsten weiter ldi Temp3 10000000 ;Status LED2 laden in r18 cp Temp2 Temp3 ;Vergleiche Status brne 1TASTE ;wenn gleich springe zu 1TASTE ansonsten weiter sbic PORTD 5 ;LED1 abfragen bei 0 springe ; ldi Temp1 01000000 ;Lade r16 vor für LED1 aus LED2 an sbrs Temp1 6 ; ldi Temp1 01100000 ;Lade r16 vor für LED1+2 out PORTD Temp1 ;raus auf die pins rjmp TASTE ;züruck zum anfang 1TASTE: sbis PORTD 6 ;schauen ob Beide LEDs an oder aus ldi Temp1 00100000 sbic PORTD 6 ldi Temp1 00000000 out DDRD Temp1 rjmp TASTE FEHLERMELDUNG error: syntax error, unexpected INTEGER
Hui das ging ja schnell. ldi Temp1 11111011 -> ldi temp1,0b11111011 wofür steht jetzt nochmal 0b hinter dem komma temp1??? Tut mir leid wenn ich nochmal dumm fragen muss, dachte ich könnte die konstante einfach binär oder hex eingeben.
>dachte ich könnte die konstante einfach binär oder hex eingeben.
Oder dezimal oder oktal, nur muss der Assembler das ja irgendwie
unterscheiden.
Ist '10' jetzt 10 oder doch 16?
Deshalb:
0x -->hex
0b -->binär
(nichts) -->dez
??? --> oktal
Adri Dug schrieb: > dachte ich könnte die > konstante einfach binär oder hex eingeben Kannst Du auch, aber woher soll der Assembler wissen, ob 11 binär, oktal, hex oder dezimal ist? Wenn es binär sein soll, musst Du also 0b11 schreiben.
Logisch wenn man mit der nase drauf gestupst wird,hab das irgenwie übersehen im Tutorial. Nochmal Danke super wie schnell hier einem geholfen wird.
Hi >Deshalb: >0x -->hex >0b -->binär >(nichts) -->dez >??? --> oktal Octal (leading zero): 010, 077 MfG Spess
Nicht das ihr glaubt ich wäre zu Faul zum suchen ich finde den fehler nicht. Bin absoluter anfänger,programmier erfahrung 0 Fehlermeldung error: TASTE: Unknown instruction or macro error: syntax error, unexpected INTEGER ?????? Kann ich da mit rjmp nicht springen?sollte ich lieber mit einem unterprogramm arbeiten?? ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Erstes programm 1taster 2led schalten pollin board ; ;Attiny2313 Interner takt 1Mhz ; ;PD2 Taster High Aktiv ; ;PD5 LED1 High Aktiv ; ;PD6 LED2 High Aktiv ; ;mit jedem tasten druck led sequenz ändern ; ;1tes mal tasten LED 1 an ; ;2tes LED 2 an LED 1 aus ; ;3tes LED 1 + 2 an ; ;4tes Alle aus und wieder von vorne ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; .include "tn2313def.inc" .def Temp1 =r16 .def Temp2 =r17 .def Temp3 =r18 ldi Temp1,0b11111011 ;PortD pin7-3+1-0 ausgang ,pin2 eingang ; out DDRD,Temp1 ; ldi Temp1,0b00000000 ;ausgänge auf 0 ,pullup abschalten ; out PORTD,Temp1 ; ldi Temp2,0b00000000 ;register leer vorladen ldi Temp3,0b00000000 ;register leer vorladen TASTE: sbic PIND,2 ;PIN 2 PortD abfragen bei 0 schleife ansonsten weiter ;nächsten befehl überspringen rjmp TASTE ; sbic PORTD,5 ;LED 1 abfragen bei 0 springe ansonsten weiter ldi Temp2,0b10000000 ;Status LED1 laden in r17 sbic PORTD,6 ;LED 2 abfragen bei 0 springe ansonsten weiter ldi Temp3,0b10000000 ;Status LED2 laden in r18 cp Temp2,Temp3 ;Vergleiche Status brne 1TASTE ;wenn gleich springe zu 1TASTE ansonsten weiter sbic PORTD,5 ;LED1 abfragen bei 0 springe ; ldi Temp1,0b01000000 ;Lade r16 vor für LED1 aus LED2 an sbrs Temp1,6 ; ldi Temp1,0b01100000 ;Lade r16 vor für LED1+2 out PORTD,Temp1 ;raus auf die pins rjmp TASTE ;züruck zum anfang 1TASTE: sbis PORTD,6 ;schauen ob Beide LEDs an oder aus ldi Temp1,0b00100000 sbic PORTD,6 ldi Temp1,0b00000000 out DDRD,Temp1 rjmp TASTE
Labelnamen können nicht mit einer Ziffer anfangen. 1TASTE ist ein ungültiger Name. Und tu dir selbst einen Gefallen und fang gleich von vorne herein mit einer vernünftigen Codeformatierung an. Sieh deinen AssemblerCode so an, als ob er in 4 Teilen aufgebaut ist. Jede Zeile kann enthalten:
1 | ein Label eine Anweisung die Operanden zu der Anweisung Kommentar |
sinnvollerweise baut man seinen Code so auf, dass sich diese 4-er Struktur in Form von 'Spalten' im Source Code wiederfindet:
1 | .... |
2 | TASTE: |
3 | sbic PIND, 2 ;PIN 2 PortD abfragen bei 0 schleife ansonsten weiter |
4 | ;nächsten befehl überspringen |
5 | rjmp TASTE ; |
6 | |
7 | sbic PORTD, 5 ;LED 1 abfragen bei 0 springe ansonsten weiter |
8 | ldi Temp2, 0b10000000 ;Status LED1 laden in r17 |
9 | sbic PORTD, 6 ;LED 2 abfragen bei 0 springe ansonsten weiter |
10 | ldi Temp3, 0b10000000 ;Status LED2 laden in r18 |
11 | |
12 | cp Temp2, Temp3 ;Vergleiche Status |
13 | brne TASTE_1 ;wenn gleich springe zu 1TASTE ansonsten weiter |
14 | |
15 | sbic PORTD, 5 ;LED1 abfragen bei 0 springe |
16 | ldi Temp1, 0b01000000 ;Lade r16 vor für LED1 aus LED2 an |
17 | |
18 | sbrs Temp1, 6 ; |
19 | ldi Temp1, 0b01100000 ;Lade r16 vor für LED1+2 |
20 | |
21 | out PORTD, Temp1 ;raus auf die pins |
22 | |
23 | rjmp TASTE ;züruck zum anfang |
24 | |
25 | TASTE_1: |
26 | sbis PORTD,6 ;schauen ob Beide LEDs an oder aus |
27 | .... |
dann stehen die Labels frei und man muss beim analysieren vom Code weniger suchen, wo denn jetzt das Label steht und wo daher hingesprungen wird. Dafür kannst du dir die Leerzeile nach jeder Anweisung sparen. Das bringt dir nichts. Leerzeilen macht man um den Code zu gruppieren, ihn in logische Abschnitte zu unterteilen und diese Abschnitte auch optisch sichtbar zu machen. So ähnlich wie man in geschriebenem Text zwischen logischen Blöcken einen Absatz macht um anzudeuten, dass ein Handlungsabluaf hier fertig ist und ein neuer beginnt. Wenn du prinzipiell nach jeder Anweisung eine Leerzeile machst, dann führst du dieses Prinzip ad absurdum und du machst dir nur Arbeit für nichts. Sieh dir einfach mal etwas genauer an, was du seit Kindesbeinen alles machst, wenn du normalen Text schreibst. Und diese Prinzipien wendest du dann auch auf deinen Code an, soweit es geht. Dein Gehirn ist seit Jahren darauf trainiert worden, mit welchen Mitteln es beim Textlesen und Verstehen unterstützt wird (Leerzeichen, optische Strukturen, ...). Nutze dieses Potential! Wenn du Kommentare schreibst, dann wiederhole nicht das, was sowieso schon im Code selber auch steht. Beschreibe in einem Kommentar das "Warum" und nicht das "Wie". Sieh dir zb diese Sequenz an
1 | cp Temp2, Temp3 ;Vergleiche Status |
2 | brne TASTE_1 ;wenn gleich springe zu 1TASTE ansonsten weiter |
Merkst du was? Der Kommentar beim brne wiederholt genau dasselbe was auch im Code steht. Nur mit einem Unterschied: Im Kommenatr steht das genaue Gegenteil dessen, was im Code steht! Was stimmt denn nun? Der Kommentar oder der Code? Daher: Im Kommentar nicht das beschreiben, was ohnehin schon im Code steht! In dieser Sequenz werden zwei Stati miteinander verglichen. Was sind das für Stati? Was bedeuten sie? Was bedeutet es, wenn sie nicht gleich sind? Warum heißen die Register Temp2 und Temp3 und nicht gleich StatusX? Jeder Kommentar, den du durch Verbesserungen im Code einsparen kannst (weil unnötig geworden) ist ein guter Kommentar. Denn im schlimmsten Fall passt der Kommentar nicht zum Code. Ein Kommentar der aber gar nicht dort steht (weil er nicht dort stehen muss, weil der Code selber schon alles erzählt), kann daher logischerweise auch nicht falsch sein.
Hi >brne 1TASTE ;wenn gleich springe zu 1TASTE ansonsten weiter >1TASTE: Labels müssen mit einem Buchstaben anfangen. MfG Spess
Hab noch viele logikfehler gemacht,hab mich dann im avrstudio mal am debugger ausgetobt.Programm läuft,wenn es auch praktisch nicht anwendbar ist. Danke für die hilfe.Hier nochmal der neue Code vieleicht hilfts nem anderen Neueinsteiger. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Erstes programm 1taster 2led schalten pollin board ; ;Attiny2313 Interner takt 1Mhz ; ;PD2 Taster High Aktiv ; ;PD5 LED1 High Aktiv ; ;PD6 LED2 High Aktiv ; ;mit jedem tasten druck led sequenz ändern ; ;1tes mal tasten LED 1 an ; ;2tes LED 2 an LED 1 aus ; ;3tes LED 1 + 2 an ; ;4tes Alle aus und wieder von vorne ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; .include "tn2313def.inc" .def Temp1 =r16 .def Status1 =r17 .def Status2 =r18 ldi Temp1,0b11111011 ;PortD pin7-3+1-0 ausgang ,pin2 eingang out DDRD,Temp1 ; ldi Temp1,0b00000000 ;ausgänge auf 0 ,pullup abschalten out PORTD,Temp1 ; TASTE: sbis PIND,2 ;Taster abfragen rjmp TASTE ; ldi Status1,0b00000000 ;Status Leds löschen ldi Status2,0b00000000 ; sbic PORTD,5 ;LED 1 abfragen und setzen ldi Status1,0b10000000 ; sbic PORTD,6 ;LED 2 abfragen und setzen ldi Status2,0b10000000 ; cp Status1,Status2 ;Vergleiche Status breq AlleLEDs ; sbic PORTD,5 ;LED1 abfragen ; rjmp LED1 rjmp LED2 LED1: ldi Temp1,0b01000000 ;LED2 einschalten out PORTD,Temp1 ; rjmp TASTE ; LED2: ldi Temp1,0b01100000 ;LED1 und 2 einschalten out PORTD,Temp1 ; rjmp TASTE ; AlleLEDs: sbic PORTD,5 ;schauen ob beide LEDs an oder aus ldi Temp1,0b00000000 sbis PORTD,5 rjmp LEDan out PORTD,Temp1 rjmp Taste LEDan: ldi Temp1,0b00100000 ;LED1 einschalten out PORTD,Temp1 rjmp Taste
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.