PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : EA DOGS 102-6 tut was es will und nicht was es soll;)



Thor_
28.09.2013, 18:47
Hallo zusammen

Ich habe ein LCD EA DOGS 102-6 an einem ATmgea8 angeschlossen.
Die Programmierung des AVR klappt soweit, angeschlossene LEDs usw. funktionieren tadellos.

Hier mal mein Code (fairerweise muss ich sagen, dass ich den Grundcode von hier habe: Link (http://www.mikrocontroller.net/topic/199995): Ich habe ihn lediglich an meine Schaltung angepasst (also PINs und so).


#include<avr/io.h>
#define F_CPU 1000000
#include <util/delay.h>

#define CHIPSELECT PORTB &= ~(1<<1);
#define CHIPUNSELECT PORTB |= (1<<1);

#define DATA PORTB |= (1<<0);
#define COMMAND PORTB &= ~(1<<0);

#define RESETHIGH PORTB |= (1<<2);
#define RESETLOW PORTB &= ~(1<<2);


void SPI_MasterInit(void)
{ // MOSI, SCK und PB0 als Ausgang
DDRB = 0xFF;
// SPI Konfiguration (Richtiger SPI-mode?)
SPCR |= (1<<6) | (1<<4) | (1<<3)|(1<<2); // SPI-Enabled, Mastermode, SPI-mode
SPSR = (1<<0);
}

unsigned char spi_out(char b)
{
//Byte senden
SPDR = b;
//Warten bis Sendevorgang komplett
while(!(SPSR &(1<<SPIF)));
//SPIF löschen durch lesen von SPDR
return SPDR;

}

void sendCommand(char command)
{ CHIPSELECT;
COMMAND;
//Byte senden
spi_out(command);
CHIPUNSELECT;
}

void sendData(char data)
{
CHIPSELECT;
DATA;
//Byte senden
spi_out(data);
CHIPUNSELECT;
}

void DisplayInit(void)
{ //Display reset
RESETLOW;
_delay_ms(1);
RESETHIGH;
_delay_ms(5);

//Display init

sendCommand(0x40);
sendCommand(0xA1);
sendCommand(0xC0);
//sendCommand(0xA4);
sendCommand(0xA6);

sendCommand(0xA2);
sendCommand(0x2F);
sendCommand(0x27);
sendCommand(0x81);
sendCommand(0x10);

sendCommand(0xFA);
sendCommand(0x90);
sendCommand(0xAF);
}

int main(void){

SPI_MasterInit();

DisplayInit();

sendCommand(0b00000000);
sendCommand(0b00010000);
sendData(0xFF);
sendCommand(0b00000001);
sendCommand(0b00010000);
sendData(0xFF);
sendCommand(0b00000010);
sendCommand(0b00010000);
sendData(0xFF);
sendCommand(0b00000011);
sendCommand(0b00010000);
sendData(0xFF);
sendCommand(0b00000100);
sendCommand(0b00010000);
sendData(0xFF);


}






So. Das LCD blinkt nun beim Einschalten zwei mal auf und gibt Pixelsalat von sich. Oben links kann man ungefähr ein kleines schwarzes Vierreck erahnen, kann aber auch Zufall sein.
Danach blinkt es in unregelmässigen Abständen wieder auf
Die Aufblink-Zeiten sind ca. 0.5 Sekunden oder so.

Was ich versucht habe:

-LCD gewechselt
-ATmega gewechselt
-Anschlüsse überprüft und neu gesteckt
-Takt überprüft (stimmt, 1MHz)


Was mache ich falsch? Hoffe es kann mir jemand weiter helfen=)

Liebe Grüsse
Thor_


---edit----

Das LCD blinkt (nach dem initialen doppelten Aufblinken) periodisch und zwar mit einem zeitlichen Abstand von ca. 13Sekunden.

-

seite5
28.09.2013, 20:07
hi,
ich verwende eine andere ini, die funktioniert:

DOGS102_tx_byte(0x40,0); // Start line 0
DOGS102_tx_byte(0xA0,0); // 12:00 darst.
DOGS102_tx_byte(0xC8,0); // COM dir normal
DOGS102_tx_byte(0xA4,0); // All pix on
DOGS102_tx_byte(0xA6,0); // Invers off
DOGS102_tx_byte(0xA2,0); // duty 1/65
DOGS102_tx_byte(0x2F,0); // power control
delay_ms(120);
DOGS102_set_contrast();
DOGS102_tx_byte(0xFA,0); // T-Comp
DOGS102_tx_byte(0x90,0); // "
DOGS102_tx_byte(0xAF,0); // ON
delay_us(100);
DOGS102_clear();

(die 0 im tx_byte bedeutet Kommando)
mfg
Achim

Thor_
28.09.2013, 21:18
Hi Achim

Vielen Dank für deine Antwort.
Ich habe inzwischen einen anderen Code gefunden, der eine schwarze Seite anzeigt, funktioniert tadellos.
Es ist soweit also alles in Ordnung und es liegt an mir.

Hier komme ich auch gerade zum wesentlichen:
Mir fehlen wohl noch gewisse Infos/Wissen um das Display effizient zu nutzen.
Mir ist vor allem unklar, wie ich eine gweisse Stelle xy ansprechen kann.
Das Datenblatt erwähnt Pages, Columns und so weiter, aber ich kann mir das nicht zusammen reimen.

Hat jemand einen Link der das alles gut erklärt? z.B. ein howTo?
Das Datenblatt vom LCD sowie vom Controller habe ich mir ausführlich durchgelesen.

Liebe Grüsse
Thor_

Crazy Harry
28.09.2013, 21:49
Von C hab ich keine Ahnung, aber ...... das Display kann nur geschrieben also nicht gelesen werden und du mußt immer mindestens ein Byte also 8 Pixel schreiben. Daraus folgt, daß du das Display-RAM im Controller-RAM abbilden mußt, darin deine Zeichenoperationen machst und das Bild mit einem Display-Refresh komplett übertragen mußt. Das heißt aber auch, daß du 102x64/8=864 Byte deines Controller-RAMs schon dafür reservieren mußt. Ich würde sagen, daß dein Controller zu klein ist.

seite5
29.09.2013, 09:14
Hi,
ein paar codeschnipsel aus meiner ansteuerung, ich steuere das ding nicht via spi an, einfach nur durch takt und daten.

DOGS102_tx_byte(byte b, byte typ)
{
byte i;
LCD_CLR_CS;
if(typ) LCD_SEND_DATA;
else LCD_SEND_CMD;
for(i=0;i<8;i++)
{
LCD_CLR_CLK;
if(b>0x7F) LCD_SET_DATA;
else LCD_CLR_DATA;
b<<=1;
LCD_SET_CLK;
}
LCD_SET_CS;
}

DOGS102_set_col_addr(byte adr)
{
DOGS102_tx_byte(adr & 0x0F, 0);
DOGS102_tx_byte((adr >> 4) | 0x10, 0);
}

DOGS102_set_page_addr(byte adr)
{
DOGS102_tx_byte((adr & 7) | 0xB0, 0);
}

DOGS102_clear()
{
byte c, p;
for(p=0;p<8;p++)
{
for(c=30;c<132;c++)
{
DOGS102_set_page_addr(p);
DOGS102_set_col_addr(c);
DOGS102_tx_byte(0,1);
}
}
}


DOGS102_clear_line(byte line)
{
byte col;
for(col=30; col<132; col++)
{
DOGS102_set_page_addr(2*line);
DOGS102_set_col_addr(col);
DOGS102_tx_byte(0,1);
DOGS102_set_page_addr(2*line+1);
DOGS102_set_col_addr(col);
DOGS102_tx_byte(0, 1);
}
}

byte DOGS102_write_char_at(char c, char line, char col) // line 0..3, col 30..131
{
byte i;
flash char* chpt=char_table[c-ch_offset];
for(i=0; i<char_width[c-ch_offset]; i++)
{
DOGS102_set_page_addr(2*line);
DOGS102_set_col_addr(col+30);
DOGS102_tx_byte(*chpt++,1);
DOGS102_set_page_addr(2*line+1);
DOGS102_set_col_addr(col+30);
DOGS102_tx_byte(*chpt++, 1);
col++;
}
return (col);
}

vielleicht hiflts weiter.
mfg
Achim