Wie im Titel beschrieben, habe ich ein Problem dabei, die Include Datei für den Atmega328 zu finden. Ich habe eine Datei gefunden, die anscheinend für AVRStudio ist und die bei mir nur Fehler ausspuckt, das keine ; am Ende der Zeilen sind. Beitrag "m328def.inc Datei für den ATmega328 bzw. ATmega328P gesucht" Ich arbeite mit Linux und avr-asm
Ok, danke ich hab da zwar eine gefunden, ist aber die gleiche, die ich bereits habe. Mein Compiler meckert das die Zeilen nicht mit ; enden. (nicht alle aber die, die ohne ; enden da meckert er) mfg
avr-as nicht direkt aufrufen, sondern über das gcc-Frontend. Diesem den korrekten mcu-Parameter mitgeben. Im Code avr/io.h inkludieren.
.inc ist für assembler, du suchst vermutlich etwas andres. Du sichst eine headerdatei für den compiler? Welche sprache willst du benutzen?
atmega328 schrieb: > Keiner eine Idee? Wir rufst Du avr-as auf? Ich bin mir nicht sicher, ob man bei avr-as die controller-spezifischen Parameter einbinden muss. Versuche mal > avr-as -mmcu=atmega328 -o name.o name.s Verschiedene Assembler haben unterschiedliche Syntax. Die Syntax beim avr-as ist anders als beim Atmel Assembler. avra (unter Linux) benutzt eine ähnliche Syntax wie der Atmel Assembler.
Danke euch erstmal! @Stefan wie meinst du, das gcc frontend? Ich habe Assembler Code. @Flip Ich will Assembler Code assemblieren. @Alexander Ich rufe das ganze so auf
1 | avr-as -g -mmcu=atmega328p -o demo.o demo.asm |
2 | avr-ld -o demo.elf demo.o |
3 | avr-objcopy -O ihex -R .eeprom demo.elf demo.hex |
4 | avrdude -C /etc/avrdude.conf -p atmega328p -c arduino -P /dev/ttyACM0 -b 115200 -D -U flash:w:demo.hex:i |
PS: Es funktioniert ja auch, wenn ich die verwendeten Konstanten in der selben Datei definiere aber eine include Datei wäre schon toll um nicht jedes mal alle Ports etc neu zu definieren. Außerdem funktioniert (vermutlich deswegen) der Befehl .def nicht. mfg
atmega328 schrieb: > Stefan wie meinst du, das gcc frontend? Ich habe Assembler Code. GCC steht für GNU-Compiler-Collection und ist nicht auf C beschränkt. Benutze .S (großes S) als Extension, oder alternativ die Option "-x assembler-with-cpp", und dann ersetzt du avr-as durch avr-gcc. BTW: Den Linker will man eigentlich auch nicht direkt aufrufen. atmega328 schrieb: > aber eine include Datei wäre schon toll Und diese Inklude-Datei heißt <avr/io.h>.
oh ok, und wie kann ich avr/io.h dann in meinem Assemblercode einbinden?
Ich möchte aber Assembler lernen, C kann ich schon!
Bzw im Simulator kann ich Assembler auch schon, jetzt möchte ich es aber "in echt" probieren.
Stefan E. schrieb: > atmega328 schrieb: >> Stefan wie meinst du, das gcc frontend? Ich habe Assembler Code. Vielleicht sind diese Seiten hilfreich: http://www.nongnu.org/avr-libc/user-manual/index.html Speziell http://www.nongnu.org/avr-libc/user-manual/assembler.html "... For the purpose described in this document, the assembler and linker are usually not invoked manually, but rather using the C compiler frontend (avr-gcc) that in turn will call the assembler and linker as required. ..." http://www.nongnu.org/avr-libc/user-manual/group__demo__project.html
Ach egal, ich glaube ich kann einfach nicht erklären was ich meine. Ich frag mal anders: Wieso wird die include Datei in dem Code nicht gefunden und wieso funktioniert .def nicht?
1 | .nolist |
2 | .include "m328def.inc" |
3 | .list |
4 | |
5 | .def meinRegister = r16 |
6 | |
7 | RJMP main |
8 | |
9 | main: |
10 | LDI meinRegister, 0b11111111 |
11 | OUT DDRB, meinRegister |
12 | |
13 | loop: |
14 | LDI meinRegister, 0x00 |
15 | OUT PORTB, meinRegister |
16 | LDI meinRegister, 0xFF |
17 | OUT PORTB, meinRegister |
18 | |
19 | RJMP loop |
edit: wieso wird die include Datei nicht erkannt? liegt im selben Verzeichnis
Wenn ich das ganze so schreibe funktioniert es
1 | .equ RAMEND, 0x4FF ;Last On-Chip SRAM Location |
2 | .equ SREG, 0x3f ;liegt auf Adresse 3F |
3 | .equ SPL, 0x3d ;Stack Pointer Low Register |
4 | .equ SPH, 0x3e ;Stack Pointer High Register |
5 | .equ PORTB, 0x05 ;Port B Data Register |
6 | .equ DDRB, 0x04 ;Port B data direction register 1=output 0=input |
7 | .equ PINB, 0x03 ;Port B Input pins address |
8 | |
9 | RJMP main |
10 | |
11 | main: |
12 | LDI r16, 0b11111111 |
13 | OUT DDRB, r16 |
14 | |
15 | loop: |
16 | LDI r16, 0x00 |
17 | OUT PORTB, r16 |
18 | LDI r16, 0xFF |
19 | OUT PORTB, r16 |
20 | |
21 | RJMP loop |
@Stefan Tut mir leid, ich glaube jetzt versteh ich was du meinst. Der gcc Compiler bindet die Definitionen von selbst richtig ein, oder wie?
Hallo, bei mir unter Debian befindet sich ../avr/io.h unter * /usr/lib/avr/include/avr/io.h Oben in der Datei io.h wird beschrieben, wie das funktioniert: ... This header file includes the apropriate IO definitions for the device that has been specified by the <tt>-mmcu=</tt> compiler command-line switch. This is done by diverting to the appropriate file <tt><avr/io</tt><em>XXXX</em><tt>.h></tt> which should never be included directly. Some register names common to all AVR devices are defined directly within <tt><avr/common.h></tt>, which is included in <tt><avr/io.h></tt>, but most of the details come from the respective include file. ... * bei mir sind avr-libc und gcc-avr installiert.
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.