Hallo zusammen,
ich möchte gerne ein OLED am Atmega8 zum laufen bekommen. Ich nutze ein
Beispielcode mit SW-SPI. Beim kompilieren bekomme ich Fehler, welche auf
das nicht vorhandene Clock Prescaler Register des Atmega8 hindeuten:
[...]
#warning "F_CPU not defined for <util/delay.h>"
../OLED_SPI.c: In function 'sys_init':
../OLED_SPI.c:41: error: 'CLKPR' undeclared (first use in this function)
../OLED_SPI.c:41: error: (Each undeclared identifier is reported only
once
../OLED_SPI.c:41: error: for each function it appears in.)
make: *** [OLED_SPI.o] Error 1
[...]
Im Code findet sich eine Funktion:
1
voidsys_init(void)
2
{
3
#if defined(__AVR__)
4
//select minimal prescaler (max system speed)
5
CLKPR=0x80;
6
CLKPR=0x00;
7
#endif
8
}
Da der Clockprescaler beim Atmega8 ja nicht vorhanden ist, wäre es für
mich nun naheliegend, die Funktion oder teile davon auszukommentieren:
1
voidsys_init(void)
2
{
3
/*#if defined(__AVR__)
4
select minimal prescaler (max system speed)
5
CLKPR = 0x80;
6
CLKPR = 0x00;
7
#endif*/
8
}
Mache ich dies, häufen sich die Fehler im Compiler. Offenbar ist das
Problem mit einem einfachen auskommentieren nicht gelöst.
[...]
#warning "F_CPU not defined for <util/delay.h>"
avr-gcc -mmcu=atmega8 -Wl,--gc-sections -Wl,-Map=OLED_SPI.map
OLED_SPI.o -o OLED_SPI.elf
OLED_SPI.o: In function `u8g_ascii_2':
C:\Users\User\Documents\Atmel
Studio\Projekte\OLED_SPI\default/../OLED_SPI.c:92: undefined reference
to `u8g_DrawStr'
C:\Users\User\Documents\Atmel
Studio\Projekte\OLED_SPI\default/../OLED_SPI.c:96: undefined reference
to `u8g_DrawStr'
OLED_SPI.o: In function `u8g_ascii_1':
C:\Users\User\Documents\Atmel
Studio\Projekte\OLED_SPI\default/../OLED_SPI.c:80: undefined reference
to `u8g_DrawStr'
C:\Users\User\Documents\Atmel
Studio\Projekte\OLED_SPI\default/../OLED_SPI.c:84: undefined reference
to `u8g_DrawStr'
OLED_SPI.o: In function `u8g_line':
C:\Users\User\Documents\Atmel
Studio\Projekte\OLED_SPI\default/../OLED_SPI.c:70: undefined reference
to `u8g_DrawStr'
C:\Users\User\Documents\Atmel
Studio\Projekte\OLED_SPI\default/../OLED_SPI.c:71: undefined reference
to `u8g_DrawLine'
C:\Users\User\Documents\Atmel
Studio\Projekte\OLED_SPI\default/../OLED_SPI.c:72: undefined reference
to `u8g_DrawLine'
C:\Users\User\Documents\Atmel
Studio\Projekte\OLED_SPI\default/../OLED_SPI.c:73: undefined reference
to `u8g_DrawLine'
C:\Users\User\Documents\Atmel
Studio\Projekte\OLED_SPI\default/../OLED_SPI.c:74: undefined reference
to `u8g_DrawLine'
OLED_SPI.o: In function `u8g_string':
C:\Users\User\Documents\Atmel
Studio\Projekte\OLED_SPI\default/../OLED_SPI.c:63: undefined reference
to `u8g_DrawStr'
C:\Users\User\Documents\Atmel
Studio\Projekte\OLED_SPI\default/../OLED_SPI.c:64: undefined reference
to `u8g_DrawStr90'
C:\Users\User\Documents\Atmel
Studio\Projekte\OLED_SPI\default/../OLED_SPI.c:65: undefined reference
to `u8g_DrawStr180'
C:\Users\User\Documents\Atmel
Studio\Projekte\OLED_SPI\default/../OLED_SPI.c:66: undefined reference
to `u8g_DrawStr270'
OLED_SPI.o: In function `u8g_box_frame':
C:\Users\User\Documents\Atmel
Studio\Projekte\OLED_SPI\default/../OLED_SPI.c:54: undefined reference
to `u8g_DrawStr'
C:\Users\User\Documents\Atmel
Studio\Projekte\OLED_SPI\default/../OLED_SPI.c:55: undefined reference
to `u8g_DrawBox'
C:\Users\User\Documents\Atmel
Studio\Projekte\OLED_SPI\default/../OLED_SPI.c:56: undefined reference
to `u8g_DrawBox'
C:\Users\User\Documents\Atmel
Studio\Projekte\OLED_SPI\default/../OLED_SPI.c:57: undefined reference
to `u8g_DrawStr'
C:\Users\User\Documents\Atmel
Studio\Projekte\OLED_SPI\default/../OLED_SPI.c:58: undefined reference
to `u8g_DrawFrame'
C:\Users\User\Documents\Atmel
Studio\Projekte\OLED_SPI\default/../OLED_SPI.c:59: undefined reference
to `u8g_DrawFrame'
OLED_SPI.o: In function `u8g_prepare':
C:\Users\User\Documents\Atmel
Studio\Projekte\OLED_SPI\default/../OLED_SPI.c:47: undefined reference
to `u8g_font_6x10'
C:\Users\User\Documents\Atmel
Studio\Projekte\OLED_SPI\default/../OLED_SPI.c:47: undefined reference
to `u8g_font_6x10'
C:\Users\User\Documents\Atmel
Studio\Projekte\OLED_SPI\default/../OLED_SPI.c:47: undefined reference
to `u8g_SetFont'
C:\Users\User\Documents\Atmel
Studio\Projekte\OLED_SPI\default/../OLED_SPI.c:48: undefined reference
to `u8g_SetFontRefHeightExtendedText'
C:\Users\User\Documents\Atmel
Studio\Projekte\OLED_SPI\default/../OLED_SPI.c:49: undefined reference
to `u8g_SetDefaultForegroundColor'
C:\Users\User\Documents\Atmel
Studio\Projekte\OLED_SPI\default/../OLED_SPI.c:50: undefined reference
to `u8g_SetFontPosTop'
OLED_SPI.o: In function `u8g_setup':
C:\Users\User\Documents\Atmel
Studio\Projekte\OLED_SPI\default/../OLED_SPI.c:23: undefined reference
to `u8g_Pin'
C:\Users\User\Documents\Atmel
Studio\Projekte\OLED_SPI\default/../OLED_SPI.c:23: undefined reference
to `u8g_Pin'
C:\Users\User\Documents\Atmel
Studio\Projekte\OLED_SPI\default/../OLED_SPI.c:23: undefined reference
to `u8g_Pin'
C:\Users\User\Documents\Atmel
Studio\Projekte\OLED_SPI\default/../OLED_SPI.c:23: undefined reference
to `u8g_Pin'
C:\Users\User\Documents\Atmel
Studio\Projekte\OLED_SPI\default/../OLED_SPI.c:23: undefined reference
to `u8g_Pin'
C:\Users\User\Documents\Atmel
Studio\Projekte\OLED_SPI\default/../OLED_SPI.c:23: undefined reference
to `u8g_dev_ssd1306_128x64_sw_spi'
ED_SPI.c:23: undefined reference to `u8g_dev_ssd1306_128x64_sw_spi'
C:\Users\User\Documents\Atmel
Studio\Projekte\OLED_SPI\default/../OLED_SPI.c:23: undefined reference
to `u8g_InitSPI'
C:\Users\User\Documents\Atmel
Studio\Projekte\OLED_SPI\default/../OLED_SPI.c:26: undefined reference
to `u8g_SetRot180'
C:\Users\User\Documents\Atmel
Studio\Projekte\OLED_SPI\default/../OLED_SPI.c:34: undefined reference
to `u8g_SetColorIndex'
OLED_SPI.o: In function `main':
C:\Users\User\Documents\Atmel
Studio\Projekte\OLED_SPI\default/../OLED_SPI.c:122: undefined reference
to `u8g_FirstPage'
C:\Users\User\Documents\Atmel
Studio\Projekte\OLED_SPI\default/../OLED_SPI.c:126: undefined reference
to `u8g_NextPage'
C:\Users\User\Documents\Atmel
Studio\Projekte\OLED_SPI\default/../OLED_SPI.c:132: undefined reference
to `u8g_Delay'
make: *** [OLED_SPI.elf] Error 1
[...]
Eingebunden wurde die Bibliothek in AVR Studio 4.16 gemäß der
beigefügten Anleitung:
Mal der Reihe nach. Dir fhlen wohl ein paar projektspezifische Defines.
Da meckert z.B. wer, das F_CPU nicht gesetzt ist. Normalerweise
definiert man das auf den Systemtakt in Hertz. Also z.B.
1
#define F_CPU (16000000)
Die Funktion, an der Du rumdoktorst wird automatisch leer geputzt, wenn
ein Define "__AVR__" existiert. Da Du einen AVR hast, sollte das wohl
gesetzt werden.
1
#define __AVR__
Dein Compiler sch(m)eisst Dich zu mit Warnungen, dass er Funktionen
nicht kennt.
Das Alles wirkt für mich, als ob Du noch einen Knoten in Deinen Include
Anweisungen hast. Kontrolliere, wer welche Header-Dateien in welcher
Reihenfolge einbinden muss.
fop schrieb:> Die Funktion, an der Du rumdoktorst wird automatisch leer geputzt, wenn> ein Define "__AVR__" existiert. Da Du einen AVR hast, sollte das wohl> gesetzt werden.
Habe zwischenzeitlich nochmal einen Atmega328 getestet mit CLKPR
Register. Ändert wie erwartet nichts an der Funktion. Kompilieren habe
ich dann nochmal mit dem Compiler aus Atmel Studio 7 getestet und
bekomme die selben Fehler heraus. Das ist echt zum Verzweifeln. Habe
mich genau an diese Vorgaben hier gehalten:
Download u8glib_avr_vX.XX.zip
Extract content to a local directory
Add all files (.c files and u8g.h) of the u8glib/src directory to your
project
Update search path for the include file (if required)
AVR Studio 4: Set additional options (Project - Configuration - Custom
Options)
[All Files]
-ffunction-sections
-fdata-sections
[Linker Options]
-Wl,--gc-sections
fop schrieb:> Das Alles wirkt für mich, als ob Du noch einen Knoten in Deinen Include> Anweisungen hast. Kontrolliere, wer welche Header-Dateien in welcher> Reihenfolge einbinden muss.
Mein Problem ist einfach. Ich kann nicht mehr machen, als die Anleitung
zu befolgen. Vielleicht habe ich hier was falsch gemacht:
"Add all files (.c files and u8g.h) of the u8glib/src directory to your
project"
Ich habe als die Dateien, wie im Anhang zu sehen einfach in den Ordner
gepackt. Darf ich damit rechnen, dass das Funktioniert?
Die Funktionen hier ließen sich auch ohne Probleme hinzufügen:
[All Files]
-ffunction-sections
-fdata-sections
[Linker Options]
-Wl,--gc-sections
Also sowas hartnäckiges habe ich noch nicht gehabt. Naja, wann auch. Bin
AVR Studio noob, wenn man es so will.
Hat noch jemand Ideen? Oder ich schicke mal einen Projektordner als zip
und jemand schaut sich das man an in seinem Atmel 4.16, falls das noch
jemand benutzt?
Liebe Grüße
Habe es zwischenzeitlich Unter Linux versucht. Auch fremde Codes
funktionieren nicht. Vielleicht arbeitet ja jemand von euch mit Atmel
Studio 4.16 oder Atmel Studio 7?
Habe die Version 1.18.1 von hier:
https://bintray.com/olikraus/u8glib/AVR
Hat jemand Lust ein Projekt als zip zu schicken, welches bei ihm
erfolgreich kompiliert wird? Will mich einfach mal davon überzeugen,
dass das mit meiner Toolchain funktionieren könnte.
Es ist echt zum verzweifeln. Der ganze Nachmittag ist drauf gegangen und
man kommt keinen cm weiter. So macht das keinen Spaß :D
u8glib schrieb:> avr-gcc -mmcu=atmega8 -Wl,--gc-sections -Wl,-Map=OLED_SPI.map> OLED_SPI.o -o OLED_SPI.elf
Das hier alle anderen *.o in der Linker Kommandozeile fehlen, sollte
einem dann doch ins Auge fallen.
Ansonsten: Anfängerübungen mit dem PC C-Compiler (z.B. gcc) mal
durchspielen. Danach ist man für solche Fallen gewappnet.
Jim M. schrieb:> Das hier alle anderen *.o in der Linker Kommandozeile fehlen, sollte> einem dann doch ins Auge fallen.
Da scheine ich wohl einfach auf dem Schlauch zu stehen. Wenn du einen
konkreten Lösungsvorschlag hast, würde ich mich sehr freuen, wenn du
mich vom Schlauch schubst.
Was genau meinst du mit "alle anderen *.o"