Hallo zusammen. Ich wollte von der Seite http://www.mikrocontroller.net/articles/AVR-Tutorial:_7-Segment-Anzeige das erste Assembler-Programm in Eclipse nutzen, um 7 Segment-Anzeigen aus zu probieren. Dazu habe ich in einer main.c mit AVR-GCC-Toolchain die 7-seg.sx includiert und danach jede Menge Fehler bekommen. Darum möchte ich nachfragen, wie ich in Eclipse Assembler-Code assemblieren kann? Über eure Hilfe würde ich mich sehr freuen, brauche mal einen funktionierenden Anfang. Gruß Frank
>Dazu habe ich in einer main.c mit AVR-GCC-Toolchain die 7-seg.sx >includiert und danach jede Menge Fehler bekommen. Hm. Ich sehe da im Tutorial gar keine Datei des Namens "7-seg.sx". Welche ist das und was steht darin? Was für Fehler erhälst Du?
Das erste Programm auf der Seite habe ich unter 7-seg.sx gespeichert. Der Inhalt:
1 | |
2 | .def zero = r1 |
3 | .def count = r16 |
4 | .def temp1 = r17 |
5 | |
6 | .org 0x0000 |
7 | rjmp main ; Reset Handler |
8 | ; |
9 | main: |
10 | ldi temp1, HIGH(RAMEND) |
11 | out SPH, temp1 |
12 | ldi temp1, LOW(RAMEND) ; Stackpointer initialisieren |
13 | out SPL, temp1 |
14 | |
15 | ; |
16 | ldi temp1, $FF ; die Anzeige hängt am Port D |
17 | out DDRD, temp1 ; alle Pins auf Ausgang |
18 | ; |
19 | ldi count, 0 ; und den Zähler initialisieren |
20 | mov zero, count |
21 | ; |
22 | loop: |
23 | ldi ZL, LOW(Codes*2) ; die Startadresse der Tabelle in den |
24 | ldi ZH, HIGH(Codes*2) ; Z-Pointer laden |
25 | |
26 | mov temp1, count ; die wortweise Adressierung der Tabelle |
27 | add temp1, count ; berücksichtigen |
28 | |
29 | add ZL, temp1 ; und ausgehend vom Tabellenanfang |
30 | adc ZH, zero ; die Adresse des Code Bytes berechnen |
31 | |
32 | lpm ; dieses Code Byte in das Register r0 laden |
33 | |
34 | out PORTD, r0 ; und an die Anzeige ausgeben |
35 | ; |
36 | inc count ; den Zähler erhöhen, wobei der Zähler |
37 | cpi count, 10 ; immer nur von 0 bis 9 zählen soll |
38 | brne wait |
39 | ldi count, 0 |
40 | ; |
41 | wait: ldi r17, 10 ; und etwas warten, damit die Ziffer auf |
42 | wait0: ldi r18, 0 ; der Anzeige auch lesbar ist, bevor die |
43 | wait1: ldi r19, 0 ; nächste Ziffer gezeigt wird |
44 | wait2: dec r19 |
45 | brne wait2 |
46 | dec r18 |
47 | brne wait1 |
48 | dec r17 |
49 | brne wait0 |
50 | ; |
51 | rjmp loop ; auf zur nächsten Ausgabe |
52 | ; |
53 | Codes: ; Die Codetabelle für die Ziffern 0 bis 9 |
54 | ; sie regelt, welche Segmente für eine bestimmte |
55 | ; Ziffer eingeschaltet werden müssen |
56 | ; |
57 | .db 0b11000000 ; 0: a, b, c, d, e, f |
58 | .db 0b11111001 ; 1: b, c |
59 | .db 0b10100100 ; 2: a, b, d, e, g |
60 | .db 0b10110000 ; 3: a, b, c, d, g |
61 | .db 0b10011001 ; 4: b, c, f, g |
62 | .db 0b10010010 ; 5: a, c, d, f, g |
63 | .db 0b10000010 ; 6: a, c, d, e, f, g |
64 | .db 0b11111000 ; 7: a, b, c |
65 | .db 0b10000000 ; 8: a, b, c, d, e, f, g |
66 | .db 0b10010000 ; 9: a, b, c, d, f, g |
Die Fehlermeldungen sind:
1 | make all |
2 | Building file: ../avr-sammlng-2.c |
3 | Invoking: AVR Compiler |
4 | avr-gcc -Wall -g2 -gstabs -O0 -fpack-struct -fshort-enums -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega32 -DF_CPU=4000000UL -MMD -MP -MF"avr-sammlng-2.d" -MT"avr-sammlng-2.d" -c -o "avr-sammlng-2.o" "../avr-sammlng-2.c" |
5 | In file included from ../avr-sammlng-2.c:7: |
6 | ../7-seg.sx:9: error: expected identifier or '(' before '.' token |
7 | ../7-seg.sx:14: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'Handler' |
8 | ../7-seg.sx:16: error: expected '=', ',', ';', 'asm' or '__attribute__' before ':' token |
9 | ../7-seg.sx:19: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'initialisieren' |
10 | ../7-seg.sx:23: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'temp1' |
11 | ../7-seg.sx:23: error: stray '$' in program |
12 | ../7-seg.sx:23: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'Anzeige' |
13 | ../7-seg.sx:23: error: stray '\303' in program |
14 | ../7-seg.sx:23: error: stray '\244' in program |
15 | ../7-seg.sx:24: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'Pins' |
16 | ../7-seg.sx:26: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'count' |
17 | ../7-seg.sx:26: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'den' |
18 | ../7-seg.sx:26: error: stray '\303' in program |
19 | ../7-seg.sx:26: error: stray '\244' in program |
20 | ../7-seg.sx:29: error: expected '=', ',', ';', 'asm' or '__attribute__' before ':' token |
21 | ../7-seg.sx:30: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'Startadresse' |
22 | ../7-seg.sx:31: error: expected '=', ',', ';', 'asm' or '__attribute__' before '-' token |
23 | ../7-seg.sx:33: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'wortweise' |
24 | ../7-seg.sx:34: error: stray '\303' in program |
25 | ../7-seg.sx:34: error: stray '\274' in program |
26 | ../7-seg.sx:34: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'cksichtigen' |
27 | ../7-seg.sx:36: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'ausgehend' |
28 | ../7-seg.sx:37: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'Adresse' |
29 | ../7-seg.sx:39: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'Code' |
30 | ../7-seg.sx:41: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'an' |
31 | ../7-seg.sx:43: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'count' |
32 | ../7-seg.sx:43: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'Z' |
33 | ../7-seg.sx:43: error: stray '\303' in program |
34 | ../7-seg.sx:43: error: stray '\244' in program |
35 | ../7-seg.sx:43: error: stray '\303' in program |
36 | ../7-seg.sx:43: error: stray '\266' in program |
37 | ../7-seg.sx:43: error: stray '\303' in program |
38 | ../7-seg.sx:43: error: stray '\244' in program |
39 | ../7-seg.sx:44: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'nur' |
40 | ../7-seg.sx:44: error: stray '\303' in program |
41 | ../7-seg.sx:44: error: stray '\244' in program |
42 | ../7-seg.sx:48: error: expected '=', ',', ';', 'asm' or '__attribute__' before ':' token |
43 | ../7-seg.sx:48: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'etwas' |
44 | ../7-seg.sx:49: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'Anzeige' |
45 | ../7-seg.sx:50: error: stray '\303' in program |
46 | ../7-seg.sx:50: error: stray '\244' in program |
47 | ../7-seg.sx:50: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'chste' |
48 | ../7-seg.sx:58: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'loop' |
49 | ../7-seg.sx:58: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'zur' |
50 | ../7-seg.sx:58: error: stray '\303' in program |
51 | ../7-seg.sx:58: error: stray '\244' in program |
52 | ../7-seg.sx:60: error: expected '=', ',', ';', 'asm' or '__attribute__' before ':' token |
53 | ../7-seg.sx:60: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'Codetabelle' |
54 | ../7-seg.sx:60: error: stray '\303' in program |
55 | ../7-seg.sx:60: error: stray '\274' in program |
56 | ../7-seg.sx:61: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'regelt' |
57 | ../7-seg.sx:61: error: stray '\303' in program |
58 | ../7-seg.sx:61: error: stray '\274' in program |
59 | ../7-seg.sx:62: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'eingeschaltet' |
60 | ../7-seg.sx:62: error: stray '\303' in program |
61 | ../7-seg.sx:62: error: stray '\274' in program |
62 | ../7-seg.sx:64: error: expected identifier or '(' before '.' token |
63 | In file included from ../avr-sammlng-2.c:7: |
64 | ../7-seg.sx:64:20: error: invalid suffix "b11000000" on integer constant |
65 | ../7-seg.sx:64: error: expected identifier or '(' before numeric constant |
66 | ../7-seg.sx:65:20: error: invalid suffix "b11111001" on integer constant |
67 | ../7-seg.sx:65: error: expected identifier or '(' before numeric constant |
68 | ../7-seg.sx:66:20: error: invalid suffix "b10100100" on integer constant |
69 | ../7-seg.sx:66: error: expected identifier or '(' before numeric constant |
70 | ../7-seg.sx:67:20: error: invalid suffix "b10110000" on integer constant |
71 | ../7-seg.sx:67: error: expected identifier or '(' before numeric constant |
72 | ../7-seg.sx:68:20: error: invalid suffix "b10011001" on integer constant |
73 | ../7-seg.sx:68: error: expected identifier or '(' before numeric constant |
74 | ../7-seg.sx:69:20: error: invalid suffix "b10010010" on integer constant |
75 | ../7-seg.sx:69: error: expected identifier or '(' before numeric constant |
76 | ../7-seg.sx:70:20: error: invalid suffix "b10000010" on integer constant |
77 | ../7-seg.sx:70: error: expected identifier or '(' before numeric constant |
78 | ../7-seg.sx:71:20: error: invalid suffix "b11111000" on integer constant |
79 | ../7-seg.sx:71: error: expected identifier or '(' before numeric constant |
80 | ../7-seg.sx:72:20: error: invalid suffix "b10000000" on integer constant |
81 | ../7-seg.sx:72: error: expected identifier or '(' before numeric constant |
82 | ../7-seg.sx:73:20: error: invalid suffix "b10010000" on integer constant |
83 | ../7-seg.sx:73: error: expected identifier or '(' before numeric constant |
84 | make: *** [avr-sammlng-2.o] Fehler 1 |
:
Bearbeitet durch User
Du versuchst ein Assemblerprogramm mit einem C-Compiler zu kompilieren.
Gewöhne Dir als Endung für eine Assemblerdatei am besten "asm" an.
gcc kompiliert alles, was es in einer .c-Datei findet, mit dem C-Compiler. Der versteht nunmal kein Assembler. Assemblercode gehört in eine eigene Datei mit der Endung .S (wichtig: großes S). Oliver
>Assemblercode gehört in eine eigene Datei mit der Endung .S (wichtig: >großes S). Ja. Richtig. Ob "asm" oder "S" oder sonstwas hängt von der Toolchain ab. Sorry.
Immerhin ist der AVR-Assembler schon mal angesprungen. Groß S bringt folgende Fehler:
1 | make all |
2 | Building file: ../7-seg.S |
3 | Invoking: AVR Assembler |
4 | avr-gcc -x assembler-with-cpp -g2 -gstabs -mmcu=atmega32 -MMD -MP -MF"7-seg.d" -MT"7-seg.d" -c -o "7-seg.o" "../7-seg.S" |
5 | ../7-seg.S: Assembler messages: |
6 | ../7-seg.S:9: Error: unknown pseudo-op: `.def' |
7 | ../7-seg.S:10: Error: unknown pseudo-op: `.def' |
8 | ../7-seg.S:11: Error: unknown pseudo-op: `.def' |
9 | ../7-seg.S:17: Error: constant value required |
10 | ../7-seg.S:17: Error: register number above 15 required |
11 | ../7-seg.S:17: Error: garbage at end of line |
12 | ../7-seg.S:18: Error: constant value required |
13 | ../7-seg.S:18: Error: constant value required |
14 | ../7-seg.S:19: Error: constant value required |
15 | ../7-seg.S:19: Error: register number above 15 required |
16 | ../7-seg.S:19: Error: garbage at end of line |
17 | ../7-seg.S:20: Error: constant value required |
18 | ../7-seg.S:20: Error: constant value required |
19 | ../7-seg.S:23: Error: constant value required |
20 | ../7-seg.S:23: Error: register number above 15 required |
21 | ../7-seg.S:23: Error: unknown opcode `ff' |
22 | ../7-seg.S:24: Error: constant value required |
23 | ../7-seg.S:24: Error: constant value required |
24 | ../7-seg.S:26: Error: constant value required |
25 | ../7-seg.S:26: Error: register number above 15 required |
26 | ../7-seg.S:27: Error: constant value required |
27 | ../7-seg.S:27: Error: constant value required |
28 | ../7-seg.S:30: Error: constant value required |
29 | ../7-seg.S:30: Error: register number above 15 required |
30 | ../7-seg.S:30: Error: garbage at end of line |
31 | ../7-seg.S:31: Error: constant value required |
32 | ../7-seg.S:31: Error: register number above 15 required |
33 | ../7-seg.S:31: Error: garbage at end of line |
34 | ../7-seg.S:33: Error: constant value required |
35 | ../7-seg.S:33: Error: constant value required |
36 | ../7-seg.S:34: Error: constant value required |
37 | ../7-seg.S:34: Error: constant value required |
38 | ../7-seg.S:36: Error: constant value required |
39 | ../7-seg.S:36: Error: constant value required |
40 | ../7-seg.S:37: Error: constant value required |
41 | ../7-seg.S:37: Error: constant value required |
42 | ../7-seg.S:41: Error: constant value required |
43 | ../7-seg.S:43: Error: constant value required |
44 | ../7-seg.S:44: Error: constant value required |
45 | ../7-seg.S:44: Error: register number above 15 required |
46 | ../7-seg.S:46: Error: constant value required |
47 | ../7-seg.S:46: Error: register number above 15 required |
48 | ../7-seg.S:64: Error: unknown pseudo-op: `.db' |
49 | ../7-seg.S:65: Error: unknown pseudo-op: `.db' |
50 | ../7-seg.S:66: Error: unknown pseudo-op: `.db' |
51 | ../7-seg.S:67: Error: unknown pseudo-op: `.db' |
52 | ../7-seg.S:68: Error: unknown pseudo-op: `.db' |
53 | ../7-seg.S:69: Error: unknown pseudo-op: `.db' |
54 | ../7-seg.S:70: Error: unknown pseudo-op: `.db' |
55 | ../7-seg.S:71: Error: unknown pseudo-op: `.db' |
56 | ../7-seg.S:72: Error: unknown pseudo-op: `.db' |
57 | ../7-seg.S:73: Error: unknown pseudo-op: `.db' |
58 | make: *** [7-seg.o] Fehler 1 |
Fehlt noch eine Definitionsdatei, oder was?
:
Bearbeitet durch User
Das Programn ist halt für den Atmel-Assembler geschrieben, nicht für den avr-as. Die unterscheiden sich etwas. Das kann mna allerdings umschreiben, wenn man undedingt will. Am einfachsten nimmst du alleredings AVR-Studio 4.19 unter Windows. Wenn du nicht unter Windows unterwegs bist, und auch nicht unter Wine, dann wäre avra der Assembler der Wahl. Allerdings musst du den dann selber in Eclipse integrieren, bzw. dir dafür makefiles schreiben. Oliver
Hi Oliver. Danke für deine Erläuterungen. avra hatte ich heute bei der Suche nach einer Lösung schon runter geladen. Da hätte ich aber wieder einen Editor oder eine kleinere Entwicklungsumgebung gebraucht und ich wollte eigentlich bei Eclipse auf Ubuntu bleiben, weil mir eh schon der Kopf raucht von den vielen Infos. Ist ja unglaublich komplex das Thema uc's programmieren. AVR-Studio läuft ja nicht unter Wine, soweit ich weiß. Ist es denn schwer, den AVR-Assembler in Eclipse zu integrieren bzw. könntest Du es kurz erläutern oder gibt es ein Tutorial dafür? Gruß Frank
:
Bearbeitet durch User
Frank Thie schrieb: > Ist ja unglaublich komplex das Thema uc's programmieren. Es wird aber auch nicht einfacher, wenn du die verschiedenen Progammiersprachen durcheinander wirfst. Was du hier gemacht hast, ist einem Kisuaheli-Japanisch Dolmetscher einen russischen Text vorzuwerfen. Das da nur japanischer Unsinn rauskommen kann (wenn überhaupt) sollte klar sein. Nur dass der Kisuaheli Dolmetscher sich eben lautstark darüber beschwert hat, dass der vorgelegte Text so gar nicht Kisuaheli ist.
Hallo Karl Heinz. Ich denke, es sind unterschiedliche Dialekte. Da ich ja avra habe, dann könnte ich doch Eclipse als Editor verwenden und dann die Datei mit avra assemblieren. Kommt dann die .hex Datei dabei raus? Und kennst du den Terminal-Befehl dafür? Ich will ja die Beispiele hier auf mikrocontroller.net auf jeden Fall nachvollziehen und brauche daher eine Lösung. Gruß Frank
Frank Thie schrieb: > Hallo Karl Heinz. > > Ich denke, es sind unterschiedliche Dialekte. Du denkst falsch. Zumindest so lange, so lange du versuchst ein Assembler Programm durch einen C-Compiler zu schleusen. Auf Assembler Ebene könnte man die Dialekte noch akzeptieren. Aber selbst dann: Ein Wiener wird sich schwer tun einen Vorarlberger zu verstehen. Selbst wenn beide im Prinzip Deutsch sprechen.
:
Bearbeitet durch User
Ich hatte versucht, das Beispielprogramm von microcontoller.net in Eclipse zum laufen zu bringen, wie aus dem Anfang ersichtlich. Das funktionierte erstmal nicht, weil die falsche Dateiendung für die includierte Datei gewählt wurde. Nachdem das dank Oliver korrigiert wurde, wurde der Assembler involviert und es stellte sich herraus, das ein anderer Dialekt benutzt wurde, so das immer noch Fehler gemeldet wurden. Um jetzt konstruktiv weiter zu verfahren, hatte ich Dir ein paar Fragen gestellt in der Hoffnung, das Du mir weiterhelfen könntest... Gruß Frank
:
Bearbeitet durch User
> Da ich ja avra habe, dann könnte ich doch Eclipse als Editor verwenden > und dann die Datei mit avra assemblieren. Du versuchst immer noch die Datei durch den avr-gcc C-Compiler zu schicken. >Ich will ja die Beispiele hier auf mikrocontroller.net auf jeden Fall > nachvollziehen und brauche daher eine Lösung. Warum nimmst du dann nicht die einfachste genannte Lösung und installierst AVR Studio 4.19? Als Anfänger schiesst du dir mit deiner Lösung nur ins Knie...
Du kannst beliebige Assembler unter eclipse nutzen, wenn du da ein makefile-Projekt anlegst, und dir selber passende makefiles erstellst. Eclipse ist damit nicht mehr als ein Editor. Das AVR-Plugin kannst du mit avra nicht benutzen. Solange du allerdings Projekte mit nur einem Sourcefile nutzt, assemblier das einfach von der Kommandozeile. Wie das geht, sollte in der avra-Doku stehen. Oliver
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.