Hallo zusammen, ich hoffe ich habe das richtige Forum für meinen Beitrag gewählt. Bin noch ziemlicher Newbie von daher hoffe ich ihr verzeiht mir evtl. meine dumme Frage. Nun zu meinem Problem: Habe bisher einige kleine Projekte mit Atmega328p auf linux mit geany programmiert. Funktioniert auch einwandfrei. Nun versuche ich auf Eclipse umzusteigen. So weit so gut. Auch kein größeres Problem. Dachte ich. Wenn ich meinen bisherigen Code mit Eclipse kompiliere und dann auch mit Eclipse auf den MC flashe erhalte ich bei meinen LCD ausgaben immer nur einen Buchstabensalat. Hin und wieder nach mehrmaligem Reset funktioniert die Anzeige dann doch. Aber nur manchmal. Und nur für kurze Zeit. Dann wieder Salat. Kompiliere ich hingegen jedoch wie bisher mit make also ohne IDE funktioniert die Bildschirmausgabe einwandfrei. Habe ich hier noch Einstellungsfehler in Eclipse oder woran könnte das liegen? Habe übrigens das neueste AVR Plugin und Kepler im Einsatz. Wäre super,wenn mir hier geholfen werden könnte. Für eure Mühe schon mal vielen Dank im Voraus Jörg
Schau doch mal die Compileruafrufe an, die Eclipse beim Compilieren ausgibt, und schau in die automatisch erzeugten makefiles. Oliver
Wow das ging aber schnell! Wie gesagt - ich bin ziemlicher Newbie. Worauf genau soll ich achten. Beim Compileraufruf ist mir soweit nur aufgefallen, dass soweit ich das korrekt beurteile der Parameter -MMP als Unterschied aufgefallen. Hier mal die Ausgaben: make: Linking: main.elf /home/joelo/NBDATA/Programming/Programming_MC/atmel_toolchain/bin/avr-gc c -mmcu=atmega328p -I. -gdwarf-2 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=main.o -I/home/joelo/NBDATA/Programming/Programming_MC/Meine_Projekte/ECLIPSE/M YLIB/ -std=gnu99 -DF_OSC= -MD -MP -MF .dep/main.elf.d main.o pcf8574/pcf8574.o lcdpcf8574/lcdpcf8574.o i2chw/twimaster.o uart/uart.o adc/adc.o temt6000/temt6000.o --output main.elf -Wl,-Map=main.map,--cref -lm Eclipse: avr-gcc -I/home/joelo/NBDATA/Programming/Programming_MC/Meine_Projekte/ECLIPSE/M YLIB -Wall -Os -fpack-struct -fshort-enums -ffunction-sections -fdata-sections -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega328p -DF_CPU=16000000UL -MMD -MP -MF"src/main.d" -MT"src/main.d" -c -o "src/main.o" "../src/main.c" Finished building: ../src/main.c Aus den Makefiles kann ich jetzt nicht wirklich was erkennen. Habe eine makefile, objekts.mk und sources.mk stehen aber keine Kompiler parameter drin LG Jörg
Sorry Schreibfehler Parameter -MD und -MMD sind mir aufgefallen Jörg
Zunächst mal vielen Dank für die schnellen Antworten. Habe mal in Eclipse OSC auf F_CPU gesetzt. Ohne Auswirkung. Mit make funktioniert es ja auch ohne. F_CPU ist in beiden Fällen gesetzt. Wo kann ich noch ansetzen? lg Jörg
Gleiche Compilerversion, keine Warnings beim Compilieren? Oliver
Ich halte das Thema F_OSC und F_CPU noch nicht für erledigt. Dafür spricht auch, das eine falsche Definition sehr wahrscheinlich einen Fehler bei der LCD-Initialisierung verursacht. Kläre das mal etwas detaillierter. 1. Welche Taktfrequenz wird tatsächlich von der Hardware verwendet? Fuses korrekt gesetzt? 2. Wieso schreibst Du "Habe mal in Eclipse OSC auf F_CPU gesetzt."? Ist das ein Versehen und meinst eigentlich F_OSC ? Nicht, das Du Dich da vertan hast. 3. Wenn es mit leerem F_OSC geht dann wird sehr wahrscheinlich im Code irgendwo F_OSC definiert. Kläre mal genau, ob nun F_OSC oder F_CPU verwendet wird und wie genau. Jedenfalls macht es meiner Vermutung nach mehr Sinn F_CPU auf F_OSC zu setzen als umgekehrt.
@ oliver Ja es ist die gleiche Compilerversion - es ist ja nur einmal die toolchain installiert. Beim Kompilieren mit make als auch mit Eclipse gibt es keine Warnungen. Hier mal die komplette von Eclipse: 13:27:32 **** Build of configuration Release for project LCD_I2C_TEMT_6000_RADAR **** make all Building file: ../src/uart/uart.c Invoking: AVR Compiler avr-gcc -Wall -Os -fpack-struct -fshort-enums -ffunction-sections -fdata-sections -std=gnu99 -funsigned-char -funsigned-bitfields -DF_OSC=16000000UL -mmcu=atmega328p -DF_CPU=16000000UL -MMD -MP -MF"src/uart/uart.d" -MT"src/uart/uart.d" -c -o "src/uart/uart.o" "../src/uart/uart.c" Finished building: ../src/uart/uart.c Building file: ../src/temt6000/temt6000.c Invoking: AVR Compiler avr-gcc -Wall -Os -fpack-struct -fshort-enums -ffunction-sections -fdata-sections -std=gnu99 -funsigned-char -funsigned-bitfields -DF_OSC=16000000UL -mmcu=atmega328p -DF_CPU=16000000UL -MMD -MP -MF"src/temt6000/temt6000.d" -MT"src/temt6000/temt6000.d" -c -o "src/temt6000/temt6000.o" "../src/temt6000/temt6000.c" Finished building: ../src/temt6000/temt6000.c Building file: ../src/spi/spi.c Invoking: AVR Compiler avr-gcc -Wall -Os -fpack-struct -fshort-enums -ffunction-sections -fdata-sections -std=gnu99 -funsigned-char -funsigned-bitfields -DF_OSC=16000000UL -mmcu=atmega328p -DF_CPU=16000000UL -MMD -MP -MF"src/spi/spi.d" -MT"src/spi/spi.d" -c -o "src/spi/spi.o" "../src/spi/spi.c" Finished building: ../src/spi/spi.c Building file: ../src/pcf8574/pcf8574.c Invoking: AVR Compiler avr-gcc -Wall -Os -fpack-struct -fshort-enums -ffunction-sections -fdata-sections -std=gnu99 -funsigned-char -funsigned-bitfields -DF_OSC=16000000UL -mmcu=atmega328p -DF_CPU=16000000UL -MMD -MP -MF"src/pcf8574/pcf8574.d" -MT"src/pcf8574/pcf8574.d" -c -o "src/pcf8574/pcf8574.o" "../src/pcf8574/pcf8574.c" Finished building: ../src/pcf8574/pcf8574.c Building file: ../src/lcdpcf8574/lcdpcf8574.c Invoking: AVR Compiler avr-gcc -Wall -Os -fpack-struct -fshort-enums -ffunction-sections -fdata-sections -std=gnu99 -funsigned-char -funsigned-bitfields -DF_OSC=16000000UL -mmcu=atmega328p -DF_CPU=16000000UL -MMD -MP -MF"src/lcdpcf8574/lcdpcf8574.d" -MT"src/lcdpcf8574/lcdpcf8574.d" -c -o "src/lcdpcf8574/lcdpcf8574.o" "../src/lcdpcf8574/lcdpcf8574.c" Finished building: ../src/lcdpcf8574/lcdpcf8574.c Building file: ../src/i2chw/twimaster.c Invoking: AVR Compiler avr-gcc -Wall -Os -fpack-struct -fshort-enums -ffunction-sections -fdata-sections -std=gnu99 -funsigned-char -funsigned-bitfields -DF_OSC=16000000UL -mmcu=atmega328p -DF_CPU=16000000UL -MMD -MP -MF"src/i2chw/twimaster.d" -MT"src/i2chw/twimaster.d" -c -o "src/i2chw/twimaster.o" "../src/i2chw/twimaster.c" Finished building: ../src/i2chw/twimaster.c Building file: ../src/adc/adc.c Invoking: AVR Compiler avr-gcc -Wall -Os -fpack-struct -fshort-enums -ffunction-sections -fdata-sections -std=gnu99 -funsigned-char -funsigned-bitfields -DF_OSC=16000000UL -mmcu=atmega328p -DF_CPU=16000000UL -MMD -MP -MF"src/adc/adc.d" -MT"src/adc/adc.d" -c -o "src/adc/adc.o" "../src/adc/adc.c" Finished building: ../src/adc/adc.c Building file: ../src/main.c Invoking: AVR Compiler avr-gcc -I/home/joelo/NBDATA/Programming/Programming_MC/Meine_Projekte/ECLIPSE/M YLIB -Wall -Os -fpack-struct -fshort-enums -ffunction-sections -fdata-sections -std=gnu99 -funsigned-char -funsigned-bitfields -DF_OSC=16000000UL -mmcu=atmega328p -DF_CPU=16000000UL -MMD -MP -MF"src/main.d" -MT"src/main.d" -c -o "src/main.o" "../src/main.c" Finished building: ../src/main.c Building target: LCD_I2C_TEMT_6000_RADAR.elf Invoking: AVR C Linker avr-gcc -Wl,-Map,LCD_I2C_TEMT_6000_RADAR.map -mmcu=atmega328p -o "LCD_I2C_TEMT_6000_RADAR.elf" ./src/uart/uart.o ./src/temt6000/temt6000.o ./src/spi/spi.o ./src/pcf8574/pcf8574.o ./src/lcdpcf8574/lcdpcf8574.o ./src/i2chw/twimaster.o ./src/adc/adc.o ./src/main.o Finished building target: LCD_I2C_TEMT_6000_RADAR.elf Invoking: AVR Create Extended Listing avr-objdump -h -S LCD_I2C_TEMT_6000_RADAR.elf >"LCD_I2C_TEMT_6000_RADAR.lss" Finished building: LCD_I2C_TEMT_6000_RADAR.lss Create Flash image (ihex format) avr-objcopy -R .eeprom -R .fuse -R .lock -R .signature -O ihex LCD_I2C_TEMT_6000_RADAR.elf "LCD_I2C_TEMT_6000_RADAR.hex" Finished building: LCD_I2C_TEMT_6000_RADAR.hex Create eeprom image (ihex format) avr-objcopy -j .eeprom --no-change-warnings --change-section-lma .eeprom=0 -O ihex LCD_I2C_TEMT_6000_RADAR.elf "LCD_I2C_TEMT_6000_RADAR.eep" Finished building: LCD_I2C_TEMT_6000_RADAR.eep Invoking: Print Size avr-size --format=avr --mcu=atmega328p LCD_I2C_TEMT_6000_RADAR.elf AVR Memory Usage ---------------- Device: atmega328p Program: 8654 bytes (26.4% Full) (.text + .data + .bootloader) Data: 444 bytes (21.7% Full) (.data + .bss + .noinit) Finished building: sizedummy und hier von make: /home/joelo/NBDATA/Programming/Programming_MC/atmel_toolchain/bin/avr-gc c -c -mmcu=atmega328p -I. -gdwarf-2 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=lcdpcf8574/lcdpcf8574.lst -I/home/joelo/NBDATA/Programming/Programming_MC/Meine_Projekte/ECLIPSE/M YLIB/ -std=gnu99 -DF_OSC= -MD -MP -MF .dep/lcdpcf8574.o.d lcdpcf8574/lcdpcf8574.c -o lcdpcf8574/lcdpcf8574.o Compiling: i2chw/twimaster.c /home/joelo/NBDATA/Programming/Programming_MC/atmel_toolchain/bin/avr-gc c -c -mmcu=atmega328p -I. -gdwarf-2 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=i2chw/twimaster.lst -I/home/joelo/NBDATA/Programming/Programming_MC/Meine_Projekte/ECLIPSE/M YLIB/ -std=gnu99 -DF_OSC= -MD -MP -MF .dep/twimaster.o.d i2chw/twimaster.c -o i2chw/twimaster.o Compiling: uart/uart.c /home/joelo/NBDATA/Programming/Programming_MC/atmel_toolchain/bin/avr-gc c -c -mmcu=atmega328p -I. -gdwarf-2 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=uart/uart.lst -I/home/joelo/NBDATA/Programming/Programming_MC/Meine_Projekte/ECLIPSE/M YLIB/ -std=gnu99 -DF_OSC= -MD -MP -MF .dep/uart.o.d uart/uart.c -o uart/uart.o Compiling: adc/adc.c /home/joelo/NBDATA/Programming/Programming_MC/atmel_toolchain/bin/avr-gc c -c -mmcu=atmega328p -I. -gdwarf-2 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=adc/adc.lst -I/home/joelo/NBDATA/Programming/Programming_MC/Meine_Projekte/ECLIPSE/M YLIB/ -std=gnu99 -DF_OSC= -MD -MP -MF .dep/adc.o.d adc/adc.c -o adc/adc.o In file included from adc/adc.c:13:0: /home/joelo/NBDATA/Programming/Programming_MC/atmel_toolchain/bin/../lib /gcc/avr/4.6.2/../../../../avr/include/util/delay.h:90:3: warning: #warning "F_CPU not defined for <util/delay.h>" [-Wcpp] Compiling: temt6000/temt6000.c /home/joelo/NBDATA/Programming/Programming_MC/atmel_toolchain/bin/avr-gc c -c -mmcu=atmega328p -I. -gdwarf-2 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=temt6000/temt6000.lst -I/home/joelo/NBDATA/Programming/Programming_MC/Meine_Projekte/ECLIPSE/M YLIB/ -std=gnu99 -DF_OSC= -MD -MP -MF .dep/temt6000.o.d temt6000/temt6000.c -o temt6000/temt6000.o Linking: main.elf /home/joelo/NBDATA/Programming/Programming_MC/atmel_toolchain/bin/avr-gc c -mmcu=atmega328p -I. -gdwarf-2 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=main.o -I/home/joelo/NBDATA/Programming/Programming_MC/Meine_Projekte/ECLIPSE/M YLIB/ -std=gnu99 -DF_OSC= -MD -MP -MF .dep/main.elf.d main.o pcf8574/pcf8574.o lcdpcf8574/lcdpcf8574.o i2chw/twimaster.o uart/uart.o adc/adc.o temt6000/temt6000.o --output main.elf -Wl,-Map=main.map,--cref -lm Creating load file for Flash: main.hex /home/joelo/NBDATA/Programming/Programming_MC/atmel_toolchain/bin/avr-ob jcopy -O ihex -R .eeprom main.elf main.hex Creating load file for EEPROM: main.eep /home/joelo/NBDATA/Programming/Programming_MC/atmel_toolchain/bin/avr-ob jcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" \ --change-section-lma .eeprom=0 -O ihex main.elf main.eep /home/joelo/NBDATA/Programming/Programming_MC/atmel_toolchain/bin/avr-ob jcopy: --change-section-lma .eeprom=0x0000000000000000 never used Creating Extended Listing: main.lss /home/joelo/NBDATA/Programming/Programming_MC/atmel_toolchain/bin/avr-ob jdump -h -S main.elf > main.lss Creating Symbol Table: main.sym /home/joelo/NBDATA/Programming/Programming_MC/atmel_toolchain/bin/avr-nm -n main.elf > main.sym @Bitflüsterer Zu 1) Arduino Uno Original Settings 16Mhz und Fuses Zu 2) War ein Schreibfehler Zu 3) Werde ich mal versuchen vielen Dank Jörg
@Bitflüsterer Zu 3) Im kompletten Code wird F_OSC nicht benutzt oder gesetz Jörg
Dann zeig mal den Code Das hier ... > erhalte ich bei meinen LCD ausgaben immer nur einen Buchstabensalat. > Hin und wieder nach mehrmaligem Reset funktioniert die Anzeige dann > doch. Aber nur manchmal. Und nur für kurze Zeit. Dann wieder Salat. ... ist ein Indiz, das in die Richtung "Timingproblem" führt. Wenn das mit _delay_us gemacht wird, dann hast du indirekt eine Abhängigkeit von F_CPU drinnen. D.h. dein Code verwendet das nicht. Aber _delay_us tut das intern.
PS: Ich denke, die LCD Funktionen sollten reichen. Noch sehe ich keinen Grund, die uart oder die adc Routinen anzusehen.
Hallo, schau dir deinen Code nochmal genau an, denn je nach eingestellter Optimierung lässt der Compiler
1 | /* wait until busy flag is cleared */
|
2 | while ((c = lcd_read(0)) & (1 << LCD_BUSY)) |
3 | {
|
4 | }
|
solche Warteschleifen gänzlich verschwinden !!! (warum abfragen wenn nichts zu tun ist ?) (gesehen in lcdpcf8574.c lcd_waitbusy(void) )
@ Stefan erst mal vielen Dank für den Hinweis. Achtung - ich bin mit meinen Kenntnissen noch ziemlich am Anfang. Darf ich das so verstehen, dass ich in Eclipse die Optimierung runtersetzen sollte - oder die while Schleife aus dem Code entfernen? Jörg
Hallo Jörg L. schrieb: > Darf ich das so verstehen, dass ich in Eclipse die Optimierung > runtersetzen sollte Nein, nur halt ganz genau aufpassen was eingestellt ist !!! > - oder die while Schleife aus dem Code entfernen? Auch nicht, aber im Zweifelsfall irgend eine "dummy"-Anweisung wie "i++" reinschhreiben!
@ Stefan Habe mal eine Dummy-Anweisung eingebaut. Daran hat es aber leider nicht gelegen. Trotzdem danke - bin für jeden Tip dankbar :-) Jörg
Stefan schrieb: > Optimierung lässt der Compiler > /* wait until busy flag is cleared */ > while ((c = lcd_read(0)) & (1 << LCD_BUSY)) > { > } > > solche Warteschleifen gänzlich verschwinden !!! > (warum abfragen wenn nichts zu tun ist ?) nein das macht er ganz bestimmt nicht. Dann würde der Compiler defekt sein.
Stefan schrieb: > Auch nicht, aber im Zweifelsfall irgend eine "dummy"-Anweisung wie "i++" > reinschhreiben! Das nutzt aber nur etwas, wenn i volatile ist. Oliver
Habe heute mal Codeblocks installiert. Gleiches Phänomen wie bei Eclipse. Salat auf dem LCD. Mit make korrekte Darstellung. Hat keiner mehr eine Idee? Gruß Jörg
Oliver schrieb: > Stefan schrieb: > Auch nicht, aber im Zweifelsfall irgend eine "dummy"-Anweisung wie "i++" > reinschhreiben! > > Das nutzt aber nur etwas, wenn i volatile ist. > > Oliver Grundsätzlich, ja. In dem konkreten Fall darf der Compiler die Schleife aber nie wegoptimieren, wie Peter II auch schon bemerkt hat. @TE: ich würd verstärkt in Richtung Timing forschen. Das klingt schon sehr danach. Was ich mir noch vorstellen könnte: ein Pufferüberlauf in den LCD Puffer (hab mir aber deine Lcd-Routinen dazu nicht angeschaut) der sich durch geänderte Kommandozeilenoptionen bemerkbar macht. Vorher hat er halt zufällig was andres überschrieben...
Haro schrieb: > Grundsätzlich, ja. > In dem konkreten Fall darf der Compiler die Schleife aber nie > wegoptimieren, wie Peter II auch schon bemerkt hat. Es ging eher darum, daß Stefan gleich zweimal falsch gelegen hat... Oliver
Ich denke auch, dass es irgendeine Timging Sache ist. Wo ich immer wieder Bauchweh habe, das sind solche Sachen
1 | #define lcd_e_delay() __asm__ __volatile__( "rjmp 1f\n 1:" );
|
2 | |
3 | ...
|
4 | |
5 | /*************************************************************************
|
6 | delay loop for small accurate delays: 16-bit counter, 4 cycles/loop
|
7 | *************************************************************************/
|
8 | static inline void _delayFourCycles(unsigned int __count) |
9 | {
|
10 | if (__count == 0) |
11 | __asm__ __volatile__( "rjmp 1f\n 1:" ); |
12 | // 2 cycles
|
13 | else
|
14 | __asm__ __volatile__ ( |
15 | "1: sbiw %0,1" "\n\t" |
16 | "brne 1b" // 4 cycles/loop |
17 | : "=w" (__count) |
18 | : "0" (__count) |
19 | );
|
20 | }
|
21 | |
22 | /*************************************************************************
|
23 | delay for a minimum of <us> microseconds
|
24 | the number of loops is calculated at compile-time from MCU clock frequency
|
25 | *************************************************************************/
|
26 | #define delay(us) _delayFourCycles( ( ( 1*(F_CPU/4000) )*us)/1000 )
|
die würde ich mal durch die klassischen nop() bzw. _delay_us ersetzen, auch wenn ich nicht beweisen kann, dass es daran liegt. Und das Busy-Waiting würde ich mal durch einen fixen Zeitraum (probehalber ruhig großzügig gewählt) ersetzen. Beutzen eigentlich beide 'Versionen' den gleichen gcc?
:
Bearbeitet durch User
@karl heinz Danke für den Tip - werde ich am WE mal versuchen - bin für jeden Tip dankbar. Und ja beide Versionen benutzen den gleichen gcc. Ist ja auch nur einer auf dem System installiert. Jörg
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.