Hallo erstmal,
schön wie dieser Thread besucht wird, auch wenn hilfreiche Antworten bisher ausblieben. Toll ist auch, dass der Ansichtszähler trotzdem steigt.... entweder hat keiner eine Lösung, jeder sucht danach oder ich bin in Forums-Ungnade gefallen?!?
OK, auch wenn in mehreren anderen Threads dieses Thema schon angesprochen wurde und anscheinend einige Leute ihre Displays mit AVR-GCC auch zum laufen gebracht haben, warte ich momentan noch auf die göttliche Eingebung.
Das schlimmste ist allerdings, dass die Einträge hier völlig ignoriert werden. Kann mich nicht wenigstens ein Moderator beschimpfen, dass ich schon wieder einen neuen Thread aufgemacht habe?
Es würde aber auch schon ein funktionierender Code reichen. Die ganzen Tipps aus diesem Forum, von www.mikrocontroller.net und AVR Freaks und was weiss ich, haben mir aufgrund vieler Wissenslücken meinerseits auch nicht viel geholfen. Trotzdem danke dafür, da ich jetzt (glaube) zumindest schon teilweise zu verstehen, wie die grobe Vorgehensweise ist.
Also, eine letzte Bitte um Unterstützung:
Hat bitte jemand einen funktionierenden C-Code für RN-Control 1.4, KS0073 Display und Adapter von robotikhardware????
Mein Hauptproblem ist (so denke ich ) die Initialisierung, welcher Schritt wann, wieoft, welche Pausen usw.. Das Beispiel im Datenblatt (das von Samsung und das von robotikhardware) brachte mich auch nicht weiter, weder im < 4 Zeilen Modus noch mit 4 Zeilen.
Jetzt habe ich (nachdem ich vorher das umgeschriebene BASCOM-Beispiel eingespielt habe, danach meinen Code ), zumindest einen blinkenden Cursor in der 3. Zeile gehabt, auch wenn das Display die Return Home und Clear Display mal fein ignoriert hat. Dann einen &-Fehler im Code geändert, der für das senden der Zeichendaten zuständig ist und schon wars wieder nix. Display leer und an, ohne Cursor..... ich flipp noch aus.
Code:
#include <avr/io.h>
#include <util/delay.h>
/* Port Definition */
#define LCD_PORT PORTB
#define LCD_DB0 0
#define LCD_DB1 1
#define LCD_DB2 2
#define LCD_DB3 3
#define LCD_DB4 0
#define LCD_DB5 1
#define LCD_DB6 2
#define LCD_DB7 3
#define LCD_LIGHT 4
#define LCD_EN 5
#define LCD_RW 6
#define LCD_RS 7
#define LCD_DDR DDRB
#define LCD_BUSY PINB.7
unsigned char lcd_is_busy()
{
_delay_ms( 50 );
return 0;
}
void lcd_enable()
{
LCD_PORT |= ( 1 << LCD_EN );
_delay_us( 10 );
LCD_PORT &= ~( 1 << LCD_EN );
}
void lcd_cmd( unsigned char command )
{
unsigned char tmp = ( command >> 4 ) & 0x0F; // High-Nibble nach unten schieben
LCD_PORT |= tmp; // senden
lcd_enable(); // EN umschalten
tmp = command & 0x0F; // Low-Nibble nehmen
LCD_PORT |= tmp; // senden
lcd_enable(); // EN umschalten
while( lcd_is_busy() );
}
void lcd_data( unsigned char data )
{
unsigned char tmp = ( data >> 4 ) & 0x0F; // High-Nibble nach unten schieben
tmp |= ( 1 << LCD_RS ); // Daten senden vorbereiten
LCD_PORT |= tmp; // senden
lcd_enable(); // EN umschalten
tmp = data & 0x0F; // Low-Nibble nehmen
tmp |= ( 1 << LCD_RS ); // Daten senden vorbereiten
LCD_PORT |= tmp; // senden
lcd_enable(); // EN umschalten
while( lcd_is_busy() );
}
void init_display()
{
_delay_ms( 50 ); // power up wait
LCD_PORT = ( 1 << LCD_DB5 ); // Init
lcd_enable();
_delay_ms( 10 );
lcd_enable();
_delay_ms( 10 );
lcd_enable();
_delay_ms( 10 );
LCD_PORT = ( 1 << LCD_DB5 ); // 4-Bit Modus
lcd_enable();
LCD_PORT = 0; // RE = 0
lcd_enable();
_delay_ms( 10 );
// Extension Function Setting
LCD_PORT = ( 1 << LCD_DB5 ); // 4-Bit Modus
lcd_enable();
LCD_PORT = ( 1 << LCD_DB2 ); // RE = 1
lcd_enable();
_delay_ms( 10 );
LCD_PORT = 0; // Extension Function Set
lcd_enable();
LCD_PORT = ( 1 << LCD_DB0 ); // 4-Zeilen-Modus
lcd_enable();
_delay_ms( 10 );
LCD_PORT = ( 1 << LCD_DB5 ); // 4-Bit Modus
lcd_enable();
LCD_PORT = 0; // RE = 0
lcd_enable();
_delay_ms( 20 );
// Display On
LCD_PORT = 0;
lcd_enable();
LCD_PORT = ( 1 << LCD_DB3 ) | ( 1 << LCD_DB2 ) | ( 1 << LCD_DB1 ) | ( 1 << LCD_DB0 );
lcd_enable();
_delay_ms( 10 );
// Clear Display
LCD_PORT = 0;
lcd_enable();
LCD_PORT = ( 1 << LCD_DB0 );
lcd_enable();
_delay_ms( 10 );
// Entry Mode Set
LCD_PORT = 0;
lcd_enable();
LCD_PORT = ( 1 << LCD_DB2 ) | ( 1 << LCD_DB1 );
lcd_enable();
_delay_ms( 10 );
// Return Home
LCD_PORT = 0;
lcd_enable();
LCD_PORT = ( 1 << LCD_DB1 );
lcd_enable();
_delay_ms( 10 );
// Licht an
LCD_PORT = ( 1 << LCD_LIGHT );
}
int main( void )
{
DDRB = 0xff; /* Port als Ausgang deklarieren */
PORTB = 0x00; /* alles aus */
init_display();
_delay_ms( 10 );
lcd_data( 0b01010011 );
lcd_data( 0b01010011 );
lcd_data( 0b01010011 );
lcd_data( 0b01010011 );
lcd_data( 0b01010011 );
lcd_data( 0b01010011 );
return 0;
}
Man riecht sich
Banzai
Lesezeichen