mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Lcd Datenleitungen verkehrt angeschlossen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Armin P. (Firma: TFO bozen) (divinewolf)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo
Habe auf meiner Platine eine LCD Anzeige
Leider habe ich die vier Datenleitungen verkehrt angeschlossen(4bit 
modus)
Ich habe die Bibliothek "lcd-routines" die auf auf dieser Seite im lcd 
tutorial verwendet werden
Gibt es irgend eine einfache Lösung die Software so zu ändern, dass ich 
dieses Problem beheben kann?
Lg

: Bearbeitet durch User
Autor: Dieter F. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja

Autor: Armin P. (Firma: TFO bozen) (divinewolf)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Dieter F. schrieb:
> Ja

Könntest du mir dabei helfen?

Autor: svenska å (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Schreib' dir doch zwei Funktionen, die das entsprechend korrigieren und 
hänge die an Stellen, wo gelesen oder geschrieben wird in den Code der 
Library ein.
Geht ziemlich simpel mit z.b. einer Lookup-Tabelle.

Autor: Bleibtreu (Gast)
Datum:

Bewertung
-2 lesenswert
nicht lesenswert
Armin P. schrieb:
> Dieter F. schrieb:
>> Ja
>
> Könntest du mir dabei helfen?

Kann er bestimmt.

Autor: Dieter F. (Gast)
Datum:

Bewertung
2 lesenswert
nicht lesenswert
Armin P. schrieb:
> Könntest du mir dabei helfen?

Gerne - wenn ich nähere Informationen hätte :-)

Armin P. schrieb:
> Leider habe ich die vier Datenleitungen verkehrt angeschlossen

??? Schaltplan - richtig / falsch

Armin P. schrieb:
> die auf auf dieser Seite im lcd
> tutorial

Vermutlich hier, auf "microcontroller.net" aber ein Link wäre hilfreich 
..

Armin P. schrieb:
> die Software

Kennt hier niemand ...

LG Dieter

Autor: priot (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Armin P. schrieb:
> Dieter F. schrieb:
>> Ja
>
> Könntest du mir dabei helfen?

Einfach die 4 Bits geeignet umsortieren, bevor Du
sie auf den Port schreibst.
Das geht mit Schiebe- und Maskierbefehlen (AND, OR, NOT, etc)

Autor: Dieter F. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
priot schrieb:
> geeignet

Ja, da liegt der Schmackes - wenn es das wirklich ist.

Autor: Matthias S. (Firma: matzetronics) (mschoeldgen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In der LCD Lib von Peter Fleury kannst du die Datenleitungen einzeln 
bestimmen. Sie sollten nur auf dem gleichen Port sein:
http://homepage.hispeed.ch/peterfleury/avr-software.html

Autor: Dieter F. (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Matthias S. schrieb:
> In der LCD Lib von Peter Fleury kannst du die Datenleitungen einzeln
> bestimmen.

So lange er nichts offen legt kann auch niemand helfen - oder?

Autor: priot (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dieter F. schrieb:
> priot schrieb:
>> geeignet
>
> Ja, da liegt der Schmackes - wenn es das wirklich ist.

Da wird er selber sicher drauf kommen, wenn er falschen und richtigen 
Anschluss vergleicht..., glaube ich...
Es sind ja angeblich nur die Datenleitungen falsch angeschlossen 
(vertauscht, irgendwie...)

Autor: Wolfgang (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Armin P. schrieb:
> Leider habe ich die vier Datenleitungen verkehrt angeschlossen(4bit
> modus)

Das kommt jetzt ein bisschen drauf an, wie verkehrt du sie 
angeschlossen hast. Eventuell reicht es schon, wenn du in der Funktion 
lcd_out() den Aufruf von mirror() auskommentierst oder an dein 
Pinverdrehung anpasst.

Autor: Armin P. (Firma: TFO bozen) (divinewolf)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
>> Könntest du mir dabei helfen?
>
> Gerne - wenn ich nähere Informationen hätte :-)

Software
https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung

Schaltplan und Software im Anhang

Autor: Armin P. (Firma: TFO bozen) (divinewolf)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wolfgang schrieb:
> Armin P. schrieb:
>> Leider habe ich die vier Datenleitungen verkehrt angeschlossen(4bit
>> modus)
>
> Das kommt jetzt ein bisschen drauf an, wie verkehrt du sie
> angeschlossen hast. Eventuell reicht es schon, wenn du in der Funktion
> lcd_out() den Aufruf von mirror() auskommentierst oder an dein
> Pinverdrehung anpasst.

Ich haben sie anstatt in aufsteigender Reihenfolge in absteigender 
angeschlossen

Autor: Wolfgang (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Armin P. schrieb:
> Ich haben sie anstatt in aufsteigender Reihenfolge in absteigender
> angeschlossen

Dann musst du also in der Software von den 4 Bit nur das 1te mit dem 
4ten und das 2te mit dem 3ten vertauschen. Guck dir einfach mal an, was 
in mirror() bei den Bit-Operationen passiert. Das sind überschaubare 3 
Zeilen Code.

Autor: Armin P. (Firma: TFO bozen) (divinewolf)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Wolfgang schrieb:
> Armin P. schrieb:
>> Ich haben sie anstatt in aufsteigender Reihenfolge in absteigender
>> angeschlossen
>
> Dann musst du also in der Software von den 4 Bit nur das 1te mit dem
> 4ten und das 2te mit dem 3ten vertauschen. Guck dir einfach mal an, was
> in mirror() bei den Bit-Operationen passiert. Das sind überschaubare 3
> Zeilen Code.

Muss ich die highbits oder lowbits vertauschen?

Autor: georg (Gast)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Armin P. schrieb:
> Muss ich die highbits oder lowbits vertauschen?

Ein Programmierer der halbwegs bei Verstand ist benutzt für 4 Bits die 
untere Hälfte des Bytes - aber so wie du fragst kann man das bei dir 
nicht voraussetzen. Aber wir wissen darüber noch weniger als du, soweit 
das möglich ist.

Georg

Autor: Wolfgang (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Armin P. schrieb:
> Muss ich die highbits oder lowbits vertauschen?

Die, die du verdreht angeschlossen hast ;-)

Autor: Wolfgang (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
georg schrieb:
> Ein Programmierer der halbwegs bei Verstand ist benutzt für 4 Bits die
> untere Hälfte des Bytes

Zumindest bei vielen LCD sind sie als DB4 bis DB7 bezeichnet. Aber man 
achte auf den roten Hinweis - es kann auch anders sein.
https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung#Anschluss_an_den_Controller

Autor: Manni (Gast)
Datum:

Bewertung
-2 lesenswert
nicht lesenswert
am einfachsten wäre es die 4 Datenleitungen zu unterbrechen und mit ganz 
dünnen Draht richtig zuzuordnen.

Autor: Harald (Gast)
Datum:

Bewertung
4 lesenswert
nicht lesenswert
Manni schrieb:
> am einfachsten wäre es die 4 Datenleitungen zu unterbrechen und mit ganz
> dünnen Draht richtig zuzuordnen.

Quatsch! Mit Software ist das eine Kleinigkeit.

Autor: Manni (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Harald schrieb:
> Quatsch! Mit Software ist das eine Kleinigkeit.

Wenn mann hier aber nach Hilfe sucht die Alternative.

Autor: Joachim B. (jar)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Harald schrieb:
> Quatsch! Mit Software ist das eine Kleinigkeit.

für die einen die nicht wissen wie sie den Lötkolben halten sollen :)
andere tun sich mit dem Lötkolben leichter

Autor: Peter D. (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Armin P. schrieb:
> Gibt es irgend eine einfache Lösung die Software so zu ändern, dass ich
> dieses Problem beheben kann?

Man kann beliebige IO-Pins fürs LCD verwenden:
https://www.avrfreaks.net/forum/tutc-lcd-tutorial-1001

Autor: Matthias S. (Firma: matzetronics) (mschoeldgen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auch die o.a. Lib von Fleury kommt mit so einer Belegung ohne Klimmzüge 
klar.

: Bearbeitet durch User
Autor: my2ct (Gast)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Sonst ist vielleicht Arduino das richtige Framework.
Der Constructor erlaubt ebenfalls eine freie Definition der 
Pin-Zuordnung.
https://www.arduino.cc/en/Reference/LiquidCrystalConstructor

Beitrag #5427409 wurde von einem Moderator gelöscht.
Autor: Heinz R. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versuch mal:
unsigned char mirror( unsigned char n )
{
  n = ((n >> 1) & 0x55) | ((n << 1) & 0xaa);
  n = ((n >> 2) & 0x33) | ((n << 2) & 0xcc);
  // n = ((n >> 4) & 0x0f) | ((n << 4) & 0xf0);
  return n;
}

Nicht das ganze Byte spiegeln, nur die beiden Nibbles in sich (wg. 
Nibble Ausgabe).

Autor: Armin P. (Firma: TFO bozen) (divinewolf)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Heinz R. schrieb:
> Versuch mal:
>
>
> unsigned char mirror( unsigned char n )
> {
>   n = ((n >> 1) & 0x55) | ((n << 1) & 0xaa);
>   n = ((n >> 2) & 0x33) | ((n << 2) & 0xcc);
>   // n = ((n >> 4) & 0x0f) | ((n << 4) & 0xf0);
>   return n;
> }
> 
>
> Nicht das ganze Byte spiegeln, nur die beiden Nibbles in sich (wg.
> Nibble Ausgabe).

Danke müsste jetzt eigentlich funktionieren, macht es aber nicht...
rufe ich die Funktion mirror an der richtigen Stelle auf?

Autor: svenska å (Gast)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Scheint ein echt schwieriges Thema zu sein. Mit Cuttermesser, Lötkolben, 
Lötzinn und Fädeldraht wäre das ne sache von 15min, aber

Armin P. schrieb:
>> Nicht das ganze Byte spiegeln, nur die beiden Nibbles in sich (wg.
>> Nibble Ausgabe).
>
> Danke müsste jetzt eigentlich funktionieren, macht es aber nicht...
> rufe ich die Funktion mirror an der richtigen Stelle auf?

Stelle ist doch wie Original im Code.
Code zunächst auch.
Ich würde nur die Nibbles tauschen und diese nicht in sich verdrehen...
Also

unsigned char mirror( unsigned char n ) {
   return(((n >> 4) & 0x0f) | ((n << 4) & 0xf0));
}

Autor: Harald (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit C kennen ich mich nicht aus. Was macht diese Zeile (lcd-routine.c):
LCD_PORT &= ~(0xF0>>(4-LCD_DB));    // Maske löschen

Autor: Wolfgang (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Harald schrieb:
> Mit C kennen ich mich nicht aus. Was macht diese Zeile (lcd-routine.c):

Dann nimm irgendeine andere Programmiersprache du du verstehst oder 
lerne C.

Was genau verstehst du an der Zeile nicht.
C-Tutorien und Referenzen über bitweise Operatoren gibt es nun wirklich 
genug, z.B. https://en.wikipedia.org/wiki/Bitwise_operations_in_C

Autor: Harald (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wolfgang schrieb:
> Harald schrieb:
>> Mit C kennen ich mich nicht aus. Was macht diese Zeile (lcd-routine.c):
>
> Dann nimm irgendeine andere Programmiersprache du du verstehst oder
> lerne C.
>
> Was genau verstehst du an der Zeile nicht.
> C-Tutorien und Referenzen über bitweise Operatoren gibt es nun wirklich
> genug, z.B. https://en.wikipedia.org/wiki/Bitwise_operations_in_C

Es ist ja nicht nur das Was, sondern auch das Warum.

Wofür steht das "LCD_DB" im Ausdruck?

Ein kurze Erklärung würde mir weiterhelfen.

Autor: Armin P. (Firma: TFO bozen) (divinewolf)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da wäre PB 0 also 0 das erste Pin wo die Datenleitungen angeschlossen 
werden

Autor: Lötlackl *. (pappnase) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Wolfgang (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Harald schrieb:
> Wofür steht das "LCD_DB" im Ausdruck?

LCD_DB ist in der Datei lcd-routines.h deiner Library, den du nicht 
verlinkt hast, ziemlich am Anfang definiert als "PD0". Die Ersetzung 
macht der Preprozessor bevor der Sourcecode in den Compiler geht.
> #define LCD_DB        PD0

Autor: Dirk J. (dirk-cebu)
Datum:

Bewertung
2 lesenswert
nicht lesenswert
Harald schrieb:
> Quatsch! Mit Software ist das eine Kleinigkeit.

Aber nicht für den TO. In der Zeit, die er hier erfolglos im Thread 
verplempert, hätte er die paar Drähtchen schon 10 mal umlöten können,

Autor: Wolfgang (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Armin P. schrieb:
> Da wäre PB 0 also 0 das erste Pin wo die Datenleitungen angeschlossen
> werden

Ja und Nein
Das Ding heißt "PB0". Mit Leerzeichen dazwischen wird dir der Compiler 
das bestenfalls um die Ohren hauen oder - viel schlimmer - falls ein PB 
bei dir irgendwo definiert ist, heimlich irgendwelchen Mist machen, den 
du gar nicht beabsichtigst.
Computer machen immer das, was man ihnen sagt - nicht das, was man man 
meint.

Autor: Karl B. (gustav)
Datum:
Angehängte Dateien:

Bewertung
-1 lesenswert
nicht lesenswert
Dirk J. schrieb:
> Aber nicht für den TO. In der Zeit, die er hier erfolglos im Thread
> verplempert, hätte er die paar Drähtchen schon 10 mal umlöten können,

Hi,
also, ich mache erst eine Zeichnung.
Denn die Verwirrung wird sonst immer größer.

Wichtig:
vorab klären, wie das tatsächliche Pinout des LCDs aussieht.

Dann, der HD44780 Standard verlangt im 4-Bit-Modus immer zunächst das 
Highnibble. Dann im zweiten Durchgang das Lownibble. (Andersherum kommen 
andere Zeichen aus dem Zeichensatz heraus. z.B. ein griechischer 
Buchstabe "Sigma")
Daran soll man nichts ändern.

Dann die Portbelegung der tatsächlich verwendeten MCU.
Zum Beispiel: Der ATtiny2313 hat auf Port D nur 7 Bit.
(Einige Libs. verschieben durch "ror" einfach in der Routine.)

Die Ausgaberoutinen (nach erfolgreich verlaufener Initialisierung 
vorausgesetzt) bei 4-Bit:

Kopie des Ausgaberegisterinhalts (für Operation unten)
Ausmaskieren des Highnibble
Ausgeben, wenn Port die oberen 4-Bit verwendet.

Oder:
Jetzt schon swappen. Und ausgeben.

Im Zweiten Durchgang Ausgabe ohne Swappen.

Oder: genau andersherum, wenn Ausgabeport dan der MCU die "unteren" 4 
Bit verwendet.

Sind die Bits in sich verdreht.
ror
oder rol
vor die Ausgabe. Bis sie stimmen.

Wo liegt das Problem?

ciao
gustav

P.S.:
Über R1 bis R4 braucht man nicht diskutieren. Können entfallen. In der 
Mehrzahl der Fälle diese Anschlüsse einfach offenlassen. (Ausnahmen 
siehe Datenblatt für korrekte Beschaltung.)
Der rote Schrumpfschlauch wurde anschließend über die "Kreuzungen" 
geschoben und erhitzt.

: Bearbeitet durch User
Autor: Karl B. (gustav)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

: Bearbeitet durch User
Autor: Dieter F. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mach es erstmal simpel:
unsigned char mirror( uint8_t n )
{
  uint8_t temp = 0; 

  if (n & 0x80) temp+=0x10;
  if (n & 0x40) temp+=0x20;
  if (n & 0x20) temp+=0x40;
  if (n & 0x10) temp+=0x80;
  if (n & 0x08) temp+=0x01;
  if (n & 0x04) temp+=0x02;
  if (n & 0x02) temp+=0x04;
  if (n & 0x01) temp+=0x08;

  return temp;
}

Autor: Dieter F. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Streiche bitte meinen letzen Beitrag - nehme:
void lcd_out( uint8_t data )
{
  uint8_t temp = 0;

  if (data & 0x80) temp+=0x10;
  if (data & 0x40) temp+=0x20;
  if (data & 0x20) temp+=0x40;
  if (data & 0x10) temp+=0x80;
  
  LCD_PORT &= ~(0xF0>>(4-LCD_DB));    // Maske löschen
  
  LCD_PORT |= (temp>>(4-LCD_DB));     // Bits setzen
  
  lcd_enable();
}

Hatte übersehen, dass nur das obere Nibble interessant ist. Es braucht 
auch keine eigene Funktion - die paar "IF"s tuns auch so.

Autor: Karl B. (gustav)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
in asm sieht's vielleicht so aus:

ciao
gustav

Autor: Maxim B. (max182)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Armin P. schrieb:
> Gibt es irgend eine einfache Lösung die Software so zu ändern, dass ich
> dieses Problem beheben kann?

Es gibt nichts einfacher.

Du definierst beliebige Pins für beliebige Funktionen, und im Programm 
benutzt zu diese Def. Wenn du mal anders brauchst, änderst du nur diese 
Defs.

Beispiel:
lcd.h
#define LCD_PORT_DB4  PORTA
#define LCD_DDR_DB4    DDRA
#define LCD_PIN_DB4    PINA
#define LCD_DB4     PA5

#define LCD_PORT_DB5  PORTA
#define LCD_DDR_DB5    DDRA
#define LCD_PIN_DB5    PINA
#define LCD_DB5      PA6

#define LCD_PORT_DB6  PORTA
#define LCD_DDR_DB6    DDRA
#define LCD_PIN_DB6    PINA
#define LCD_DB6      PA7

#define LCD_PORT_DB7  PORTC
#define LCD_DDR_DB7    DDRC
#define LCD_PIN_DB7    PINC
#define LCD_DB7      PC7

#define LCD_PORT_RS    PORTA
#define LCD_DDR_RS    DDRA
#define LCD_RS      PA2

#define LCD_PORT_EN    PORTA
#define LCD_DDR_EN    DDRA
#define LCD_EN      PA4

#define LCD_WRITEDATA_US        46
#define LCD_COMMAND_US          42

lcd.c
static inline void lcd_enable_puls(void){
  LCD_PORT_EN |= (1<<LCD_EN);     // Enable auf 1 
  asm volatile("nop"); 
        asm volatile("nop"); 
        asm volatile("nop"); 
        asm volatile("nop"); 
        asm volatile("nop"); 
        asm volatile("nop"); 
        asm volatile("nop"); 
        asm volatile("nop"); 
    LCD_PORT_EN &= ~(1<<LCD_EN);    // Enable auf 0  
}

// Sendet eine 4-bit Ausgabeoperation an das LCD 
static void lcd_out( uint8_t data ) {

  LCD_PORT_DB4 &= ~(1<<LCD_DB4); 
  if (data & 0x10){
    LCD_PORT_DB4 |= (1<<LCD_DB4);
  }
  LCD_PORT_DB5 &= ~(1<<LCD_DB5);
  if (data & 0x20){
    LCD_PORT_DB5 |= (1<<LCD_DB5);
  }
  LCD_PORT_DB6 &= ~(1<<LCD_DB6);
  if (data & 0x40){
    LCD_PORT_DB6 |= (1<<LCD_DB6);
  }
  LCD_PORT_DB7 &= ~(1<<LCD_DB7);
  if (data & 0x80){
    LCD_PORT_DB7 |= (1<<LCD_DB7); 
  }

  lcd_enable_puls();
}


// Sendet ein Datenbyte an das LCD
void lcd_data( uint8_t data ) {

  LCD_PORT_RS |= (1<<LCD_RS);    // RS auf 1 
  lcd_out( data );            // zuerst die oberen, 
    lcd_out( data<<4 );         // dann die unteren 4 Bit senden

    _delay_us( LCD_WRITEDATA_US );

}

// Sendet einen Befehl an das LCD
void lcd_command( uint8_t data ) {

  LCD_PORT_RS &= ~(1<<LCD_RS);    // RS auf 0 
  lcd_out( data );             // zuerst die oberen, 
    lcd_out( data<<4);           // dann die unteren 4 Bit senden
 
    _delay_us(LCD_COMMAND_US );

}


Und so weiter...

: Bearbeitet durch User

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.