Hi Robert,
- Robert treboriks@web.de wrote:
Die Frage ist nun, wie kriege ich dieses Script in den Atmel? Ich dachte, mit "gcc static_scripts.c" (bzw. avr-gcc ...) könnte ich es einfach kompilieren.
Das ist richtig, allerdings kann der Atmel nur mit dem Farbscript alleine nicht viel anfangen, es fehlt der Rest der Firmware. Damit alles korrekt kompiliert und zusammengelinkt wird, gibt es fuer das Programm 'make' ein Script, 'Makefile', was bei meiner Firmware auch dabeiliegt. Du musst also nur noch 'make' im Verzeichnis der Firmware aufrufen, und das Programm erledigt den Rest.
Das Kompilieren und Linken ist kein so ganz einfacher Prozess, wenn das Programm, was am Ende rauskommen soll, in mehrere C-Dateien unterteilt ist, deshalb laesst man das besser ein Programm tun ;)
Raus kommt dann eine Datei namens 'fnordlicht.hex', die muesstest du auf den Atmel flashen, zum Beispiel ueber die serielle Schnittstelle (und einen Pegelkonverter, hast du einen?).
Probier mal, die .hex-Datei zu erzeugen, dann schauen wir weiter.
Gruss,
- fd0
Man, schnelle Antwort, das nenn ich mal Service. ;)
Pegelkonverter hab ich. Mit 'make' wird die fnordlicht.hex zwar erstellt, dabei bekomm ich allerdings folgende Meldung:
$ make avr-objcopy --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex -j .eeprom fnordlicht fnordlicht.eep.hex avr-objcopy: there are no sections to be copied! avr-objcopy: --change-section-lma .eeprom=0x0000000000000000 nie benutzt make: *** [fnordlicht.eep.hex] Fehler 1
Cioa treb _____________________________________________________________________ Der WEB.DE SmartSurfer hilft bis zu 70% Ihrer Onlinekosten zu sparen! http://smartsurfer.web.de/?mc=100071&distributionid=000000000066
* Robert treboriks@web.de wrote:
Pegelkonverter hab ich. Mit 'make' wird die fnordlicht.hex zwar erstellt, dabei bekomm ich allerdings folgende Meldung:
$ make avr-objcopy --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex -j .eeprom fnordlicht fnordlicht.eep.hex avr-objcopy: there are no sections to be copied! avr-objcopy: --change-section-lma .eeprom=0x0000000000000000 nie benutzt make: *** [fnordlicht.eep.hex] Fehler 1
Diese Meldung ist eigentlich nicht relevant, es gibt keine Inhalt, den du in den EEPROM kopieren moechtest, deshalb meckert avr-objcopy (manche Versionen tun das und melden einen Fehler, manchen ist es egal...). Du kannst entweder die Meldung einfach ignorieren, oder aber auch die Datei 'Makefile' editieren und die Zeile
all: $(TARGET).hex $(TARGET).eep.hex $(TARGET).lss
durch
all: $(TARGET).hex $(TARGET).lss
ersetzen, dann wird die EEPROM-Hexdatei garnicht erst erzeugt.
Um das fnordlicht jetzt zu flashen musst du den Bootloader starten. Das geht am einfachsten, indem du den Jumper auf dem fnordlicht umsetzt, so dass die beiden Pins die am naechsten am Mikrocontroller sind verbunden sind.
Dann startest du das fnordlicht (es duerfte keine Farben mehr machen, jetzt) und probierst, ob avrdude mit dem Bootloader reden kann. Dazu ist im Makefile auch alles definiert, du musst das nur auf deine lokale Konfiguration anpassen, dazu editierst du die Datei 'config.mk' (gibts eventuell noch nicht, einfach erstellen dann) und schreibst die Zeile
SERIAL_DEV=/dev/ttyUSB0
rein, wobei du das /dev/ttyUSB0 durch dein serielles Device ersetzt, an dem der Pegelkonverter haengt. Bei dem muss uebrigens die gruene LED leuchten, und der Jumper die Pins 1 und 2 verbinden, also die beiden die naeher an der seriellen Buchse sind.
Wenn du das alles gemacht hast, gib mal 'make install' ein, dann sollte dir avrdude die Datei fnordlicht.hex aufspielen. Danach trennst du das fnordlicht vom Strom, setzt den Jumper zurueck, und haengst es wieder dran, und schaust mal, was passiert :)
Gruss, - fd0
Alexander Neumann schrieb:
Um das fnordlicht jetzt zu flashen musst du den Bootloader starten. Das geht am einfachsten, indem du den Jumper auf dem fnordlicht umsetzt, so dass die beiden Pins die am naechsten am Mikrocontroller sind verbunden sind.
Dann startest du das fnordlicht (es duerfte keine Farben mehr machen, jetzt) und probierst, ob avrdude mit dem Bootloader reden kann. Dazu ist im Makefile auch alles definiert, du musst das nur auf deine lokale Konfiguration anpassen, dazu editierst du die Datei 'config.mk' (gibts eventuell noch nicht, einfach erstellen dann) und schreibst die Zeile
SERIAL_DEV=/dev/ttyUSB0
rein, wobei du das /dev/ttyUSB0 durch dein serielles Device ersetzt, an dem der Pegelkonverter haengt. Bei dem muss uebrigens die gruene LED leuchten, und der Jumper die Pins 1 und 2 verbinden, also die beiden die naeher an der seriellen Buchse sind.
Wenn du das alles gemacht hast, gib mal 'make install' ein, dann sollte dir avrdude die Datei fnordlicht.hex aufspielen. Danach trennst du das fnordlicht vom Strom, setzt den Jumper zurueck, und haengst es wieder dran, und schaust mal, was passiert :)
Gruss,
- fd0
Danke für deine Geduld, aber irgdendwas mach ich wohl noch falsch. Es gibt leider keine Veränderung. :(
Mein Testscript sieht so aus:
static const uint8_t colorchange_red[] PROGMEM = { MACRO_FADE_CHANNEL(CHANNEL_RED, 255, 0x200), MACRO_FADE_CHANNEL(CHANNEL_GREEN, 20, 0x040), MACRO_FADE_CHANNEL(CHANNEL_BLUE, 255, 0x040), MACRO_WAIT(_BV(CHANNEL_RED)|_BV(CHANNEL_GREEN)|_BV(CHANNEL_BLUE)), MACRO_FADE_CHANNEL(CHANNEL_RED, 0, 0x100), MACRO_FADE_CHANNEL(CHANNEL_GREEN, 100, 0x220), MACRO_FADE_CHANNEL(CHANNEL_BLUE, 0, 0x140), MACRO_WAIT(_BV(CHANNEL_RED)|_BV(CHANNEL_GREEN)|_BV(CHANNEL_BLUE)), MACRO_FADE_CHANNEL(CHANNEL_RED, 0, 0x100), MACRO_FADE_CHANNEL(CHANNEL_GREEN, 0, 0x220), MACRO_FADE_CHANNEL(CHANNEL_BLUE, 0, 0x140), MACRO_JUMP(-11) };
'make' erzeugt die fnordlicht.hex und 'make install' sagt:
$ make install launch-bootloader /dev/ttyUSB0 19200 Opening serial device /dev/ttyUSB0. Sending bootloader entry command (p). You may now plug in the target device. Bootloader running. avrdude -p m8 -b 19200 -u -F -c avr109 -P /dev/ttyUSB0 -U flash:w:fnordlicht.hex
Connecting to programmer: . Found programmer: Id = "FDL v02"; type = S Software Version = 0.2; No Hardware Version given. Programmer supports auto addr increment. Programmer supports buffered memory access with buffersize=64 bytes.
Programmer supports the following devices: Device code: 0x76
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.02s
avrdude: Device signature = 0x1e9307 avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed To disable this feature, specify the -D option. avrdude: erasing chip avrdude: reading input file "fnordlicht.hex" avrdude: input file fnordlicht.hex auto detected as Intel Hex avrdude: writing flash (4282 bytes):
Writing | ################################################## | 100% 3.22s
avrdude: 4282 bytes of flash written avrdude: verifying flash memory against fnordlicht.hex: avrdude: load data flash data from input file fnordlicht.hex: avrdude: input file fnordlicht.hex auto detected as Intel Hex avrdude: input file fnordlicht.hex contains 4282 bytes avrdude: reading on-chip flash data:
Reading | ################################################## | 100% 2.69s
avrdude: verifying ... avrdude: 4282 bytes of flash verified
avrdude done. Thank you.
Wenn ich aber alles zurückstecke, läuft wieder nur das Demoscript wie im Auslieferungszustand ab.
Ciao treb
Hallo,
* Robert treboriks@web.de wrote:
Danke für deine Geduld, aber irgdendwas mach ich wohl noch falsch. Es gibt leider keine Veränderung. :(
Mein Testscript sieht so aus:
Das sieht eigentlich gut aus. Mach das ganze nochmal, aber ruf vorher noch ein "make clean" auf und probiers nochmal.
Gruss, - fd0
Alexander Neumann schrieb:
Hallo,
- Robert treboriks@web.de wrote:
Danke für deine Geduld, aber irgdendwas mach ich wohl noch falsch. Es gibt leider keine Veränderung. :(
Mein Testscript sieht so aus:
Das sieht eigentlich gut aus. Mach das ganze nochmal, aber ruf vorher noch ein "make clean" auf und probiers nochmal.
Gruss,
- fd0
Perfekt! Das macht die Sache natürlich um einiges einfacher. ;) Jetzt kann ich erstmal rumprobieren und mir ne schicke Lichtshow zusammen basteln.
1.000-Dank für die Unterstützung!
Ciao, treb
Robert wrote:
Alexander Neumann schrieb:
[make clean empfohlen]
[make clean hat geholfen] 1.000-Dank für die Unterstützung!
Hallo Robert!
Es waere schoen, wenn du deine Erfahrungen mit den statischen Skripten ins Wiki schreiben koenntest; da ist die Doku zur Zeit noch etwas mau.
Viele Gruesse und viel Spass,
Sebastian
Sebastian Richter schrieb:
Robert wrote:
Alexander Neumann schrieb:
[make clean empfohlen]
[make clean hat geholfen] 1.000-Dank für die Unterstützung!
Hallo Robert!
Es waere schoen, wenn du deine Erfahrungen mit den statischen Skripten ins Wiki schreiben koenntest; da ist die Doku zur Zeit noch etwas mau.
Viele Gruesse und viel Spass,
Sebastian
Hi,
klar, wenn ich alle meine Schritte wieder zusammen kriege, werd ich gern was schreiben. Die nächsten 2 Wochen bin ich aber leider nicht zu Hause und ohne Rechner, so dass ich nicht mal mit dem fnordlicht experimentieren kann. Wie's halt so is, kaum hat man ein neues Spielzeug, wirds einem schon wieder weggenommen. ;)
Ich kann aber auf jeden Fall sagen: für so ein cooles Teil, ist es gar nicht so schwer zu basteln. Schließlich hab ich keine große Ahnung von Elektronik und Programmieren, trotzdem hatte bis auf die kleinen Startschwierigkeiten alles super geklappt. Und es macht auf jeden Fall Lust auf mehr!!
Ciao, treb
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1
Robert schrieb:
Alexander Neumann schrieb:
Wenn du das alles gemacht hast, gib mal 'make install' ein, dann sollte dir avrdude die Datei fnordlicht.hex aufspielen. Danach trennst du das fnordlicht vom Strom, setzt den Jumper zurueck, und haengst es wieder dran, und schaust mal, was passiert :)
Gruss,
- fd0
Danke für deine Geduld, aber irgdendwas mach ich wohl noch falsch. Es gibt leider keine Veränderung. :(
Ciao treb
Ha, nun funktionierts doch. Ich hab meinen Ordner mit der firmware gelöscht und nochmal neu entpackt, das Script geändert und 'make' ausgeführt.
Dabei bekomme ich jetzt einiges mehr an Meldung:
$ make avr-gcc -DRS485_ADDRESS=0x01 -g -Os -finline-limit=800 -mmcu=atmega8 - -DF_CPU=16000000UL -std=gnu99 -c -o fnordlicht.o fnordlicht.c In file included from fnordlicht.c:51: testscript.h:169: warning: large integer implicitly truncated to unsigned type avr-gcc -DRS485_ADDRESS=0x01 -g -Os -finline-limit=800 -mmcu=atmega8 - -DF_CPU=16000000UL -std=gnu99 -c -o fifo.o fifo.c fifo.c:32: warning: C99 inline functions are not supported; using GNU89 fifo.c:32: warning: to disable this warning use -fgnu89-inline or the gnu_inline function attribute fifo.c:41: warning: C99 inline functions are not supported; using GNU89 fifo.c:46: warning: C99 inline functions are not supported; using GNU89 fifo.c:54: warning: C99 inline functions are not supported; using GNU89 fifo.c:66: warning: C99 inline functions are not supported; using GNU89 fifo.c:77: warning: C99 inline functions are not supported; using GNU89 avr-gcc -DRS485_ADDRESS=0x01 -g -Os -finline-limit=800 -mmcu=atmega8 - -DF_CPU=16000000UL -std=gnu99 -c -o i2c.o i2c.c avr-gcc -DRS485_ADDRESS=0x01 -g -Os -finline-limit=800 -mmcu=atmega8 - -DF_CPU=16000000UL -std=gnu99 -c -o pwm.o pwm.c pwm.c:104: warning: C99 inline functions are not supported; using GNU89 pwm.c:104: warning: to disable this warning use -fgnu89-inline or the gnu_inline function attribute pwm.c:124: warning: C99 inline functions are not supported; using GNU89 avr-gcc -DRS485_ADDRESS=0x01 -g -Os -finline-limit=800 -mmcu=atmega8 - -DF_CPU=16000000UL -std=gnu99 -c -o rc5.o rc5.c avr-gcc -DRS485_ADDRESS=0x01 -g -Os -finline-limit=800 -mmcu=atmega8 - -DF_CPU=16000000UL -std=gnu99 -c -o static_scripts .o static_scripts.c avr-gcc -DRS485_ADDRESS=0x01 -g -Os -finline-limit=800 -mmcu=atmega8 - -DF_CPU=16000000UL -std=gnu99 -c -o uart.o uart.c uart.c:46: warning: C99 inline functions are not supported; using GNU89 uart.c:46: warning: to disable this warning use -fgnu89-inline or the gnu_inline function attribute uart.c:56: warning: C99 inline functions are not supported; using GNU89 avr-gcc -L/usr/local/avr/avr/lib -mmcu=atmega8 fnordlicht.o fifo.o i2c.o pwm.o rc5.o static_scripts.o uart.o -o fnordl icht avr-objcopy -O ihex -R .eeprom fnordlicht fnordlicht.hex avr-objcopy --set-section-flags=.eeprom="alloc,load" - --change-section-lma .eeprom=0 -O ihex -j .eeprom fnordlicht fnordli cht.eep.hex avr-objcopy: there are no sections to be copied! avr-objcopy: --change-section-lma .eeprom=0x0000000000000000 nie benutzt make: *** [fnordlicht.eep.hex] Fehler 1
Aber das neue Script läuft! :))
Wenn ich dann aber ein neues Script draufspielen will, muss ich immer erst den firmware-Ordner löschen und neu entpacken. Wenn ich das Script nur ändere und 'Make' ausführe erscheint u.a.:
avr-objcopy: there are no sections to be copied!
Aber das ist erstmal ein zu vernachlässigendes Problem.
Danke für die schnelle Hilfe!
Ciao, treb
Hi Robert,
* Robert treboriks@web.de wrote:
Dabei bekomme ich jetzt einiges mehr an Meldung: [...] avr-gcc -DRS485_ADDRESS=0x01 -g -Os -finline-limit=800 -mmcu=atmega8
- -DF_CPU=16000000UL -std=gnu99 -c -o fifo.o fifo.c
fifo.c:32: warning: C99 inline functions are not supported; using GNU89 fifo.c:32: warning: to disable this warning use -fgnu89-inline or the gnu_inline function attribute fifo.c:41: warning: C99 inline functions are not supported; using GNU89 fifo.c:46: warning: C99 inline functions are not supported; using GNU89 fifo.c:54: warning: C99 inline functions are not supported; using GNU89 fifo.c:66: warning: C99 inline functions are not supported; using GNU89 fifo.c:77: warning: C99 inline functions are not supported; using GNU89
Das ist etwas komisch, weil er sich ueber einen alten Standard beschwert, obwohl mit "-std=gnu99" ein neuer C-Standard festgelegt wurde. Welche Version vom avr-gcc setzt du ein? Wo kommt die her?
Aber das neue Script läuft! :))
Schick :) Viel Spass damit!
Gruss, - fd0
Alexander Neumann schrieb:
Hi Robert,
Das ist etwas komisch, weil er sich ueber einen alten Standard beschwert, obwohl mit "-std=gnu99" ein neuer C-Standard festgelegt wurde. Welche Version vom avr-gcc setzt du ein? Wo kommt die her?
Hi,
laut Paketverwaltung is die Version 1:4.2.1-1 (und da auch die aktuellste). Gefunden hab ich sie auf den Ubuntu-Seiten (http://packages.ubuntu.com/gutsy/gcc-avr).
Ciao, treb
* Alexander Neumann fd0@lochraster.org [08-02-24 20:10]:
Hi Robert,
- Robert treboriks@web.de wrote:
Dabei bekomme ich jetzt einiges mehr an Meldung: [...] avr-gcc -DRS485_ADDRESS=0x01 -g -Os -finline-limit=800 -mmcu=atmega8
- -DF_CPU=16000000UL -std=gnu99 -c -o fifo.o fifo.c
fifo.c:32: warning: C99 inline functions are not supported; using GNU89 fifo.c:32: warning: to disable this warning use -fgnu89-inline or the gnu_inline function attribute fifo.c:41: warning: C99 inline functions are not supported; using GNU89 fifo.c:46: warning: C99 inline functions are not supported; using GNU89 fifo.c:54: warning: C99 inline functions are not supported; using GNU89 fifo.c:66: warning: C99 inline functions are not supported; using GNU89 fifo.c:77: warning: C99 inline functions are not supported; using GNU89
Das ist etwas komisch, weil er sich ueber einen alten Standard beschwert, obwohl mit "-std=gnu99" ein neuer C-Standard festgelegt wurde. Welche Version vom avr-gcc setzt du ein? Wo kommt die her?
Eine neue, vermutlich. Die Warnung ist erst in neueren GCC-Versionen drin. Aus der Doku:
| `-fgnu89-inline' | The option `-fgnu89-inline' tells GCC to use the traditional GNU | semantics for `inline' functions when in C99 mode. *Note An | Inline Function is As Fast As a Macro: Inline. Using this option | is roughly equivalent to adding the `gnu_inline' function | attribute to all inline functions (*note Function Attributes::). | | This option is accepted by GCC versions 4.1.3 and up. In GCC | versions prior to 4.3, C99 inline semantics are not supported, and | thus this option is effectively assumed to be present regardless | of whether or not it is specified; the only effect of specifying | it explicitly is to disable warnings about using inline functions | in C99 mode. Likewise, the option `-fno-gnu89-inline' is not | supported in versions of GCC before 4.3. It will be supported | only in C99 or gnu99 mode, not in C89 or gnu89 mode.
Also, einfach -fgnu89-inline zu den CFLAGS hinzufügen, um die Warnung loszuwerden.