Forum

Einloggen | Registrieren | RSS  

Thomas Kunstmann

Nürnberg,
05.01.2012,
20:07
 

atmega8 vs HD44780 (Computertechnik)

Hallo,

ich bin seit ein paar Tagen daran ein Display mit einem atmega zu steuern - es geht bereits alles, was mit Ausgabe zu tun hat. Jetzt wollte ich noch die beiden Funktionen zum Lesen implementieren, um einmal gesetzte Werte zurück lesen zu können.

Ich habe jede Menge Quellcodebeispiele gesehen, Datenblätter durchgelesen, recherchiert, etc - es muss daran liegen, dass ich ein grundsätzliches Verständnisproblem habe.

Die Datenleitungen liegen für besseres Platinenrouting nicht alle an einem Port, deshalb habe ich für jeden Port ein define ähnlich dem folgenden:
#define DATA0 PC4
#define DATA0_DDR DDRC
#define DATA0_PORT PORTC
#define DATA0_PIN PINC

Grundsätzlich ist die Ausgabe die eigentliche Aufgabe und deshalb soll die Lesefunktion die PORTs auf Input stellen, lesen und danach wieder als Output konfigurieren.

Meine Lesefunktion sieht so aus:

unsigned char readRegister(unsigned char rs)
{
// set ports as inputs
DATA0_DDR &= ~_BV(DATA0);
DATA1_DDR &= ~_BV(DATA1);
DATA2_DDR &= ~_BV(DATA2);
DATA3_DDR &= ~_BV(DATA3);
DATA4_DDR &= ~_BV(DATA4);
DATA5_DDR &= ~_BV(DATA5);
DATA6_DDR &= ~_BV(DATA6);
DATA7_DDR &= ~_BV(DATA7);

// enable pull up resistors
DATA0_PORT &= ~_BV(DATA0);
DATA1_PORT &= ~_BV(DATA1);
DATA2_PORT &= ~_BV(DATA2);
DATA3_PORT &= ~_BV(DATA3);
DATA4_PORT &= ~_BV(DATA4);
DATA5_PORT &= ~_BV(DATA5);
DATA6_PORT &= ~_BV(DATA6);
DATA7_PORT &= ~_BV(DATA7);

// set RS
if( rs ) SET_BIT(RS_PORT, RS);
else CLEAR_BIT(RS_PORT, RS);

// set RW to r
SET_BIT(RW_PORT, RW);

// set EN
SET_BIT(EN_PORT, EN);

// clear EN
CLEAR_BIT(EN_PORT, EN);

if( !(DATA0_PIN & _BV(DATA0)) )
{ data |= 0b00000001; }
if( !(DATA1_PIN & _BV(DATA1)) )
{ data |= 0b00000010; }
if( !(DATA2_PIN & _BV(DATA2)) )
{ data |= 0b00000100; }
if( !(DATA3_PIN & _BV(DATA3)) )
{ data |= 0b00001000; }
if( !(DATA4_PIN & _BV(DATA4)) )
{ data |= 0b00010000; }
if( !(DATA5_PIN & _BV(DATA5)) )
{ data |= 0b00100000; }
if( !(DATA6_PIN & _BV(DATA6)) )
{ data |= 0b01000000; }
if( !(DATA7_PIN & _BV(DATA7)) )
{ data |= 0b10000000; }

// set RW to w
CLEAR_BIT(RW_PORT, RW);

// reset ports as outputs
DATA0_DDR |= _BV(DATA0);
DATA1_DDR |= _BV(DATA1);
DATA2_DDR |= _BV(DATA2);
DATA3_DDR |= _BV(DATA3);
DATA4_DDR |= _BV(DATA4);
DATA5_DDR |= _BV(DATA5);
DATA6_DDR |= _BV(DATA6);
DATA7_DDR |= _BV(DATA7);

return data;
}

Leider hat data nie einen anderen Wert als 0x00...

Falls jemand konstruktive Vorschläge hat wäre ich dankbar, auch für Links auf ähnliche Projekte wären toll (viele kenne ich zwar mittlerweile, aber was solls).

Vielen Dank im Voraus für die Mühe!

Thomas

geralds(R)

Homepage E-Mail

Wien, AT,
05.01.2012,
20:40
(editiert von geralds
am 05.01.2012 um 20:51)


@ Thomas Kunstmann

atmega8 vs HD44780

» recherchiert, etc - es muss daran liegen, dass ich ein grundsätzliches
» Verständnisproblem habe.
»
----

Hi Thomas,

Ja du hast Verständnisprobleme:

Du setzt den Mega 8 "VERSUS" Display - Displaycontroller.
-- also gegen ,,,,

Das würde bedeuten, dass der Mega den Displaycontroller nachbilden soll.
Aber das ist nicht notwendig. :)

--->
Das Ansteuern des Display mit dem Controller HC44780 ist sehr einfach.

Dazu hat Atmel auf ihrer Webseite ein komplettes Demo, brauchst nur abschreiben.

Du kannst auch auf der www.mikrocontroller.net auch so eine Demo anschauen.

http://www.mikrocontroller.net/articles/AVR-Tutorial:_LCD

Das Auslesen in den Mega hinein bedeutet ein Umschalten des Datenports auf Lesen, richtig.
Bevor du jedoch lesen kannst, musst du den Display-Controller darauf vorbereiten, ,mit dem passenden Register Befehl.
Erst dann schaltest auf Lesen um.
Achtung dabei, ob irgend welche Port-Pull_up Widerstände aktiviert worden sind.

-- das alles, die Programmierreihenfolge, steht im HD44780 Programmier-Handbüchlein.
Dort steht auch, 'was' so alles aus dem Display lesbar ist.
http://www.mikrocontroller.net/articles/HD44780
http://www.sprut.de/electronic/lcd/

Grüße
Gerald

--
...und täglich grüßt der PC:
"Drück' ENTER! :wink: Feigling!"

79616363(R)

E-Mail

Leinfelden-Echterdingen,
06.01.2012,
12:20
(editiert von 79616363
am 06.01.2012 um 12:37)


@ Thomas Kunstmann

atmega8 vs HD44780

» #define DATA0 PC4
» #define DATA0_DDR DDRC
» #define DATA0_PORT PORTC
» #define DATA0_PIN PINC
»
» Grundsätzlich ist die Ausgabe die eigentliche Aufgabe und deshalb soll die
» Lesefunktion die PORTs auf Input stellen, lesen und danach wieder als
» Output konfigurieren.
»
» Meine Lesefunktion sieht so aus:
»
» unsigned char readRegister(unsigned char rs)
» {
» // set ports as inputs
» DATA0_DDR &= ~_BV(DATA0);
» DATA1_DDR &= ~_BV(DATA1);
» DATA2_DDR &= ~_BV(DATA2);
» DATA3_DDR &= ~_BV(DATA3);
» DATA4_DDR &= ~_BV(DATA4);
» DATA5_DDR &= ~_BV(DATA5);
» DATA6_DDR &= ~_BV(DATA6);
» DATA7_DDR &= ~_BV(DATA7);
»
» // enable pull up resistors
» DATA0_PORT &= ~_BV(DATA0);
» DATA1_PORT &= ~_BV(DATA1);
» DATA2_PORT &= ~_BV(DATA2);
» DATA3_PORT &= ~_BV(DATA3);
» DATA4_PORT &= ~_BV(DATA4);
» DATA5_PORT &= ~_BV(DATA5);
» DATA6_PORT &= ~_BV(DATA6);
» DATA7_PORT &= ~_BV(DATA7);
»
» // set RS
» if( rs ) SET_BIT(RS_PORT, RS);
» else CLEAR_BIT(RS_PORT, RS);
»
» // set RW to r
» SET_BIT(RW_PORT, RW);
»
» // set EN
» SET_BIT(EN_PORT, EN);
»
» // clear EN
» CLEAR_BIT(EN_PORT, EN);
»
» if( !(DATA0_PIN & _BV(DATA0)) )
» { data |= 0b00000001; }
» if( !(DATA1_PIN & _BV(DATA1)) )
» { data |= 0b00000010; }
» if( !(DATA2_PIN & _BV(DATA2)) )
» { data |= 0b00000100; }
» if( !(DATA3_PIN & _BV(DATA3)) )
» { data |= 0b00001000; }
» if( !(DATA4_PIN & _BV(DATA4)) )
» { data |= 0b00010000; }
» if( !(DATA5_PIN & _BV(DATA5)) )
» { data |= 0b00100000; }
» if( !(DATA6_PIN & _BV(DATA6)) )
» { data |= 0b01000000; }
» if( !(DATA7_PIN & _BV(DATA7)) )
» { data |= 0b10000000; }
»
» // set RW to w
» CLEAR_BIT(RW_PORT, RW);
»
» // reset ports as outputs
» DATA0_DDR |= _BV(DATA0);
» DATA1_DDR |= _BV(DATA1);
» DATA2_DDR |= _BV(DATA2);
» DATA3_DDR |= _BV(DATA3);
» DATA4_DDR |= _BV(DATA4);
» DATA5_DDR |= _BV(DATA5);
» DATA6_DDR |= _BV(DATA6);
» DATA7_DDR |= _BV(DATA7);
»
» return data;
» }
»
» Leider hat data nie einen anderen Wert als 0x00...

Hallo Thomas, ich seh auch nirgends eine Definition der Variablen data noch sehe ich, dass der Variablen irgendwo ein Wert zugewiesen wird. Mich wundert, dass der Compiler da net mault - Oder schwirrt da irgendwo ne globale Variable 'data' rum? Wär böser Stil ;-)

Ups ja, doch, data wird was zugewiesen - Moment - Muss nochmal genau gucken - Aber lass das bitte mit den globalen Variablen - Das macht man nur sehr sehr ungern ...

Hmm, was ist das Makro _BV? Hat das Seiteneffekte? ...


Nachtrag: Vergiss die Antwort - War Blödsinn. Gerald liegt richtig ...

--
„Wo kämen wir hin, wenn jeder sagte, wo kämen wir hin und keiner ginge, um zu sehen, wohin wir kämen, wenn wir gingen.“

(Kurt Marti)