mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LCD Anzeige macht Probleme


Autor: anzeige (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe dieses 
(http://www.reichelt.de/?;ACTION=3;LA=0;GROUPID=300...) 
display, und möchte es im 4-Bit-Modus ansteuern. Dazu ahbe ich hier im 
Forum ein Beispielprogramm in C gefunden. Jedoch zeigt das Display nach 
dem Anschließen an einen Port in der unteren Reihe nur schwarze Balken 
an. Egal welcher Port, egal ob ein Programm auf dem µC ist oder nicht. 
Woran kann das ligen?

Autor: ??? (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Woran kann das ligen?
keine Ahnung, meine Glaskugel ist gerade in Reparatur

Einfach so fällt mir ein:
stimmt der Kontrast?

sonst:
-alles durchmessen
-Code+Schaltplan zeigen

ein bisschen lesen wird nicht dir nicht Schaden:
http://sprut.de/electronic/lcd/index.htm
http://www.mikrocontroller.net/articles/AVR-Tutorial:_LCD

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Woran kann das liegen?
Nach der Aussage:

>Jedoch zeigt das Display nach dem Anschließen an einen Port in der
> unteren Reihe nur schwarze Balken an. Egal_ _welcher Port, egal ob ein
> Programm auf dem µC ist oder nicht.
...liegt es daran, dass du nicht weisst, was du tust, oder?

- Schaltplan
- Programm

Das ist das mindeste, was du uns zur Verfügung stellen solltest. Dann 
können wir dir auch helfen.

Ralf

Autor: anzeige (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier die Dateien:

C-Datei:
/*
LCD4b.c
---------------------------------------------------------------------------------------
                 LCD-Routine für KS0070 und HD44780 im 4Bit Modus v1.1
---------------------------------------------------------------------------------------
*/

#include <avr/io.h>
#include "lcd4b.h"
#include <avr/delay.h>


int main(void)
{
  DDRD |=  0b11111100;      //Pins 2-7 als Ausgänge 
  
  DDRC = 0xff;
  _delay_ms(2000);
  PORTC=0x00;
  _delay_ms(500);
  PORTC=0xff;

  lcd_linit();        //LCD Initialisieren
  lcd_clear();        //Display löschen
  lcd_out("Hallo Welt");      //Text ausgeben
  lcd_command(line2);      //2. Zeile
  lcd_out("!!!");        //Text ausgeben

  while(1);
}


// sendet ein Datenbyte an das LCD
void lcd_data(char byte)
{
  char sich_byte;
  sich_byte = byte;
  byte &= ~0x0f;          //Bit 0-3 auf 0 setzen
  byte |= (1<<lcd_rs);      //RS setzen
  PORT = byte;          //oberes Nibbel Ausgeben
  lcd_enable();

  byte = sich_byte;
  byte = byte<<4;          //Nibbles vertauschen
  byte &= ~0x0f;          //Bit 0-3 auf 0 setzen
  byte |= (1<<lcd_rs);      //RS setzen
  PORT = byte;          //unteres Nibbel Ausgeben
  lcd_enable();

  kpause();
}

//sendet einen Befehl an das LCD
void lcd_command(char byte)
{                              //wie lcd_data, nur ohne RS zu setzen
  char sich_byte;
  sich_byte = byte;
  byte &= ~0x0f;          //Bit 0-3 auf 0 setzen
  PORT = byte;          //oberes Nibbel Ausgeben
  lcd_enable();

  byte = sich_byte;
  byte = byte<<4;          //Nibbles vertauschen
  byte &= ~0x0f;          //Bit 0-3 auf 0 setzen
  PORT = byte;          //unteres Nibbel Ausgeben
  lcd_enable();

  kpause();
}

//erzeugt den Enable-Puls
void lcd_enable(void)
{
  PORT |= (1<<lcd_e);          //Enable auf High
  kpause();              //kurze pause
  PORT &= ~(1<<lcd_e);           //Enable auf Low
}                 

//Pause nach jeder Übertragung
void kpause(void)
{
  _delay_us(48);            //48us Pause
}


//Längere Pause für manche Befehle
void lpause(void) 
{
  _delay_ms(5);            //5ms Pause
}

//Initialisierung
void lcd_linit(void)          //Wenn der Display gleich nachdem er mit Spannung versorgt wurde
{                    //in Betrieb genommen werden soll
  unsigned char i;
  for(i=0;i<10;i++)
  {
    _delay_ms(10);
  }
  lcd_init();
}

//Initialisierung
void lcd_init(void)
{
  PORT = 0b00100000;        //Interface auf 4-Bit setzen

  lcd_enable();
  lpause();

  
  lcd_command(0b00101000);    // 2-zeilig, 5x8-Punkt-Matrix
  lcd_command(0b00001100);    // Display ein
  lcd_command(0b00000110);    // Kursor nach rechts wandernd, kein Display shift
}

//Sendet den Befehl zur Löschung des Displays
void lcd_clear(void)
{
    lcd_command(0x01);
  lpause();
}

//gibt einen Text aus
void lcd_out(char *s)
{
    while (*s)            //so lange *s != '\0' also ungleich dem "String-Endezeichen"
    {
        lcd_data(*s);        //Zeichen ausgeben
        s++;
    }
}
/*
-----------------------------------------------------------------------------------------------
LCD4b developed by Johannes K.
-----------------------------------------------------------------------------------------------
*/

und die Headerdatei:
/*
LCD4b.h
---------------------------------------------------------------------------------------
                 LCD-Routine für KS0070 und HD44780 im 4Bit Modus v1.1
---------------------------------------------------------------------------------------
Für die Ansteuerung des Displays werden 6 Pins benötigt.

Pinbelegung:            
PORT Pin lcd_rs    RS
PORT Pin lcd_e    E
PORT Pin 4        Datenbit 4
PORT Pin 5         Datenbit 5
PORT Pin 6         Datenbit 6
PORT Pin 7          Datenbit 7
               R/W und Datenbits 0-3 auf GND
               
PORT, lcd_rs, lcd_e können frei gewählt werden

Software:  
  AVR-GCC 3.3
  AVR Libc 1.2.3 
  
Hardware:  
  AVR-uController
*/
#ifndef F_CPU
#define F_CPU 1000000UL     //Prozessor Frequenz in Hz
#endif

#define lcd_e 3              //E Pinnummer
#define lcd_rs 2             //RS Pinnummer
#define PORT PORTD           //Portname

#define line1 0b10000000     //Adresse im Speicher des LCD-Controllers für die 1. Zeile
#define line2 0b11000000     //Adresse im Speicher des LCD-Controllers für die 2. Zeile

extern void lcd_data(char byte);
extern void lcd_command(char byte);
extern void lcd_enable(void);
extern void kpause(void);
extern void lpause(void);
extern void lcd_linit(void);
extern void lcd_init(void);
extern void lcd_clear(void);
extern void lcd_out(char *s);
/*
-----------------------------------------------------------------------------------------------
LCD4b developed by Johannes K.
-----------------------------------------------------------------------------------------------
*/

Belegung:

Pins (LCD) 1, 3, 5 und 7-10 an Masse
Pins (LCD) 11-14 an PORTD 4-7
E wie beschrieben an 3
und rs an 2

Autor: anzeige (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mir ist selber noch ein möglicher Fehler eingefallen.

DB4 soll ja an Pin4. Ist Pin4 von 0 oder 1 an gezählt?

Autor: Carsten Sch. (dg3ycs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
anzeige schrieb:
> Mir ist selber noch ein möglicher Fehler eingefallen.
>
> DB4 soll ja an Pin4. Ist Pin4 von 0 oder 1 an gezählt?

Hi,

ich würde sagen da solltest du mal ins Datenblatt des Display schauen 
wie der Hersteller es benennt! Möglich ist beides...

Gruß
Carsten

Autor: anzeige (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich meinte auf dem STK500

Autor: Herr Mueller (herrmueller)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beim STK500 ist Pin4 der, neben dem Px4 (x=A oder B oder C oder D) 
steht.

Autor: anzeige (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gut, dann wird das vielleicht mein Fehler sein.

Ich habe E und RS dann auf die STK500-Pins 1 und 2 gelegt, und die Bits 
4-7 auf die STK500-Pins 3-6.

Wie kann ich in der Software das jetzt wieder "gradebiegen"? E und RS 
kann ich einfach im Header ändern. Wie geht das für die Datenbits?

Autor: Bazi .. (baziizab)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Pins (LCD) 11-14 müssen auf die STK500-Pins 4-7 des entsprechenden Ports 
(bei deinem geposteten Code PortD). Ist doch viel einfacher als die 
Software umzuschreiben?

Autor: anzeige (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das würde ich eben wissen, was man machen muss, um die 4 Bits um ein Pin 
zu verschieben. Bei E und RS war es ja ganz einfach.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Das würde ich eben wissen, was man machen muss, um die 4 Bits um ein Pin
>zu verschieben. Bei E und RS war es ja ganz einfach.

Dann musst du aber noch die Software umschreiben.

Das
>  char sich_byte;
>  sich_byte = byte;
>  byte &= ~0x0f;          //Bit 0-3 auf 0 setzen
>  byte |= (1<<lcd_rs);      //RS setzen
>  PORT = byte;          //oberes Nibbel Ausgeben
>  lcd_enable();

>  byte = sich_byte;
>  byte = byte<<4;          //Nibbles vertauschen
>  byte &= ~0x0f;          //Bit 0-3 auf 0 setzen
>  byte |= (1<<lcd_rs);      //RS setzen
>  PORT = byte;          //unteres Nibbel Ausgeben
>  lcd_enable();

basiert darauf, das Bit4..7 an Port4..7 hängen. Reichen deine 
C-Kenntnisse aus, das anzupassen?

MfG Spess

Autor: anzeige (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich denke mal, der Inhalt des Bytes ab Bit4 mus eien Stelle nach links 
geschoben werden. Wie weiß ich aber nicht.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Ich denke mal, der Inhalt des Bytes ab Bit4 mus eien Stelle nach links
>geschoben werden. Wie weiß ich aber nicht.

Meine C-Kenntnisse sind nur rudimentär, aber wie wäre es mit '>>'?

MfG Spess

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Nachtrag:

>Ich denke mal, der Inhalt des Bytes ab Bit4 mus eien Stelle nach links
>geschoben werden. Wie weiß ich aber nicht.

Nicht links, sondern rechts.

MfG Spess

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.