... 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) :
Code:
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// 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
Code:
// Ansteuerung eines HD44780 kompatiblen LCD im 4-Bit-Interfacemodus
// http://www.mikrocontroller.net/artic...R-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:
Code:
// Ansteuerung eines HD44780 kompatiblen LCD im 4-Bit-Interfacemodus
// http://www.mikrocontroller.net/artic...R-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.
Lesezeichen