www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LCD alternativ anschließen


Autor: Patrick L. (crashdemon)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe ein 2x16 Zeichen LCD an einem ATtiny2313 hängen. Damit sich ein 
einfacheres Platinenlayout einstellt habe ich jetzt die Pinbelegung 
alternativ belegt:

PD7 PD6 PD5 PD4 PD3 PD2 PD1 PD0
NC  NC  RS  EN  DB4 DB5 DB6 DB7   Jetzt
NC  NC  EN  RS  DB7 DB6 DB5 DB4   Vorher

So brauche ich in Eagle keine Drahtbrücken mehr. Problem sind die genau 
getauschten Datenpins, wie kann man das am elegantesten bewerkstelligen?

Autor: Helfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> PD7 PD6 PD5 PD4 PD3 PD2 PD1 PD0
> NC  NC  RS  EN  DB4 DB5 DB6 DB7   Jetzt
> NC  NC  EN  RS  DB7 DB6 DB5 DB4   Vorher
                  ^^^^^^^^^^^^^^^

D.h. du musst 4 Bits in Software drehen statt 1:1 den Tutorialcode zu 
übernehmen. Das ist grundsätzlich machbar, aber für Anfänger 
fehlerträchtig.

Autor: Helfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alternative #1: Nimm BASCOM. Dort kannst du die Pinzuordnung beim LCD 
frei konfigurieren.

Autor: Nett gemeint (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi
Beschäftige dich doch erst ein mal mit dem Programmieren dann mit dem 
Layout.
Sonst mutiert dein µC als "crashdemon" und du hast probleme und zu viel 
arbeit hinter/vor dir ;)
Grüße

Autor: Patrick L. (crashdemon)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> D.h. du musst 4 Bits in Software drehen statt 1:1 den Tutorialcode zu
> übernehmen. Das ist grundsätzlich machbar, aber für Anfänger
> fehlerträchtig.

Hehe, ja. Dachte da an soetwas wie einen Shift

0001
1000

0011
1100

0111
1110

Autor: Patrick L. (crashdemon)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nett gemeint schrieb:
> Hi
> Beschäftige dich doch erst ein mal mit dem Programmieren dann mit dem
> Layout.
> Sonst mutiert dein µC als "crashdemon" und du hast probleme und zu viel
> arbeit hinter/vor dir ;)
> Grüße

Das Programm steht schon, lief früher auf einem Atmega8 auf 
Streifenraster, da es dann mal ein wenig schöner werden sollte, platine 
etc. habe ich es dann auch gleich auf einem ATtiny portiert, der für 
meinen verwendungszweck mehr als ausreichend ist.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Pins füre LCD sind völlig egal, die kannst Du bunt durcheinander 
würfeln Und im h-File legst Du fest, auf welchem Port und Bit jeder 
liegt.

http://www.avrfreaks.net/index.php?name=PNphpBB2&f...


Peter

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Patrick Langosch schrieb:
> Dachte da an soetwas wie einen Shift
Das ist garantiert kein Bit-Shift. Beim Schieben bleibt die 
Bitreihenfolge prinzipiell gleich. Was du brauchst, ist ein Bit-Swap...

Autor: Helfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Brute Force
inline uint8_t swap_nibble(uint8_t in)
{
  return ((in & (1<<0))<<3) 
       | ((in & (1<<1))<<2) 
       | ((in & (1<<2))<<1)
       | ((in & (1<<3))<<0);
}

// dann 
LCD_DATA = (LCD_DATA & 0xF0) | swap_nibble(wert);

// statt 
LCD_DATA = (LCD_DATA & 0xF0) | wert;

Autor: avr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier mal was zum Umdrehn:
unsigned char umkehr(unsigned char n){
n=((n>>1)&0x55)|((n<<1)&0xaa);
n=((n>>2)&0x33)|((n<<2)&0xcc);
return (n>>4)|(n<<4);
}

Damit machst du aus DB7 DB6 .... DB0
einfach             DB0 DB1 .... DB7

Also alles was gesendet wird umdrehen
und dann High- und Low-Nibble beachten ;)

anr

Autor: Patrick L. (crashdemon)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
joar, dankeschön werd mal mein Glück versuchen

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier mal was zum Umdrehn:

unsigned char umkehr(unsigned char n){
uint8_t mask, temp;

 mask = 0x01;
 temp = 0;

 do
 {
  if(n & mask) temp |= 0x80;
  mask <<= 1;
  if(mask) temp >>= 1;
 } while(mask);

 return temp;
}

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
avr schrieb:
> Hier mal was zum Umdrehn:
> unsigned char umkehr(unsigned char n){
> n=((n>>1)&0x55)|((n<<1)&0xaa);
> n=((n>>2)&0x33)|((n<<2)&0xcc);
> return (n>>4)|(n<<4);
> }

Wenn man mit Flash nicht sparen muß, kann man es so machen.

Ansonsten besser so:
static void lcd_nibble( uint8_t d )
{
  LCD_D4 = 0; if( d & 1<<4 ) LCD_D4 = 1;
  LCD_D5 = 0; if( d & 1<<5 ) LCD_D5 = 1;
  LCD_D6 = 0; if( d & 1<<6 ) LCD_D6 = 1;
  LCD_D7 = 0; if( d & 1<<7 ) LCD_D7 = 1;

  LCD_E0 = 1;
  _delay_us( 1 );                       // 1us
  LCD_E0 = 0;


Peter

Autor: Jürgen W. (juergen_w) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du den ASCii Code änderst, kannst du dein Code so lassen und die 
Rechenzeit für die Bit -schieberei sparen.


Oder, wenn es nicht allzuviel Text ist einfach als (schon umgewandeltes) 
Hex eingeben.

Ich programmiere zwar ASM, aber in C geht das sicher auch.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jürgen W. schrieb:
> Wenn du den ASCii Code änderst, kannst du dein Code so lassen und die
> Rechenzeit für die Bit -schieberei sparen.

Und wenn man kaltes Wasser braucht, stellt man heißes Wasser in den 
Kühlschrank.


Peter

Autor: Fabian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alternativ wäre auch eine Look-Up Table. Bei 16Byte ist das noch 
überschaubar.

Autor: Patrick L. (crashdemon)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also irgendwie schein ich da noch eine Bug drin zu haben, zumindest 
zeigt das LCD nur wirres zeugs an. Mit den Änderungen sollte es dann 
doch eig. so aussehen:
/******** Befehl an das LCD senden ********/
void LCD_command(unsigned char temp1)
{
  unsigned char temp2 = temp1;
 
  LCD_PORT &= ~(1 << LCD_RS); // Register Select auf "Transfering Instruction Data" setzen
 
  temp1 = (temp1 >> 4) & 0x0F; // Oberes Nibble holen + Maskieren
  LCD_PORT = (LCD_PORT & 0xF0) | swap_nibble(temp1); // Daten Bits setzen
  LCD_enable();
 
  temp2 = temp2 & 0x0F; // unteres Nibble holen und maskieren
  LCD_PORT = (LCD_PORT & 0xF0) | swap_nibble(temp2); // Daten Bits setzen
     LCD_enable();
   
  _delay_us(42);
}

mit
unsigned char swap_nibble(unsigned char in)
{
  return((in & (1 << 0)) << 3) | 
        ((in & (1 << 1)) << 2) | 
        ((in & (1 << 2)) << 1) | 
        ((in & (1 << 3)) << 0);
}

Die LCD Initialisierung habe ich auch angepasst, die scheint zu 
funktionieren.

Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hast du auch bei der Datenausgabe geswapt?

Autor: Patrick L. (crashdemon)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jop, deswegen bin ich ja irritiert.
/******** Datenbyte an das LCD senden ********/
void LCD_data(unsigned char temp1)
{
  unsigned char temp2 = temp1;
 
  LCD_PORT |= (1 << LCD_RS); // Register Select auf "Transferring Display Data" setzen
 
  temp1 = temp1 >> 4;
  temp1 = temp1 & 0x0F;
  LCD_PORT = (LCD_PORT & 0xF0) | swap_nibble(temp1); // Daten Bits setzen
     
  LCD_enable();

  temp2 = temp2 & 0x0F;
  LCD_PORT = (LCD_PORT & 0xF0) | swap_nibble(temp2); // Daten Bits setzen
     
  LCD_enable();
   
  _delay_us(42);
}

Autor: Helfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du mit AVR-GCC-Tutorial/LCD-Ansteuerung arbeitest, bietet sich 
an, die Änderung zentral in lcd_out() zu machen, statt mehrfach in 
LCD_init, LCD_command und LCD_data.

Autor: Helfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Swapcode ist ja auch falsch. Passt den niemand mehr auf?
unsigned char swap_nibble(unsigned char in)
{
  return((in & (1 << 0)) << 3) | // 0001 => 1000
        ((in & (1 << 1)) << 1) | // 0010 => 0100
        ((in & (1 << 2)) >> 1) | // 0100 => 0010
        ((in & (1 << 3)) >> 3);  // 1000 => 0001
}

Autor: Patrick L. (crashdemon)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Helfer schrieb:
> Der Swapcode ist ja auch falsch. Passt den niemand mehr auf?

tatsache, jetzt fluppt es

Autor: Vuvuzelatus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Alternativ wäre auch eine Look-Up Table. Bei 16Byte ist das noch
>überschaubar.

Keep it simple and stupid :-) Warum blos müssen die Leute für so nen 
Kiki immer gleich nen Code bauen, obwohl es ein kleines Konstantenarray 
kurz und schmerzlos erledigen würde?

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.