Forum: Mikrocontroller und Digitale Elektronik hilfe für anfänger asm


von Adri D. (adri505)


Lesenswert?

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

von Komma (Gast)


Lesenswert?

Mnemonic Operand1 , Operand2
                  ^
                  |
                  |

von Spess53 (Gast)


Lesenswert?

Hi

ldi Temp1 11111011   -> ldi temp1,0b11111011

MfG Spess

von Adri D. (adri505)


Lesenswert?

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.

von Komma (Gast)


Lesenswert?

>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

von Frickler (Gast)


Lesenswert?

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.

von Adri D. (adri505)


Lesenswert?

Logisch wenn man mit der nase drauf gestupst wird,hab das irgenwie 
übersehen
im Tutorial.
Nochmal Danke super wie schnell hier einem geholfen wird.

von Spess53 (Gast)


Lesenswert?

Hi

>Deshalb:
>0x -->hex
>0b -->binär
>(nichts) -->dez
>??? --> oktal

 Octal (leading zero): 010, 077

MfG Spess

von Komma (Gast)


Lesenswert?

Ich war mir nicht sicher, Danke für die Info.

von Adri D. (adri505)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Spess53 (Gast)


Lesenswert?

Hi

>brne 1TASTE             ;wenn gleich springe zu 1TASTE ansonsten weiter

>1TASTE:

Labels müssen mit einem Buchstaben anfangen.

MfG Spess

von Adri D. (adri505)


Lesenswert?

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
Noch kein Account? Hier anmelden.