Forum
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
Gesamter Thread:

