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
Was sagt dein Compiler? Das LCD_clear im Hauptprogramm löscht das Disp immer, da wirst du kaum was sehen
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...
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
Eigentlich nicht, dein Programm fragt den Pin nicht ab, sondern benutzt eine Zeitschleife.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.