mikrocontroller.net

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


Autor: Adri Dug (adri505)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Komma (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mnemonic Operand1 , Operand2
                  ^
                  |
                  |

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

ldi Temp1 11111011   -> ldi temp1,0b11111011

MfG Spess

Autor: Adri Dug (adri505)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Komma (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Frickler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Adri Dug (adri505)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

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

 Octal (leading zero): 010, 077

MfG Spess

Autor: Komma (Gast)
Datum:

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

Autor: Adri Dug (adri505)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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:
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:

  ....
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 TASTE_1            ;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

TASTE_1:
        sbis PORTD,6            ;schauen ob Beide LEDs an oder aus
 ....

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
        cp   Temp2, Temp3       ;Vergleiche Status
        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.

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

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

>1TASTE:

Labels müssen mit einem Buchstaben anfangen.

MfG Spess

Autor: Adri Dug (adri505)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.