Forum: Compiler & IDEs LCD Display funzt ned


von saschisch (Gast)


Lesenswert?

Hallo Leute!

Ich habe ein Prob mit einem Display
Habe es rihctig angeschlossen und versuche ein Testprog zum Laufen zu
bringen.

Daten zu unseren ATmega32:
3,6864 Mhz
PORTC für Display
4 Bit Mode

Hier der Code :

MAIN.c

/*
 Copyright:      Radig Ulrich  mailto: mail@ulrichradig.de
 Author:         Radig Ulrich
 Remarks:
 known Problems: none
 Version:        28.05.2004
 Description:    Dieses Programm dient als Beispiel zur Ansteuerung
einer MMC/SD-Memory-Card.
         Zum Zugriff auf eine MMC/SD-Karte, muß man nur die Datei mmc.c
         in sein eigenes Programm einfügen.
*/

#include <stdio.h>
#include <stdlib.h>
#include <avr/io.h>
#define sbi(ADDRESS,BIT) ((ADDRESS) |= (1<<(BIT)))
#define cbi(ADDRESS,BIT) ((ADDRESS) &= ~(1<<(BIT)))
#define outp(VAL,ADRESS) ((ADRESS) = (VAL))
#define inp(VAL) (VAL)

#include <lcd.c>

//Hauptprogramm
int main (void)
{
  //Initzialisierung des LCD - Displays
  LCD_Init();


  //Hauptprogramm läuft ständig in einer schleife und macht nichts
  while (1)
    {
      for (int c=0;c<0xff;c++)
      {
        LCD_Clear ();
        LCD_Print(0,0,"Int Wert:%i  Hex Wert:%x  ",c,c);
        LCD_Print(1,0,"Mikrocontroller and more");
        for (int a=0;a<6000;a++)
          {
          for (int b=0;b<2000;b++);
          }
      }
    }
return (1);
}


LCD.c:

*
 Copyright:      Radig Ulrich  mailto: mail@ulrichradig.de
 Author:         Radig Ulrich
 Remarks:
 known Problems: none
 Version:        28.05.2004
 Description:    Programm zur Ansteuerung eines Standart LCD
         (HD44870),(SED1278F) und kompatible
*/

#include <lcd.h>

//Prototypes
void Write_LCD (char,char);
char Read_LCD (char);
void LCD_Init (void);
void LCD_Clear (void);
void LCD_Print (char,char,char *Buffer,...);

void LCD_Init (void)
{
  char tmp = Init_LCD_Zeilen;
  //Set Port Direction Register to Output for LCD Databus und LCD
Steuerbus
  LCD_Port_DDR = LCD_DataOutput+(1<<LCD_RS | 1<<LCD_RW | 1<<LCD_E);
  //Wait a short Time afer Power on
  for (int a=0;a<3000;a++)
    {

    }
  Write_LCD (0x22,0);  //Init in 4 Bit Mode
  //Wait a short Time afer Power on
  for (int a=0;a<3000;a++)
    {
    for (int b=0;b<100;b++);
    }
  Write_LCD (0x22,0);  //Init in 4 Bit Mode (Zur Sicherheit nochmal)
  if (tmp == 1)
    {
    Write_LCD (0x20,0);  //1 Zeilen
    }
    else
    {
    Write_LCD (0x28,0);  //mehrere Zeilen
    }
  Write_LCD (0x0C,0);  //Display On
  Write_LCD (0x80,0);  //Set DD-Ram Adresse = 0
}

void Write_LCD (char Data,char CD)
{
  //Set Port Direction Register to Output for LCD Databus und LCD
Steuerbus
  LCD_Port_DDR = LCD_DataOutput+(1<<LCD_RS | 1<<LCD_RW | 1<<LCD_E);
  //Soll ins Seuer oder Datenregister geschrieben werden?
  if (CD == 0)
    {
    cbi(LCD_Port_Write,LCD_RS); //RS = 0 Steuerregister
    }
    else
    {
    sbi(LCD_Port_Write,LCD_RS); //RS = 1 Dataregister
    }
  //Schreibsignal setzen
  cbi(LCD_Port_Write,LCD_RW); //Zum Schreiben RW-Pin = Low
  //Schreiben der 1. 4Bit an das LCD Display
  LCD_Port_Write = (LCD_Port_Write&0xF0) + ((Data&0xF0)>>4); //Write
Nibbel MSB
  sbi(LCD_Port_Write,LCD_E);
  cbi(LCD_Port_Write,LCD_E);
  //Schreiben der 2. 4Bit an das LCD Display
  LCD_Port_Write = (LCD_Port_Write&0xF0) + (Data&0x0F); //Write Nibbel
LSB
  sbi(LCD_Port_Write,LCD_E);
  cbi(LCD_Port_Write,LCD_E);


}

char Read_LCD (char CD)
{
  char Data;
  //Set Port Direction Register to Output for LCD Databus und LCD
Steuerbus
  LCD_Port_DDR = LCD_DataInput+(1<<LCD_RS | 1<<LCD_RW | 1<<LCD_E);
  //Lesesignal setzen
  sbi(LCD_Port_Write,LCD_RW); //Zum Lesen RW-Pin = High
  //Soll ins Seuer oder Datenregister geschrieben werden?
  if (CD == 0)
    {
    cbi(LCD_Port_Write,LCD_RS); //RS = 0 Steuerregister
    }
    else
    {
    sbi(LCD_Port_Write,LCD_RS); //RS = 1 Dataregister
    }
  sbi(LCD_Port_Write,LCD_E); //Daten stehen an wenn Enable = High
  for (int a=0;a<100;a++)   //Wartet ein bisschen bis daten anliegen
  {
  }
  Data = (LCD_Port_Read&0x0F)<<4; //Lesen des 1. Nibble (MSB)
  cbi(LCD_Port_Write,LCD_E);

  sbi(LCD_Port_Write,LCD_E); //Daten stehen an wenn Enable = High
  for (int a=0;a<100;a++)   //Wartet ein bisschen bis daten anliegen
  {
  }
  Data += (LCD_Port_Read&0x0F); //Lesen des 2. Nibble (LSB)
  cbi(LCD_Port_Write,LCD_E);
return(Data);
}

void LCD_Print (char zeile,char spalte,char *Buffer,...)
{
  // Hilfsvariable zum Zählen der ausgegebenen Zeichen
  char nFieldWidth = 0;

  struct {
    char     fLeftJust:1;   // Feldausrichtung links oder rechts
    char     fNegative:1;   // Auszugebende Zahl ist negativ.
  } flags;

  #define SCRATCH 16
  unsigned char scratch[SCRATCH];
  unsigned char format_flag;
  unsigned int u_val=0, base=0;
  unsigned char *ptr;
  char     hexA = 'a';
  char *p;
  int   n;
  int nLen;
  va_list ap;

  va_start (ap, Buffer);
  //Berechnet Adresse für die Zeile und schreibt sie ins DD-Ram
  if (zeile >= Init_LCD_Zeilen) //wurden mehr Zeilen angegeben als
Initialisiert
    {
    zeile = Init_LCD_Zeilen - 1;
    }
  zeile = 0x80/Init_LCD_Zeilen*zeile;
  zeile += spalte;
  if (zeile >= 0x80) //ist der Wert ausserhalb des DD-Ram Adresse
    {
    zeile = 0x7F;
    }
  zeile += 0x80;
  Write_LCD (zeile,0);

  while (*Buffer != 0)
    {
    if (*Buffer == '%')
      {
      *Buffer++;
      switch (format_flag = *Buffer++){

        case 'c':
           format_flag = va_arg(ap,int);
           Write_LCD (format_flag++,1);

        case 'i':
        case 'd':
        case 'u':
                base = 10;
                goto CONVERSION_LOOP;
        case 'o':
                base = 8;
                goto CONVERSION_LOOP;

        case 'X':
                hexA = 'A';
                // Weiter wie 'x'
        case 'x':
                base = 16;
         }

        CONVERSION_LOOP:
                u_val = va_arg (ap, int);
        n = u_val;
                flags.fNegative = 0;
                if (format_flag == 'd' || format_flag == 'i') {
                    // Negative Werte auswerten
                    if (((int) u_val) < 0) {
                        flags.fNegative = 1;
                        u_val = -u_val;
                    }
                }
                // Der Scratchpuffer wird von rechts nach links
aufgefüllt
                // beginnend mit dem niederwertigsten Digit.
                ptr = scratch + SCRATCH;
                *--ptr = 0;     // Abschliessendes NULL-Byte eintragen
                do
        {
          char ch = u_val % base + '0';
                    if (ch > '9') ch += hexA - '9' - 1;
                    *--ptr = ch;
          u_val /= base;
                } while (u_val);

        if (n < base) *--ptr = '0';
                if (flags.fNegative) *--ptr = '-';
          // Länge bestimmen
          p = ptr;
          nLen = 0;
          while (*p++) nLen++;
        // Feld bei Bedarf links auffüllen
        if (!flags.fLeftJust) {
        for (n=nLen; n < nFieldWidth; n++) Write_LCD (' ',1);
        }
        // Pufferinhalt schreiben
        for (n=0; n < nLen; n++) Write_LCD (*ptr++,1);
        // Feld bei Bedarf rechts auffüllen
        if (flags.fLeftJust) {
        for (n=nLen; n < nFieldWidth; n++) Write_LCD (' ',1);
        }
      }
    Write_LCD (*Buffer++,1);
    }
  va_end(ap);
}

void LCD_Clear (void)
{
  Write_LCD (1,0); //Clear Display
  Write_LCD (0x80,0);  //Set DD-Ram Adresse = 0
}



LCD.h:

/*
 Copyright:      Radig Ulrich  mailto: mail@ulrichradig.de
 Author:         Radig Ulrich
 Remarks:
 known Problems: none
 Version:        28.05.2004
 Description:    Programm zur Ansteuerung eines Standart LCD
         (HD44870),(SED1278F) und kompatible
*/

//LCD_D0 - LCD_D3 connect to GND
//Im 4Bit Mode LCD_D4-->PORTx.0 ........ LCD_D7-->PORTx.3
//LCD_RS --> PORTx.4 | LCD_RW --> PORTx.5 | LCD_E --> PORTx.6 |
PORTx.7-->NotConnect

#define Init_LCD_Zeilen      2     //Anzahl der Zeilen 1,2 oder 4

#define LCD_Port_DDR      DDRC  //Port an dem das Display angeschlossen
wurde
#define LCD_Port_Write      PORTC
#define LCD_Port_Read      PINC

#define LCD_RS          4     //Pin für RS
#define LCD_RW          5    //Pin für Read/Write
#define LCD_E          6     //Pin für Enable

#define LCD_DataOutput      0x0f
#define LCD_DataInput      0x00

#define BusyBit          7



Ist ein ganz ganz dringendes Problem und ich würde mich sehr über eure
Antworten freuen...

Danke im Vorraus

saschisch

von Hubert.G (Gast)


Lesenswert?

Was sagt dein Compiler?
Das LCD_clear im Hauptprogramm löscht das Disp immer, da wirst du kaum
was sehen

von Franz H. (Gast)


Lesenswert?

Wo ist dein Problem? Ein fremdes Programm benutzen und sich wundern
warum es nicht funktioniert... Hast du Fehlermeldungen? Schon mal
überprüft ob die Port-Pins übereinstimmen. Er benutzt Schleifen in dem
Programm für einen Delay, hast du einen schnelleren Quartz und die
Schleifen müssen vergrößert werden?
Um etwas daraus zu lernen würde ich (AVR-Tutorial LCD-Display) den
dortigen Assembler Code für die Initialisierung in C umsetzen und dann
Schritt für Schritt weitergehen...

von saschisch (Gast)


Lesenswert?

Danke für eure Antworten!

Also der Compiler gibt mir weder einen Fehler noch eine Warnung (!).
Das Programm sollte eine Schleife bis 255 durchlaufen und jeden
Inkrementierungsvorgang anzeigen. Tuts aber nicht. Pins sind alle
richtig angeschlossen (min 20x überprüft :~) )

Ein Problem ist mir aber selbst aufgefallen:
#define BusyBit          7

das wäre der 8. Pin und den haben wir beim Aufbau zerstört (!)
Kann das der fatale Fehler sein?

MfG

saschisch

von Frank G. (Gast)


Lesenswert?

Eigentlich nicht, dein Programm fragt den Pin nicht ab, sondern benutzt
eine Zeitschleife.

von synonym (Gast)


Lesenswert?

bin eigentlich voll der noob und kenn mich mit bildschirmen nicht ganz
so doll aus, möchte aber wissen, ob es möglich ist, dass ein
lcd-bildschirm schaden nimmt, wenn er, nachdem der pc runtergefahren
ist, einfach von stromnetzt abgeschaltet wird, nichts standby oder
ausschalten, einfach strom weg, während er noch läuft...
ich befürchte dass die lc´s eben in ihrer struktur oder position oder
sonst was verändert werden, und das, wenn vielleicht nicht gleich ganz
zum knock out, aber doch zu einigen bildstörungen führen könnte, also,
wäre super wenn mir irgendwer irdendwie weiterhelfen könnte...
danke im voraus

von Simon K. (simon) Benutzerseite


Lesenswert?

ich glaub bei dir piepts..

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.