Forum: Mikrocontroller und Digitale Elektronik erste Schritte und Bauchklatscher


von Anfänger (Gast)


Lesenswert?

Hallo,

ich hab mal was in Assembler zusammengetackert und komme mit dem Syntax
noch nicht wirklich gut zurecht.


;I/O ports
  ldi  temp, 0xFF
  out  LEDSegmentPort-1, temp ;DDRx
  .if ( LEDCommonInvert )
    ldi  temp, 1<<LEDOuterLeft | 1<<LEDInnerLeft | 1<<LEDInnerRight | 
1<<LEDOuterRight
  .elif
    ldi  temp, 0x00
  .endif
  out  LEDCommonPort-1, temp ;DDRx


Als Fehler kommt:

error: syntax error, unexpected '\n'

und zeigt auf die Zeile .elif


Was mache ich falsch und wieso?

von Tom (Gast)


Lesenswert?

Falscher Editor?

von Peter II (Gast)


Lesenswert?

Anfänger schrieb:
> Was mache ich falsch und wieso?

du hast nicht gesagt was du für einem assembler nutzt. Sieht mir zwar 
ein wenig nach Atmel aus aber dort gibt es kein .if (zumindest kenn ich 
es dort nicht)

von MaWin (Gast)


Lesenswert?

Bei .elif sollte noch eine Bindingung folgen,
du wolltest wohl .else schreiben

von Anfänger (Gast)


Lesenswert?

Hallo,

es ist der AVR Assembler und ich will für einen ATtiny3213 schreiben.

die Anwiesungen habe ich im Netz gefunden:

Assemblerdirektiven
.BYTE x    : reserviert x Bytes im Datensegment (siehe auch .DSEG)
.CSEG      : compiliert in das Code-Segment
.DB x,y,z  : Byte(s), Zeichen oder Zeichenketten einfügen (in .CSEG, 
.ESEG)
.DEF x=y   : dem Symbol x ein Register y zuweisen
.DEVICE x  : die Syntax-Prüfung für den AVR-Typ x durchführen 
(inHeaderdatei enthalten)
.DSEG      : Datensegment, nur Marken und .BYTE zulässig
.DW x,y,z  : Datenworte einfügen (.CSEG, .ESEG)
.ELIF x    : .ELSE mit zusätzlicher Bedingung x
.ELSE      : Alternativcode, wenn .IF nicht zutreffend war
.ENDIF     : schließt .IF bzw. .ELSE ab
.EQU x=y   : dem Symbol x einen festen Wert y zuweisen
.ERROR x   : erzwungener Fehler mit Fehlertext x
.ESEG     : compiliert in das EEPROM-Segment
.EXIT  : Beendet die Compilation
.IF x      : compiliert den folgenden Code, wenn Bedingung x erfüllt ist
.IFDEF x   : compiliert den Code, wenn Variable x definiert ist
.IFNDEF x  : compiliert den Code, wenn Variable x undefiniert ist
.INCLUDE x : fügt Datei "Name/Pfad" x in den Quellcode ein
.MESSAGE x : gibt die Meldung x aus
.LIST      : Schaltet die Ausgabe der List-Datei ein
.LISTMAC   : Schaltet die vollständige Ausgabe von Makrocode ein
.MACRO x   : Definition des Makros mit dem Namen x
.ENDMACRO  : Beendet die Makrodefinition (siehe auch .ENDM)
.ENDM      : Beendet die Makrodefinition (siehe auch .ENMACRO)
.NOLIST    : Schaltet die Ausgabe der List-Datei aus
.ORG x     : Setzt den CSEG-/ESEG-/DSEG-Zähler auf den Wert x
.SET x=y   : Dem Symbol x wird ein variabler Wert y zugewiesen

von spess53 (Gast)


Lesenswert?

Hi

>du hast nicht gesagt was du für einem assembler nutzt. Sieht mir zwar
>ein wenig nach Atmel aus aber dort gibt es kein .if (zumindest kenn ich
>es dort nicht)

Du würdest dich wundern, was der/die AVR-Assembler alles können. Auch 
.if.

.elif verlangt eine Bedingung:

Syntax:
.ELIF<expression>

Für eine Alternative musst du .else benutzen.

MfDG Spess

von Sam .. (sam1994)


Lesenswert?

Anfänger schrieb:
> es ist der AVR Assembler und ich will für einen ATtiny3213 schreiben.
eher 2313
> die Anwiesungen habe ich im Netz gefunden:
>
> Assemblerdirektiven
Das sind eher Preprocessor-Direktiven

Assember selbst ist mov, ldi, in, brne, rjmp...
Kann ich trotzdem nicht.

elif heißt else if und bei if sollte eine Bedingung hin

von Joachim .. (zinnkruemel)


Lesenswert?

>alles und weil du null Ahnung hast.

Liebe Admins,
warum ist eigentlich posten ohne Anmeldung erlaubt? Wäre schön wenn man 
einem solchen unterbelichteten Burschen wie der der og. Zeile schrieb 
einfach den Zugang verweigert.

von Hans M. (Firma: mayer) (oe1smc) Benutzerseite


Lesenswert?

> warum ist eigentlich posten ohne Anmeldung erlaubt?

das sehe ich auch so. ein anmeldung sollte notwendig sein.
das forum leidet durch solche zwischenrufer nur. was es dem einen durch 
unkompliziertes antworten - weil keine anmeldung notwendig - erleichtern 
sollte, vermiest durch solche meldungen 10 andere, hier wieder vorbei zu 
schauen.

gruss
hans

von Oliver J. (skriptkiddy)


Lesenswert?

Lasst uns mal nen neuen Fred aufmachen und das ausführlich diskutieren.

von spess53 (Gast)


Lesenswert?

Hi

>warum ist eigentlich posten ohne Anmeldung erlaubt?

Das Forum lebt davon. Die reglemenierten Foren sind einfach nur öde.

MfG Spess

von Kai S. (zigzeg)


Lesenswert?

Samuel K. schrieb:
>> Assemblerdirektiven
> Das sind eher Preprocessor-Direktiven

Man nennt diese Anweisungen in der Tat Assembler Direktiven, z.B. siehe:

http://sources.redhat.com/binutils/docs-2.12/as.info/Pseudo-Ops.html#Pseudo%20Ops

Auch wenn einige der Direktiven durch eine Art Präprozessor 
implementiert werden könnten, so habe andere Seiteneffekte, die nicht 
z.B. Textersetzung realisiert werden können. So z.B. können Symbole 
definiert oder mit Attributen versehen werden. Oder es werden 
Daten-Bytes oder -Worte in ein Segment geschrieben.

von Oliver J. (skriptkiddy)


Lesenswert?

spess53 schrieb:
> Das Forum lebt davon. Die reglemenierten Foren sind einfach nur öde.
>
> MfG Spess

Du bist ein Musterbeispiel dafür, wie der Umgang mit der freien 
Postfunktion sein sollte. Leider sieht man ständig, wie sich Leute 
extrem daneben benehmen und die sind zum großen Teil nicht angemeldet.
Deshalb bin ich eindeutig dafür das dicht zu machen. Damit könnte man, 
denke ich, außerdem die mittlere Qualität der Beiträge erhöhen.

Gruß Skriptkiddy

von nocheingast (Gast)


Lesenswert?

Bin auch blutiger Anfänger, habe aber ein Paar Ideen:

1. Wie weiter oben schon geschrieben, hinter .ELIF fehlt die Bedingung. 
Daher kommt die neue Zeile ( /n ) unerwartet. 
http://de.wikipedia.org/wiki/Escape-Sequenz

2. Die ".XXX" "Befehle sind nur für den Compiler. Diese Befehle versteht 
der Controller nicht. Sie werden jedoch während des Compilierens 
ausgewertet. Diese werden nicht in Programmcode umgesetzt, sondern 
bestimmen nur was wie compilliert wird. Eine Abfrage

;Zuweisung am Programmanfang
.EQU Wert = 8 ; Taktfrequenz 8MHz
;Verzögerung
.IF Wert = 8
    Routine für Warte 100 Takte
.ELIF Wert = 16
    Routine für Warte 200 Takte
.ENDIF
;Pause vorbei
Routine für Jetzt wird wieder in die Hände gespuckt

bewirkt KEINE Abfrage im fertigen Programm. Beim Compilieren wird die 
Variable "Wert" abgefragt und dann NUR der Programmteil übersetzt, der 
die Bedingung erfüllt.
Im obrigen Bsp. weist Du "Wert" die Taktfrequenz des Prozessors zu. 
Damit kann der Quellcode entweder für einen Prozessor mit 8MHz oder 
16MHz Quarz übersetzt werden. Die (sehr kurze) Verzögerung bleibt damit 
bei beiden Versionen zeilich gleich - vorausgesetzt die angegebene 
Taktfrequenz stimmt mit der tatsächlichen überein, das kann der Compiler 
nicht erkennen, diese Vorgabe kommt von Dir. Der positive Nebeneffekt 
ist, es werden ein paar Byte im Flash gespart.

Die Assemblercodes die der Controller versteht findest du im 
dazugehörigen Datenblatt (Nicht jeder Controller innerhalb einer Familie 
hat die gleichen Befehle)

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.