Atmega8 u8glib, CLKPR Problem

Gast #5358901
Lesenswert?

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
void sys_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
void sys_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:
1
    Download u8glib_avr_vX.XX.zip
2
    Extract content to a local directory
3
    Add all files (.c files and u8g.h) of the u8glib/src directory to your project
4
    Update search path for the include file (if required)
5
    AVR Studio 4: Set additional options (Project - Configuration - Custom Options)
6
        [All Files]
7
            -ffunction-sections
8
            -fdata-sections
9
        [Linker Options]
10
            -Wl,--gc-sections
11
    AVR Studio 6: See M2tklib Instructions for AVR

Hier nochmal der komplette Code:
1
#include <util/delay.h>
2
#include <avr/io.h>
3
//#include <u8g/u8g.h>
4
#include "u8g.h"
5
#include <avr/interrupt.h>
6

7

8
//uint8_t u8g_InitSPI(u8g_t *u8g, u8g_dev_t *dev, uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t a0, uint8_t reset);
9
u8g_t u8g;
10

11
void u8g_setup(void)
12
{  
13
  /*
14
    Test Envionment 1, ATMEGA and DOGM132 
15
    CS: PORTB, Bit 2
16
    A0: PORTB, Bit 1
17
    SCK: PORTB, Bit 5
18
    MOSI: PORTB, Bit 3
19
  RESET PORTB, Bit 0
20
  */
21
  //!!//                      sck     mosi     cs       a0       reset
22
  
23
  u8g_InitSPI(&u8g, &u8g_dev_ssd1306_128x64_sw_spi, PN(1, 5),   PN(1, 3),   PN(1, 2),   PN(1, 1),   PN(1, 0));
24

25
  /* flip screen, if required */
26
  u8g_SetRot180(&u8g);
27

28
  /* assign default color value */
29
  if ( u8g_GetMode(&u8g) == U8G_MODE_R3G3B2 ) 
30
    u8g_SetColorIndex(&u8g, 255);     /* white */
31
  else if ( u8g_GetMode(&u8g) == U8G_MODE_GRAY2BIT )
32
    u8g_SetColorIndex(&u8g, 3);         /* max intensity */
33
  else if ( u8g_GetMode(&u8g) == U8G_MODE_BW )
34
    u8g_SetColorIndex(&u8g, 1);         /* pixel on */
35
}
36

37
void sys_init(void)
38
{
39
#if defined(__AVR__)
40
   //select minimal prescaler (max system speed) 
41
  CLKPR = 0x80;
42
  CLKPR = 0x00;
43
#endif
44
}
45

46
void u8g_prepare(void) {
47
  u8g_SetFont(&u8g, u8g_font_6x10);
48
  u8g_SetFontRefHeightExtendedText(&u8g);
49
  u8g_SetDefaultForegroundColor(&u8g);
50
  u8g_SetFontPosTop(&u8g);
51
}
52

53
void u8g_box_frame(uint8_t a) {
54
  u8g_DrawStr(&u8g, 0, 0, "drawBox");
55
  u8g_DrawBox(&u8g, 5,10,20,10);
56
  u8g_DrawBox(&u8g, 10+a,15,30,7);
57
  u8g_DrawStr(&u8g, 0, 30, "drawFrame");
58
  u8g_DrawFrame(&u8g, 5,10+30,20,10);
59
  u8g_DrawFrame(&u8g, 10+a,15+30,30,7);
60
}
61

62
void u8g_string(uint8_t a) {
63
  u8g_DrawStr(&u8g, 30+a,31, " 0");
64
  u8g_DrawStr90(&u8g, 30,31+a, " 90");
65
  u8g_DrawStr180(&u8g, 30-a,31, " 180");
66
  u8g_DrawStr270(&u8g, 30,31-a, " 270");
67
}
68

69
void u8g_line(uint8_t a) {
70
  u8g_DrawStr(&u8g, 0, 0, "drawLine");
71
  u8g_DrawLine(&u8g, 7+a, 10, 40, 55);
72
  u8g_DrawLine(&u8g, 7+a*2, 10, 60, 55);
73
  u8g_DrawLine(&u8g, 7+a*3, 10, 80, 55);
74
  u8g_DrawLine(&u8g, 7+a*4, 10, 100, 55);
75
}
76

77
void u8g_ascii_1(void) {
78
  char s[2] = " ";
79
  uint8_t x, y;
80
  u8g_DrawStr(&u8g, 0, 0, "ASCII page 1");
81
  for( y = 0; y < 6; y++ ) {
82
    for( x = 0; x < 16; x++ ) {
83
      s[0] = y*16 + x + 32;
84
      u8g_DrawStr(&u8g, x*7, y*10+10, s);
85
    }
86
  }
87
}
88

89
void u8g_ascii_2(void) {
90
  char s[2] = " ";
91
  uint8_t x, y;
92
  u8g_DrawStr(&u8g, 0, 0, "ASCII page 2");
93
  for( y = 0; y < 6; y++ ) {
94
    for( x = 0; x < 16; x++ ) {
95
      s[0] = y*16 + x + 160;
96
      u8g_DrawStr(&u8g, x*7, y*10+10, s);
97
    }
98
  }
99
}
100

101

102
uint8_t draw_state = 0;
103

104
void draw(void) {
105
  u8g_prepare();
106
  switch(draw_state >> 3) {
107
    case 0: u8g_box_frame(draw_state&7); break;
108
    case 1: u8g_string(draw_state&7); break;
109
    case 2: u8g_line(draw_state&7); break;
110
    case 3: u8g_ascii_1(); break;
111
    case 4: u8g_ascii_2(); break;
112
  }
113
}
114

115
int main(void)
116
{
117
  sys_init();
118
  u8g_setup();
119

120
  for(;;)
121
  {  
122
    u8g_FirstPage(&u8g);
123
    do
124
    {
125
      draw();
126
    } while ( u8g_NextPage(&u8g) );
127
    
128
    draw_state++;
129
    if ( draw_state >= 5*8 )
130
      draw_state = 0;
131
    
132
    u8g_Delay(150);
133
  }
134
}

Vielleicht hat ja jemand von euch eine Idee, wo ich ansetzen könnte!
Gast #5359850
Lesenswert?

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.
Gast #5367695
Lesenswert?

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
Angehängte Dateien:
Gast #5368676
Lesenswert?

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
Gast #5369068
Lesenswert?

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"

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren