www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LCD Ausgabeport definieren


Autor: f1d1 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
habe das myavr Testboard gerade vor mir liegen und möchte das LCD Addon 
in Betrieb nehmen. Leider habe ich die Dokumentation verschlampt. :(

Nun also zu meinem eigentlichen Problem.

Ich möchte auf meinem LCD das Testprogramm hier aus dem Tutorial zum 
laufen bekommen. Das klappt bis hierhin auch eigentlich recht gut.

Nun muss ich aber die Eingangspins des LCDs, auf PortD pin 4,5,6,7 
legen.
Also D4 -> PortD4 , D5 -> PortD5 usw

In dem Quelltext der Headerdatei für das LCD steht folgender 
Codeabschnitt:
// Pinbelegung für das LCD, an verwendete Pins anpassen
 
#define LCD_PORT      PORTD
#define LCD_DDR       DDRD
#define LCD_RS        PD2
#define LCD_EN        PD3
// DB4 bis DB7 des LCD sind mit PD0 bis PD3 des AVR verbunden 

RS und EN habe ich mir schon angepasst auf meine Bedürfnisse.

Mein Problem besteht darin, den LCD_PORT nicht von Anfang PortD zu 
benutzen sondern von 4 an zugewiesen auf die Eingänge des LCDs.

Hoffe habe es ausführlich genug beschrieben.

Schonmal Danke im vorraus :)

Fidi

Autor: f1d1 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe die Antwort auf meine Frage gerade in einem anderen thread recht 
weit unten gefunden. Thread handelt eigentlich von einem anderen Thema 
aber Problem wird dort auch behandelt.

Darf man einträge im WIKI einfach ändern? Wäre gut, wenn das noch 
hineingeschrieben würde, wie es funktioniert.

Thread ist
Beitrag "LCD nicht nur für einen Port in C"

Autor: Gerhard O. (gerhard_)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn es hilft,

hier ist ein Auszug der Portzuweising unter CODEVISION AVR von einem 
Programm von mir:

// Display pin assignments
#define LCD_E               PORTC.4     // PC4
#define LCD_RS              PORTC.5     // PC5
#define LCD_WR              PORTC.6     // PC6
#define LCD_PORT            PORTC       // PC0-PC3

z. B. um das LCD_E zu anzusteuern:

LCD_E = 1; // setzt den E-pin
LCD_E = 0; // setzt den E-PIN zurrueck.

Hier ist ein Beispiel um ein Datenbyte an das LCD im 4-bit modus 
auszugeben:

void wr_disp(unsigned char data)
{
    unsigned char port_state;
    unsigned char indata;

    indata = data;                  // Make a copy for part 2

    port_state = LCD_PORT & 0xF0;   // Save Bits 7-4
    data = data >> 4;               // Shift data to lower nibble
    data = data & 0x0F;
    LCD_PORT = data | port_state;   // Combine data and saved nibble
    LCD_E = 1;                      // raise E
    #asm("nop");                    // notwendig bei AVR wegen clock
    LCD_E = 0;                      // drop E
    indata = indata & 0x0F;         // clear lower nibble
    LCD_PORT = indata | port_state; // Combine data and saved nibble
    LCD_E = 1;                      // raise E
    #asm("nop");                    // notwendig bei AVR wegen clock
    LCD_E = 0;                      // drop E

    delay_us(40);        // allow display time to accept the new data
}

Bei anderen Compilern musst Du das warscheinlich etwas aendern.

mfg,
Gerhard

Autor: f1d1 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dank dir für deine Hilfe,
aber in deinem Programm steckt auch genau das, was ich umgehen möchte :)

Und zwar oben bei der definierung des Ports.

#define LCD_PORT            PORTC       // PC0-PC3

Dort wird als Datenports PortC 0-3 verwendet. Also von unten aufgefüllt.

In meinem Programm wollte ich aber an PortD bei D4 beginnen. Also PortD4 
- PortD7.

Fidi

Autor: Gerhard O. (gerhard_)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Fidi,

Das macht gar nichts. Du brauchst nur das Datenbyte mit dem Shift 
Operator um 4-bits nach rechts (-> MSB) zu shiften:

#define LCD_PORT            PORTD       // PD0-PD3


// Shift the lower half of data right by 4 bits
LCD_PORT = (indata << 4) | port_state; // Fuer LSB Nibble
.
.
.
// mask off lower nibble
LCD_PORT = (indata & 0xF0) | port_state; // Fuer MSB Nibble

Jetzt wird das 4-bit Datenwort zwischen PD4-PD7 ausgegeben.

Was haeltst Du davon?

Gruss,
Gerhard

Autor: f1d1 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja,
das klingt ja super. Habe es jetzt anders gelöst, so wie in dem besagten 
Thread.
Allerdings klingt deine Lösung doch eleganter und weniger 
schreibaufwendig.

Werde das morgen mal ausprobieren.

Vielen Dank

Fidi

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.