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.
-
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.
-