Forum: Mikrocontroller und Digitale Elektronik HD44780 Display macht Porbleme am PIC24


von Jens G. (Firma: fa. Seuffer) (willi-helmchen)


Lesenswert?

Hy Leute,
wie der eine oder andere gestern schon in einem andrern Thread gelesen 
hat, darf ich mein dsPIC33 projekt auf einem PIC24HJ128GP206 umstellen.
Ich hab auf dem dsPIC33 ein HD44780 display an Port F Pin 0-7 
inzialisiert und auch erfolgreich draufgeschrieben.
mit folgenden Code.

#include "p24hj128gp206.h"

//-------------------------------------------------------------
//für Delay inizialisierung
//-------------------------------------------------------------

#define Delay_15ms (16000000*0.015)/2950
#define Delay_5ms (16000000*0.005)/2950
#define Delay_200us (16000000*0.0002)/1080
unsigned int temp_count;

void Delay(unsigned int delay_count);
void Delay_Us(unsigned int delayUs_count);


//-------------------------------------------------------------
//Für LCD Inizialisierung
//-------------------------------------------------------------

void LCD_INI(void);
void lcd_cmd (char cmd);
void lcd_data(char data);
void puts_lcd(unsigned char *data, unsigned char count);

//LCD Komando Prototypen
#define home_clr()  lcd_cmd(0x01)
#define line_2()  lcd_cmd(0xc0)

//Controlsignal Daten Pins
#define RW  LATDbits.LATD5
#define RS  LATBbits.LATB15
#define E  LATDbits.LATD4
//Controlsignal Pin direction
#define RW_TRIS    TRISDbits.TRISD5
#define RS_TRIS    TRISBbits.TRISB15
#define E_TRIS    TRISDbits.TRISD4
//Daten und Pin Signal direction
#define DATA     LATF
#define DATAPORT  PORTF
#define TRISDATA  TRISF





//------------------------------------------------------------------
//         Inizialisierung des LCD Display
//------------------------------------------------------------------

void LCD_INI(void)
{
  Delay(Delay_15ms); //Kurze Pause wenn Vdd kommt

  //Setzt init. status für Daten und Control bits
  LATF &= 0xff00;
    RW = 0;
  RS = 0;
  E = 0;

  //Setzt Daten und Controllbits als Output
  TRISF &= 0xff00;
  RW_TRIS = 0;
  RS_TRIS = 0;
  E_TRIS = 0;

  //erste LCD Inizialisierungssequenz
  DATA &= 0xff00;
  DATA |= 0x0038;
  E = 1;
  Nop();
  Nop();
  Nop();
  E=0;
  Delay(Delay_5ms);

  //zweite LCD Inizialisierungssequenz
  DATA &= 0xff00;
  DATA |= 0x0038;
  E = 1;
  Nop();
  Nop();
  Nop();
  E=0;
  Delay_Us(Delay_200us);

  //drittte LCD Inizialisierungssequenz
  DATA &= 0xff00;
  DATA |= 0x0038;
  E = 1;
  Nop();
  Nop();
  Nop();
  E=0;
  Delay_Us(Delay_200us);

  lcd_cmd(0x38);  //Funktion gesetzt
  lcd_cmd(0x0c);  //Display on/off Kontrolle, Curser blinken aus 
lcd_cms(0x0c)
  lcd_cmd(0x06);
}

//------------------------------------------------------------------
//         Unterprogramm für LDC Kommandos
//------------------------------------------------------------------

void lcd_cmd (char cmd)
{
  DATA &= 0xff00;
  DATA |= cmd;
  RW = 0;
  RS = 0;
  E = 1;
  Nop();
  Nop();
  Nop();
  E = 0;
  Delay(Delay_5ms);
}

//------------------------------------------------------------------
//         Unterprogramm für LDC Daten
//------------------------------------------------------------------

void lcd_data(char data)
{
  RW = 0;
  RS = 1;
  DATA &= 0xff00;
  DATA |= data;
  E = 1;
  Nop();
  Nop();
  Nop();
  E = 0;
  RS = 0;
  Delay_Us(Delay_200us);
  Delay_Us(Delay_200us);
}


//------------------------------------------------------------------
//Programm für Delay
//------------------------------------------------------------------

void puts_lcd(unsigned char *data, unsigned char count)
{

  while(count)
  {
    lcd_data(*data++);
    count--;
  }
}


//------------------------------------------------------------------
//    Programm für Delay
//------------------------------------------------------------------

void Delay(unsigned int delay_count)
{
  temp_count=delay_count +1;
  asm volatile("outer: dec _temp_count");
  asm volatile("cp0 _temp_count");
  asm volatile("bra z, done");
  asm volatile("do #3200, inner");
  asm volatile("nop");  asm volatile("inner: nop");
  asm volatile("bra outer");
  asm volatile("done:");
}

void Delay_Us(unsigned int delayUs_count)
{
  temp_count=delayUs_count +1;
  asm volatile("outer1: dec _temp_count");
  asm volatile("cp0 _temp_count");
  asm volatile("bra z, done1");
  asm volatile("do #1500, inner1");
  asm volatile("nop");
  asm volatile("inner1: nop");
  asm volatile("bra outer1");
  asm volatile("done1:");
}




Nun muss ich aaber auf dem PIC24 auf den PortG ausweichen und da der 
Port G beim PIC24 nicht alle 16 Pins hat muss folgende Pins nehmen:
RG0,RG1,RG2,RG3,RG6,RG7,RG8,RG9
Hab den Code jetzt auch versucht anzupassen aber irgendwie kommt da 
nichts gescheites raus, sondern nur Hiroglyphen
was mach ich falsch

#include "p33fj256gp710.h"

//-------------------------------------------------------------
//für Delay inizialisierung
//-------------------------------------------------------------

#define Delay_15ms (16000000*0.015)/2950
#define Delay_5ms (16000000*0.005)/2950
#define Delay_200us (16000000*0.0002)/1080
unsigned int temp_count;

void Delay(unsigned int delay_count);
void Delay_Us(unsigned int delayUs_count);


//-------------------------------------------------------------
//Für LCD Inizialisierung
//-------------------------------------------------------------

void LCD_INI(void);
void lcd_cmd (char cmd);
void lcd_data(char data);
void puts_lcd(unsigned char *data, unsigned char count);

//LCD Komando Prototypen
#define home_clr()  lcd_cmd(0x01)
#define line_2()  lcd_cmd(0xc0)

//Controlsignal Daten Pins
#define RW  LATDbits.LATD5
#define RS  LATBbits.LATB15
#define E  LATDbits.LATD4
//Controlsignal Pin direction
#define RW_TRIS    TRISDbits.TRISD5
#define RS_TRIS    TRISBbits.TRISB15
#define E_TRIS    TRISDbits.TRISD4
//Daten und Pin Signal direction
#define DATA     LATG
#define DATAPORT  PORTG
#define TRISDATA  TRISG





//------------------------------------------------------------------
//         Inizialisierung des LCD Display
//------------------------------------------------------------------

void LCD_INI(void)
{
  Delay(Delay_15ms); //Kurze Pause wenn Vdd kommt

  //Setzt init. status für Daten und Control bits
  LATG &= 0xff00;

  RW = 0;
  RS = 0;
  E = 0;

  //Setzt Daten und Controllbits als Output
  TRISG &= 0xFC30;

  RW_TRIS = 0;
  RS_TRIS = 0;
  E_TRIS = 0;

  //erste LCD Inizialisierungssequenz
  DATA &= 0xff00;
  DATA |= 0x0038;
  E = 1;
  Nop();
  Nop();
  Nop();
  E=0;
  Delay(Delay_5ms);

  //zweite LCD Inizialisierungssequenz
  DATA &= 0xff00;
  DATA |= 0x0038;
  E = 1;
  Nop();
  Nop();
  Nop();
  E=0;
  Delay_Us(Delay_200us);

  //drittte LCD Inizialisierungssequenz
  DATA &= 0xff00;
  DATA |= 0x0038;
  E = 1;
  Nop();
  Nop();
  Nop();
  E=0;
  Delay_Us(Delay_200us);

  lcd_cmd(0x38);  //Funktion gesetzt
  lcd_cmd(0x0c);  //Display on/off Kontrolle, Curser blinken aus 
lcd_cms(0x0c)
  lcd_cmd(0x06);
}

//------------------------------------------------------------------
//         Unterprogramm für LDC Kommandos
//------------------------------------------------------------------

void lcd_cmd (char cmd)
{
  DATA &= 0xff00;
  DATA |= cmd;
  RW = 0;
  RS = 0;
  E = 1;
  Nop();
  Nop();
  Nop();
  E = 0;
  Delay(Delay_5ms);
}

//------------------------------------------------------------------
//         Unterprogramm für LDC Daten
//------------------------------------------------------------------

void lcd_data(char data)
{

  RW = 0;
  RS = 1;
  DATA &= 0xff00;
  DATA |= data;
  Nop();
  Nop();
  Nop();
  E = 0;
  RS = 0;
  Delay_Us(Delay_200us);
  Delay_Us(Delay_200us);
}


//------------------------------------------------------------------
//Programm für Delay
//------------------------------------------------------------------

void puts_lcd(unsigned char *data, unsigned char count)
{

  while(count)
  {
    lcd_data(*data++);
    count--;
  }
}


//------------------------------------------------------------------
//    Programm für Delay
//------------------------------------------------------------------

void Delay(unsigned int delay_count)
{
  temp_count=delay_count +1;
  asm volatile("outer: dec _temp_count");
  asm volatile("cp0 _temp_count");
  asm volatile("bra z, done");
  asm volatile("do #3200, inner");
  asm volatile("nop");  asm volatile("inner: nop");
  asm volatile("bra outer");
  asm volatile("done:");
}

void Delay_Us(unsigned int delayUs_count)
{
  temp_count=delayUs_count +1;
  asm volatile("outer1: dec _temp_count");
  asm volatile("cp0 _temp_count");
  asm volatile("bra z, done1");
  asm volatile("do #1500, inner1");
  asm volatile("nop");
  asm volatile("inner1: nop");
  asm volatile("bra outer1");
  asm volatile("done1:");
}

von Jens G. (Firma: fa. Seuffer) (willi-helmchen)


Lesenswert?

Nachtrag:

Schreiben tu ich auf das Display wie folgt

lcd_cmd(0x02); //Curser at Home postion
puts_lcd("Test");
lcd_cmd(0xc0);  //wechselt im Display auf Zeile 2
puts_lcd("Test2");

von Dieter W. (dds5)


Lesenswert?

> ... muss folgende Pins nehmen: RG0,RG1,RG2,RG3,RG6,RG7,RG8,RG9

Hmmm, dann reicht es nicht, alle Port Latch und Tris Zugriffe von F auf 
G umzustellen sondern die oberen 4 Bit müssen auch noch von 4..7 um 2 
Bit nach inks auf 6..9 verschoben werden.

Aaaalso alle Bitmasken, Control- und Datenworte entsprechend 
"behandeln".

von Jens G. (Firma: fa. Seuffer) (willi-helmchen)


Lesenswert?

Aja, und wie stelle ich das am besten an??
ist das ein großer Akt??

von Jens G. (Firma: fa. Seuffer) (willi-helmchen)


Lesenswert?

So ich hab jetzt bei allen zugriffen bitmasken usw die oberen 4 bit um 2 
weitergeschoben.
Jetzt habe ich nur das Problem das ich nichts auf zeile 2 schreiben kann 
(es handelt sich um ein 2x16 display)
und das ich nicht weis wie ich bei dem datenwort aus den chararray das 
ich auf das display schreibe die oberen 4 bit um 2 weiterscheibe??

von Dieter W. (dds5)


Lesenswert?

Ich denke es sollte funktionieren wenn man die 8 Bit als 2 mal 4 Bit 
ausgibt:

void lcd_cmd (char cmd)
{
  DATA &= 0xfff0;
  DATA |= cmd;
  DATA &= 0xfc3f;
  DATA |= ((cmd << 2) & 0x03c0);
  RW = 0;
  RS = 0;
  E = 1;
  Nop();
  Nop();
  Nop();
  E = 0;
  Delay(Delay_5ms);

Vielleicht braucht's auch noch irgendwo einen Typecast.
Data natürlich äquivalent anpassen.

von Jens G. (Firma: fa. Seuffer) (willi-helmchen)


Lesenswert?

Danke so gehts

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.