PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : EA DIP204-4 an Atmega48



Thalhammer
08.12.2012, 14:01
Hallo,
Ich habe mir ein Display EA DIP204-4 von reichelt schicken lassen, das einen KS0073 Kontroller enthält und das ich nun über 4Bit ansteuern will.
Ich habe dazu schon ein wenig gegooglet und unter anderem das gefunden:
http://www.mikrocontroller.net/topic/79603
Also schnell auf einen mega48 geflasht, drähte an das Display und an mein MyAVR mit dem kontroller gehangen, damals noch Steuer und Datensignale auf verschiedenen PORTS.
Jetzt hab ich den controller auf die Platine gelötet (leider ohne sockel, da er sonst nicht unter das Display passt) und die Pins in der Lib geändert.
Doch jetzt passiert plötzlich nichts mehr.
Ich bin langsam am verzweifeln, denn das Display initialisiert nicht.
Der Controller funktionierd noch und das Display dürfte eigentlich auch nicht defekt sein.
Ich vermute mal das es daran liegt, dass ich jetzt Steuer und Daten auf einem Port habe (RS PD3,E PD2,D0-D3=PD4-7) und es vorher verschiedene waren. Zudem sollte, wenn ich das Programm richtig verstanden habe nach der Ausführung RS auf High liegen, was es aber nicht tut.
Könnte da vieleicht mal jemand drüber schauen ?
Verdrahtung hab ich inzwischen 3x mal durchgemessen und nichts gefunden.

MFG Thalhammer

// EDIT: Hab den Fehler glaub ich gefunden:

LCD_DATAPORT=(byte&0b11110000); //1. High Nibble senden
display_enable();
LCD_DATAPORT=(byte<<4); //2. Low Nibble senden
display_enable();
Überschreibt doch meiner Meinung nach den ganzen Port oder ?
Wie kann man das ändern, damit nur die oberen 4 überschrieben werden, ohne zuviel performance zu verlieren ? ?
//EDIT2:

LCD_DATAPORT&=(byte&0b11110000); //1. High Nibble senden
display_enable();
LCD_DATAPORT&=(byte<<4);
Sollte dass nicht eigentlich das Problem beheben ?
Tut es jedenfalls nicht.

//EDIT:
Hat denn wirklich keiner ne Idee ?
Ich bin jetzt mittlerweile alles durch, D0-D3 auf GND gelegt, RES auf HIGH,PINS vom UC abgelötet und wieder über drähte mit meinem MyAVR Board verbunden und die Original software probiert, nichts.
Ich kappiers einfach nicht, was mach ich falsch ?
Das Teil macht garnichts, keine Schwarzen balken, einfach nichts, als währe es nicht mit Strom verbunden.
Bei der Kontrastspannung bin ich mitlerweile schon so ziehmlich alles durch, von 5V bis auf GND, es wird nichts angezeigt.
Mensch könnte sich vieleicht mal irgendwer dazu äußern und sei es nur dass er keine Ahnung hat ?
Ich dreh gleich durch.

021aet04
09.12.2012, 22:14
Grundsätzlich ist dein Programm falsch aufgebaut. Du schreibst alles in die Headerdatei. Normalerweise hat man aber 2 Dateien, einer h-und einer c-Datei (abgesehen von der C-Datei mit der main). In die Headerdatei schreibt man die defines,... und in die c-Datei die einzelnen Funktionen.

Was mir aufgefallen das du immer nur 2ms als Pausen hast. Hier findest du mehr http://www.mikrocontroller.net/articles/AVR-Tutorial:_LCD
Etwas genaueres zum Thema Init findest du hier: http://www.mikrocontroller.net/articles/AVR-Tutorial:_LCD#Initialisierung_des_Displays

Das ist meine Init-Routine


void LCD_Init(void)
{
DDRC |= 0x0F; //PC0 - PC3 als Ausgang
DDRB |= (1<<PB6) | (1<<PB7); //RS und EN als Ausgang

_delay_ms(15);
LCD_Ctrl (0x28);

_delay_ms(5);
LCD_Ctrl (0x28);

_delay_ms(1);
LCD_Ctrl (0x28);

/* 0b00001DCB
0 1
D: Display
aus ein
C: Cursor
aus ein
B: Blinken
aus ein
0x0F: Display ein, Cursor sichtbar, Blinken ein
0x0E: Display ein, Cursor sichtbar, Blinken aus
0x0C: Display ein, Cursor unsichtbar, Blinken aus

*/
_delay_ms(1);
LCD_Ctrl (0x0C);

_delay_ms(1);
LCD_Ctrl (0x01);

_delay_ms(1);
LCD_Ctrl (0x02);

_delay_ms(5);

}


Ich hoffe das ich dir helfen konnte.

MfG Hannes

Thalhammer
10.12.2012, 16:53
Das das Programm nicht perfekt aufgebaut ist ist mir schon klar, auserdem ist es nicht mein code, sondern ich hab ihn aus dem oben verlinkten Beitrag übernommen.
Dein Beispiel hilft mir jetzt insofern wenig, da du die LCD_Ctrl routine nicht postest.
Ist dein Beispiel den für das DIP204-4 ?
Da das Display allerdings schonmal funktionierd hat bin ich nur entweder zu blöd den gleichen versuchsaufbau nochmal zu machen oder ich hab das Display wirklich geschrottet.
Naja wie dem Auch sei funktionierd es nicht und ich werde mir vermutlich ein neues besorgen.
Ein indiz dafür das es nicht das Beste ist könnte sein das Reichelt das Display nur eine Woche nachdem ich es gekauft hab nicht mehr im Sortiment hat und es auf der Website von denen nicht für neue Designs empfohlen wird.
Was würdet ihr mir den für ein Display empfehlen ?
Sollte möglichst 20x4 sein und ambesten genauso groß die das.
Sollte aber was sein, das öfter verwendet wird, so dass ich leicht einen Beispielcode finde.
Was den Preis angeht gilt das übliche, so günstig wie möglich aber so teuer wie nötig.

021aet04
10.12.2012, 22:05
Sorry, stimmt das ich nicht alles gepostet habe.

Hier ist meine gesamte c-Datei:


#include "HD44780.h"

void LCD_Ctrl (unsigned char data)
{

PORTB &= ~(1<<RS);

//erstes Nibble

PORTC = ((data & 0xF0)>>4);
PORTB |= (1<<EN);
asm volatile ("nop");
PORTB &= ~(1<<EN);

//zweites Nibble

PORTC = data & 0x0F;
PORTB |= (1<<EN);
asm volatile ("nop");
PORTB &= ~(1<<EN);

_delay_us(100);

}

void LCD_Home (void)
{
//Display löschen und auf Homeposition setzen
LCD_Ctrl (0x01);
_delay_ms(1);
LCD_Ctrl (0x02);
_delay_ms(5);
}

void LCD_Data (unsigned char data)
{
_delay_us(100);

//erstes Nibble

PORTC = ((data & 0xF0)>>4);
PORTB |= (1<<RS);
PORTB |= (1<<EN);
asm volatile ("nop");
PORTB &= ~(1<<EN);

//zweites Nibble

PORTC = data & 0x0F;
PORTB |= (1<<RS);
PORTB |= (1<<EN);
asm volatile ("nop");
PORTB &= ~(1<<EN);

PORTB &= ~(1<<RS);

_delay_us(100);
}

void LCD_Init(void)
{
DDRC |= 0x0F; //PC0 - PC3 als Ausgang
DDRB |= (1<<PB6) | (1<<PB7); //RS und EN als Ausgang

_delay_ms(15);
LCD_Ctrl (0x28);

_delay_ms(5);
LCD_Ctrl (0x28);

_delay_ms(1);
LCD_Ctrl (0x28);

/* 0b00001DCB
0 1
D: Display
aus ein
C: Cursor
aus ein
B: Blinken
aus ein
0x0F: Display ein, Cursor sichtbar, Blinken ein
0x0E: Display ein, Cursor sichtbar, Blinken aus
0x0C: Display ein, Cursor unsichtbar, Blinken aus

*/
_delay_ms(1);
LCD_Ctrl (0x0C);

_delay_ms(1);
LCD_Ctrl (0x01);

_delay_ms(1);
LCD_Ctrl (0x02);

_delay_ms(5);

}

void LCD_Pos (unsigned int zeile, unsigned int spalte)
{
LCD_Ctrl (0x80 + spalte - 1+ 0x40 * (zeile - 1));
_delay_us (100);
}

void LCD_String (char text [20])
{
unsigned int i=0;

while ((!(text[i] == 0)) & (i < 20))
{
LCD_Data (text[i]);
i++;
}
}

void LCD_Integer (unsigned int data)
{
unsigned char a;

a = (data % 10000)/1000; //Tausender
LCD_Data (a + 48);

a = (data % 1000)/100; //Hunderter
LCD_Data (a + 48);

a = (data % 100)/10; //Zehner
LCD_Data (a + 48);

a = data % 10; //Einer
LCD_Data (a + 48);

}


und die h-Datei:


#include <avr/io.h>
#include <stdio.h>
#include <stdlib.h>
#include <util/delay.h>

#define RS PB7
#define EN PB6


Hier findest du etwas über LCDs http://www.pacificdisplay.com/lcd_mod_if.htm
Schau dir einmal die erste PDF an (How to use a Character Display Module - Part 1 (http://www.pacificdisplay.com/misc/epe_mag/how_to_use_cdm_1.pdf)), dort steht wie du die mit Tasten ansteuern kannst. Zum Testen ist es so optimal. So kannst du Programmfehler ausschließen.

PS: Ich habe ein HD44780-Display angesteuert (ein 2x16). Dieser sollte aber mit dem KS0073 kompatibel sein bzw mit leichten Änderungen anzusteuern sein.

MfG Hannes

Thalhammer
11.12.2012, 12:42
PS: Ich habe ein HD44780-Display angesteuert (ein 2x16). Dieser sollte aber mit dem KS0073 kompatibel sein bzw mit leichten Änderungen anzusteuern sein.
Der haken ist, das der KS eben nur NAHEZU kompatibel ist, da bei ihm die Init anders aufgebaut ist.

Hubert.G
11.12.2012, 13:37
Ich verwende immer die Lib. von Fleury, hier gibt es die Einstellung ob KS oder HD.
Das hat bei mir noch bei jedem LCD funktioniert.