PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : DOGM163 an RN-Control



homer3345
03.03.2013, 14:47
Hey Leute,
lange ist es her, dass ich mich zuletzt mit dem Thema Robotik beschäftigt habe, doch in letzter Zeit habe ich wieder Lust bekommen mich mit dem Thema zu beschäftigen.
Nun sitze ich hier und bin am Verzweifeln. :cry: Ich hatte mich früher schon mal damit beschäftigt das Display DOGM163 zum Funktionieren zu überreden, doch damals habe ich relativ schnell aufgegeben. Heute will das alles immer noch nicht so recht funktionieren. :( Ich hab schon eine Lib gefunden, mit der das Display funktionieren sollte, doch bei mir tut sich nichts und verstehen tue ich das ganze auch noch nicht so richtig. Hat eventuell schon jemand Erfahrung mit dem Ding oder es schon erfolgreich in C programmiert? Oder ist jemand so hilfsbereit mir mit der Lib ein Beispiel zusammenzubasteln, an welchem ich die Funktionsweise verstehe?
Seid bitte nicht so hart, es ist 2 Jahre her, dass ich mich zuletzt damit beschäftigt habe. ;) Ich wäre unendlich dankbar, wenn mir jemand helfen könnte. O:)

PS.: Ich betreibe das Display im 4bit-Modus (5V) an einem RN-Control(16mhz)
D4 = PB0
D5 = PB1
D6 = PB2
D7 = PB3

RS = PB4
R/W = PB5
E = PB6

Hubert.G
03.03.2013, 15:43
Irgendwie passt deine lcd.h nicht zu deiner Portbelegung. In der lcd.h hat du PortA definiert und hier schreibst du PortB.

oberallgeier
03.03.2013, 15:46
... bin am Verzweifeln ... Display im 4bit-Modus (5V) an einem RN-Control(16mhz) ...Na - an so nem schönen Sonnensonntag kann man Dich doch nicht verzweifeln lassen. Mal ein paar Schnippsel mit Initialisierungen, defines und Code (und denk an das was Hubert schreibt: wer (s)eine Bibliothekssoftware nicht mit seiner Hardware abstimmt ist schnell am Verwzeifeln) :


// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// LCD hat 16 Zeichen: "1234567890123456";
unsigned char XXX1[] EEMEM = "__ R5J Archie __"; // Programm ID
unsigned char XXX2[] EEMEM = "XXX Vx06 (c)2013"; // Versions ID
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

// ================================================== ============================ =
// ================================================== ============================ =
// Auszug aus dem main:
// ....
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// ....
// ########>>>>>>>> LCD <<<<<<<<########
#include <lcd-routines.h> // LCD-Lib - ähnlich Tr-Tester
#include <lcd-routines.c> // LCD-Lib
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
DDRB = 0b11111111; // siehe aktuell oben
PORTB = 0b00000000; // und Port/Pull Ups (1) aktivieren
// ....
lcd_init(); // lib
// ....
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//LCDtst (); // inf
//###Linf01 (); // inf
//###LTwahl (); // Ausgabekonfiguration: LCD/UART, ohne Taste: nur UART inf
// ....
// Ende Auszug aus dem main
// ================================================== ============================ =
// ================================================== ============================ =

// ================================================== ============================ =
// ================================================== ============================ =
//### Programm 1 ms pausieren lassen !! Der Pausenwert ist nur experimentell !
void wms(uint16_t ms)
{
for(; ms>0; ms--)
{
uint16_t __c = 4000;
__asm__ volatile (
"1: sbiw %0,1" "\n\t"
"brne 1b"
: "=w" (__c)
: "0" (__c)
);
}
}
// ================================================== ============================ =
// ================================================== ============================ =
// ================================================== ============================ =
// LCD-Test-Routinen
// ================================================== ============================ =
void LCDtst (void) // Testausgaben aufs LCD - mit Beispielen
{ //
char abc[12]; // Übersetzungsfeld für Werteausgabe

// Startsequenz LCD
Line1(); // 1. Zeile Startinfo
lcd_eep_string(XXX1); // "__ R5J Archie __"
Line2(); // 2. Zeile
lcd_eep_string(XXX2); // "XXX Vx06 (c)2013";
wms ( 2000); // Nur so - zur Show

Line2(); // 2. Zeile
lcd_eep_string(LEER); // Zeile leeren (füllen mit blanks)
SetCursor (2, 9); // Positioniere Zeile 2 {1, 2}, Stelle 9 {0, 15}
lcd_string(itoa(SLAVE_KoCo, abc, 10)); // Aktuellen Wert anzeigen

// - - - - - - - - - - - - - - -
return ;
} //
// === Ende LCDtst (void)
// ================================================== ============================ =

// ================================================== ============================ =
// LCD-info01
// ================================================== ============================ =
void Linf01 (void) // Startinfo LCD und Info Tastenwahl für UART/LCD
{ //
// Startsequenz LCD
Line1(); // 1. Zeile Startinfo
lcd_eep_string(XXX1); // "__ R5J Archie __"
Line2(); // 2. Zeile
lcd_eep_string(XXX2); // "XXX Vx06 (c)2013";
wms ( 2000); // Nur so - zur Show
lcd_clear(); //
//Line1(); // 1. Zeile Startinfo
lcd_eep_string(LI01); // "UART-T1, LCD-T2";
Line2(); // 2. Zeile
lcd_eep_string(E9s); // "Ende ca. 9 sec"
// - - - - - - - - - - - - - - -//
return ;
} //
// === Ende Linf01 (void)
// ================================================== ============================ =

und die lcd-h

// Ansteuerung eines HD44780 kompatiblen LCD im 4-Bit-Interfacemodus
// http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial
//
void lcd_data(unsigned char temp1);
void lcd_command(unsigned char temp1);
void lcd_send(unsigned char data);
void lcd_string(char *data);
void lcd_enable(void);
void lcd_init(void);
void lcd_clear(void);
void lcd_eep_string(const unsigned char *data);
//LCD-Befehle
#define CMD_SetEntryMode 0x04
#define CMD_SetDisplayAndCursor 0x08
#define CMD_SetIFOptions 0x20
#define CMD_SetCGRAMAddress 0x40 // für Custom-Zeichen
#define CMD_SetDDRAMAddress 0x80 // zum Cursor setzen
//Makros für LCD
#define Line1() SetCursor(1,0) //An den Anfang der 1. Zeile springen
#define Line2() SetCursor(2,0) //An den Anfang der 2. Zeile springen
#define SetCursor(y, x) lcd_command((uint8_t)(CMD_SetDDRAMAddress + (0x40*(y-1)) + x)) //An eine bestimmte Position springen
#define LCDLoadCustomChar() lcd_command(CMD_SetCGRAMAddress) //Custom-Zeichen laden
//Eigene Zeichen
#define LCD_CHAR_OMEGA 244 //Omega-Zeichen
#define LCD_CHAR_U 228 //µ-Zeichen
#define LCD_CHAR_DIODE 0 //Dioden-Icon; wird als Custom-Character erstellt

// LCD Befehle

#define CLEAR_DISPLAY 0x01

// Pinbelegung für das LCD, an verwendete Pins anpassen

#define LCD_PORT PORTB
#define LCD_DDR DDRB
#define LCD_RS PB6
#define LCD_EN1 PB4

und noch die lcd-c dazu:

// Ansteuerung eines HD44780 kompatiblen LCD im 4-Bit-Interfacemodus
// http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial
//
// Die Pinbelegung ist über defines in lcd-routines.h einstellbar

#include <avr/io.h>
#include "lcd-routines.h"
#include <util/delay.h>
#include <avr/eeprom.h>

// sendet ein Datenbyte an das LCD

void lcd_data(unsigned char temp1)
{
LCD_PORT |= (1<<LCD_RS); // RS auf 1 setzen
lcd_send(temp1);
}

// sendet einen Befehl an das LCD

void lcd_command(unsigned char temp1)
{
LCD_PORT &= ~(1<<LCD_RS); // RS auf 0 setzen
lcd_send(temp1);
}
//Eigentliche LCD-Zugriffs-Funktion; 4-Bit-Modus
void lcd_send(unsigned char data) {
// oberes Nibble setzen
LCD_PORT = (LCD_PORT & 0xF0) | ((data >> 4) & 0x0F);
_delay_us(5);
lcd_enable();
// unteres Nibble setzen
LCD_PORT = (LCD_PORT & 0xF0) | (data & 0x0F);
_delay_us(5);
lcd_enable();
_delay_us(60);
LCD_PORT &= 0xF0;
}
// erzeugt den Enable-Puls
void lcd_enable(void)
{
LCD_PORT |= (1<<LCD_EN1);
_delay_us(10); // kurze Pause
// Bei Problemen ggf. Pause gemäß Datenblatt des LCD Controllers verlängern
// http://www.mikrocontroller.net/topic/80900
LCD_PORT &= ~(1<<LCD_EN1);
}

// Initialisierung:
// Muss ganz am Anfang des Programms aufgerufen werden.

void lcd_init(void)
{
LCD_DDR = LCD_DDR | 0x0F | (1<<LCD_RS) | (1<<LCD_EN1); // Port auf Ausgang schalten
// muss 3mal hintereinander gesendet werden zur Initialisierung
_delay_ms(30);
LCD_PORT = (LCD_PORT & 0xF0 & ~(1<<LCD_RS)) | 0x03;
lcd_enable();
_delay_ms(5);
lcd_enable();
_delay_ms(1);
lcd_enable();
_delay_ms(1);
LCD_PORT = (LCD_PORT & 0xF0 & ~(1<<LCD_RS)) | 0x02;
_delay_ms(1);
lcd_enable();
_delay_ms(1);
// 4Bit / 2 Zeilen / 5x7
lcd_command(CMD_SetIFOptions | 0x08);
// Display ein / Cursor aus / kein Blinken
lcd_command(CMD_SetDisplayAndCursor | 0x04);
// inkrement / kein Scrollen
lcd_command(CMD_SetEntryMode | 0x02);
lcd_clear();
}

// Sendet den Befehl zur Löschung des Displays

void lcd_clear(void)
{
lcd_command(CLEAR_DISPLAY);
_delay_ms(5);
}


// Schreibt einen String auf das LCD

void lcd_string(char *data)
{
while(*data) {
lcd_data(*data);
data++;
}
}
//String aus EEPROM laden und an LCD senden
void lcd_eep_string(const unsigned char *data)
{
unsigned char c;
while(1) {
c = eeprom_read_byte(data);
if(c==0) return;
lcd_data(c);
data++;
}
}


Vielleicht hilfts Dir? Läuft bei mir auf nem mega1284/20MHz/eigenePlatine, aber auch mit demselben Controller in der RNControl. Ich denkeglaubehoffe nicht, dass es zum Deinem Controller nen Unterschied gibt. Und die Bibliothek ist auf den "LCD-Stecker" der RNControl - siehe die dortige Dokumentation - abgestimmt ;-)

Schönen Sonntag.

homer3345
04.03.2013, 19:56
Danke für die schnelle hilfe.O:)
Nur gibt es noch ein paar Problem. Da steht, dass z.b der RS Pin auf PB3 soll bzw. Pin 3 auf dem RN-Control Stecker, was auf dem RN-Control Stecker allerdings PB2 ist. Also meine Frage PB2 oder PB3? Oder habe ich was falsch verstanden? :confused:

oberallgeier
04.03.2013, 22:42
... Nur gibt es noch ein paar Problem ... meine Frage PB2 oder PB3? ... falsch verstanden ...Falsch verstanden? Um es mal deutlich zu sagen: Du hast nicht richtig aufgepasst, nicht richtig gelesen. Der Wannenstecker auf der RNControl hat die Pinne 1 bis 10, siehe auch RNWissen (siehe die Pinnummerung hier - klick), (http://www.rn-wissen.de/index.php/RN-Definitionen#I2C-Bus_Stecker) der Port B auf dem Controller hat die Pinne PORT B 0 bis PORT B 7.

Verstanden? Schau mal auf doch mal Deine Betriebsanleitung (hast Du die denn überhaupt?) für die RNControl an, oder lies hier (klick) den Abschnitt auf dem LINKS "PORT B" (http://www.rn-wissen.de/index.php/RN-Control#Steckerbelegung_und_Jumper-Funktionen) steht bzw. die Überschrift "Digitale I/O Port B (PB0 bis PB 7)". Und wenn Du das dann noch nicht verstehst, schau in den Schaltplan und geh mal vom Controler PB2 zum Wannenstecker und schau nach, wie der Pin am andern Ende der Leitung heisst.


... lange ist es her, dass ich mich zuletzt mit dem Thema Robotik beschäftigt habe ...Stimmt, sehr lange.

homer3345
05.03.2013, 20:07
Genau so war mir das auch klar, deswegen habe ich mich ja über die Benennung der Pins gewundert. :confused: Da steht nämlich, dass Pin 1 auf dem RN-Stecker PB1 auf dem Controller entspricht, was ja nicht der Fall ist. Oder lese ich das falsch? :confused:


LCD 24x2, pin for RS line 1 B3 = B3
LCD 24x2, pin for RW line 2 B2 = B2
LCD 24x2, pin for ENABLE line 3 B1 = B1
GND 4 B9
VCC 6 B10
LCD 24x2, pin for 4bit data bit 4 8 B4 = B4
LCD 24x2, pin for 4bit data bit 5 9 B5 = B5
LCD 24x2, pin for 4bit data bit 6 10 B6 = B6
LCD 24x2, pin for 4bit data bit 7 11 B7 = B7

oberallgeier
05.03.2013, 23:57
Ok, Du hast Recht, da stiftet mein Kommentar nur Verwirrung. Schließ das Display einfach nach den Gegebenheiten Deines Displays und dessen Stecker ans RNControl.