LCD Pins vertauscht

Gast #2365475
Lesenswert?

Hi, ich habe dummerweise mein LCD falsch verkabelt:

DB4 an PA3
DB5 an PA2
DB6 an PA1
DB7 an PA0

µC ist ein Atmega8515
LCD hat einen HD44780 Controller

also genau falsch herum...

mein Problem ist jetzt das ich nicht weis wie ich das Programm ändern 
muss, dass es anders ausgegeben wird daher das LCD funktioniert und 
keine merkwürdigen Zeichen anzeigt. Als LCD ansteuerung benutze ich das 
Beispiel aus dem GCC Tutorial.

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

    data &= 0xF0;                       // obere 4 Bit maskieren

    LCD_PORT &= ~(0xF0>>(4-LCD_DB));    // Maske löschen
    LCD_PORT |= (data>>(4-LCD_DB));     // Bits setzen
    lcd_enable();
}


ich denke mal dort müsste man etwas verändern?
Gast #2365518
Lesenswert?

"35µ-flachverkabelt"?

Kein Problem:

Verkablungslayer quer zur Leitungsführung trennen & links und rechts 
davon längs schlitzen, so daß eine Zunge entsteht. Diese strecken, um 
180° verwinden und wieder mit dem "Festland" verlöten.
Moderator (Firma: Titel) Persönliche Seite #2365528
Lesenswert?

Jack schrieb:
> ich denke mal dort müsste man etwas verändern?
Richtig. Du wirst jedes einzelne Bit per Handschlag verabschieden 
müssen, oder das Nibble umdrehen. Eine Suche im Forum bringt den 
Beitrag "Re: Wie drehe ich eine Bitreihenfolge um??"

Daraus kannst du dann die oberen 4 Bits mit dieser Funktion umdrehen:
1
unsigned char umkehr(unsigned char n){
2
   n=((n>>1)&0x50)|((n<<1)&0xa0);
3
   n=((n>>2)&0x30)|((n<<2)&0xc0);
4
   return n;
5
}

Also sieht deine Funktion so aus:
1
static void lcd_out( uint8_t data )
2
{
3

4
    data &= 0xF0;                       // obere 4 Bit maskieren
5
    data =((data >>1)&0x50)|((data <<1)&0xa0); // Bits tauschen
6
    data =((data >>2)&0x30)|((data <<2)&0xc0);
7

8
    LCD_PORT &= ~(0xF0>>(4-LCD_DB));    // Maske löschen
9
    LCD_PORT |= (data>>(4-LCD_DB));     // Bits setzen
10
    lcd_enable();
11
}


Alex W. schrieb:
> Wenn das Problem aber bei einer hergestellten PCB ist, so wird das nix!
Fädeldraht?
#2365608
Lesenswert?

spess53 schrieb:
>>Quarz auf 64ms startup time hats gelößt!
>
> Eher kaschiert. Deine Wartezeit vor der Initialisierung ist zu klein.

Nö.
Quarze haben eine hohe Güte und brauchen daher lange zum Anschwingen.

Für Quarze daher immer die längste Resetzeit nehmen!
Sonst funktioniert das Reset nicht und der Programmcounter startet 
irgendwo, statt bei 0x0000.


Peter
Gast #2365621
Lesenswert?

Hi

>Nö.
>Quarze haben eine hohe Güte und brauchen daher lange zum Anschwingen.

Das ist mir bekannt. Hier liegt es aber daran, das das Display noch 
langsamer als der Controller startet. Die notwendige Wartezeit sollte 
Bestandteil des Programms (Initialisierung) und nicht von 
Controllereinstellungen abhängig sein.

MfG Spess

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren