Damic
Ben Belg sowat :D :: plaatjes zijn meestal klikbaar
*WU = Write up.
Het heeft me wat tijd gekost maar het is me eindelijk gelukt om via een u8g tekst te voorschijn te toveren op het display dat ik had gekocht van Dreamscape88. Deze kun je via de Arduino lib GOFi2cOLED direct aansturen, maar dat werkt niet zo handig. Dus dan maar verder gezocht en kwam ik op de u8glib uit, deze ondersteund meer dan alleen die SSD1306 schermpjes.
Vermits ik nu Atmel Studio gebruik, gaan ik het zoveel mogelijk verwijzen naar die functies.
Maak een nieuw project aan (of gebruik een bestaand) en kies voor de GCC C++ Executable project. Doorloop de rest van de wizard en dan kom je normaal uit op een leeg project.
Ga naar je u8glib map in Windows Verkenner, dan verder naar src en selecteer al de bestanden en laat deze vallen (drop) bij in je Solution Explorer
Nu staan al de bestanden die je juist hebt laten vallen op Compile, dat is niet handig want dan gaat ie er altijd redelijk lang over doen voor dat ie klaar is.
Om gewoon tekst te tonen heb je volgende libs nodig, Build Action laat je op Compile staan, de rest op None:
u8g.h
u8g_clip.c
u8g_com_api.c
u8g_com_api16gr.c
u8g_com_arduino_ssd_i2c.c
u8g_com_arduino_sw_spi.c
u8g_com_atmega_hw_spi.c
u8g_com_atmega_sw_spi.c
u8g_com_io.c
u8g_com_i2c.c //om de 1 of andere vage reden gaf deze een fout melding omdat ie F_CPU niet vind, daarmee apart geïncluded in het cpp bestand zelf
u8g_com_null.c
u8g_delay.c
u8g_dev_ssd1306_128x64.c //je kan hier ook een ander scherm voor gebruiken)
u8g_font.c
u8g_font_data.c//hier zitten al de fonts in ;)
u8g_line.c
u8g_ll_api.c
u8g_page.c
u8g_pb.c
u8g_pb16v1.c
u8g_pb8v1.c
u8g_state.c
u8g_u16toa.c
u8g_u8toa.c
u8g_virtual_screen.cNu hangt deze lijst voornamelijk af van wat je met je oled schermpje wilt doen, in deze WU gewoon wat tekst weergeven zodus is dit de minimum lijst.
Nu terug naar je project cpp bestand (waar de main instaat), hier define je eerst F_CPU op 8MHz (of lager/hoger), dan include je de u8g.h en de andere nodige dingen en je krijg je dit
#define F_CPU 8000000UL
#include "u8g.h"
#include "u8g_com_i2c.c"
#include <avr/io.h>
#include <util/delay.h>
#include <compat/twi.h>Initialisatie van de u8glib heb je natuurlijk ook nodig en een setup routine (iets overzichtelijker dan alles in je main te dumpen)
u8g_t u8g;
void u8g_setup(void)
{
//PD0=SCL,PD1=SDA AT90CANxx
u8g_SetPinLevel(PD0, 1); u8g_SetPinOutput(PD0);
u8g_SetPinLevel(PD1, 1); u8g_SetPinOutput(PD1);
u8g_InitI2C(&u8g, &u8g_dev_ssd1306_128x64_i2c, U8G_I2C_OPT_NONE);
u8g_SetColorIndex(&u8g, 1);
}Wat zien we in die setup, voor de AT90CAN is PD0 en PD1 respectievelijk SCL en SDA, deze moet je initialiseren als I2C poorten, daarna moet u8g ook weten wat ie daarmee moet doen, dus initi2c() en welk scherm je gebruikt.
Ha de main 
int main(void)
{
CLKPR=0x80;
DDRD=0xff; //set all pins of portD to output
PORTD=0xff; //internal pullups
u8g_setup();
while(1)
{
u8g_SetFont(&u8g, u8g_font_7x14);
u8g_FirstPage(&u8g);
do
{
u8g_DrawStr(&u8g, 0, 10, "CircuitsOnline.net");
}while(u8g_NextPage(&u8g));
u8g_Delay(100);
}
}Prescaler zetten anders krijg je rare dingen op je schermpje zoals sneeuw
. SetFont() welk font je gebruikt, OPPASSEN: zoveelste meer font type je gebruikt zoveels temeer geheugen ga je gebruiken van je avr.
u8glib werkt met pagina's die hij 1 voor 1 afloopt. Op de eerste pagina ga je direct in de lus en zet je in dit geval een string (tekst) op x 0, y 10 blijkbaar schrijft ie omhoog ofzoiets (= zelf te testen 
De delay zorgt ervoor dat eerst de buffers worden gevuld en dan pas worden weergegeven, hier kun je dus mee spelen 
Nu omdat je waarschijnlijk nog met de standaard instellingen gaat compileren krijg je een fout dat de text te groot is voor het text geheugen, of anders gezegd, je code past niet in het geheugen van de avr.
Dus kort gezegd, alles is te groot omdat je effectief alles (zelfs de dingen die je niet nodig hebt) toch bijhoud en mee compileert.
Daar gaan we nu nog iets aan doen, nl al het overbodige wegzwieren wat we niet gebruiken en nee dit doet de compilers en linkers voor ons 
Ga naar Project dan Properties (ALT+F7) dan krijg je zo'n tabblad venster voor je, klik op Tool Chain en ga nu elke Optimization af en klik Garbage collection aan. Dit zorgt ervoor dat al de onnodige data word weg gesmeten en dus niet word mee gecompileerd in een hex, die je dan weer in je AVR kan schieten en dan krijg je normaal het volgende
Krijg je na dit alles nog niets op je scherm en je hebt geen foutmeldingen, kan het zijn dat het scherm op een ander adres zit en moet je dat dus veranderen, open u8g_com_arduino_ssd_i2c.c ga naar lijn 57 (I2C_SLA) en verander die 3c in 3d of verander heel de lijn door[code=C]#define I2C_SLA (0x3d*2)//(0x3c*2)[/code]
Moest je toch nog problemen hebben met artifacts op het scherm kun je altijd 2 pullups plaatsen van 4k7.
Ik hoop dat het een beetje duidelijk is, moesten er nog vragen zijn. Stel ze maar we (de CO leden) zullen ze proberen te beantwoorden. 