www.mikrocontroller.net

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


Autor: Jens Großmann (Firma: fa. Seuffer) (willi-helmchen)
Datum:

Bewertung
0 lesenswert
nicht 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:");
}

Autor: Jens Großmann (Firma: fa. Seuffer) (willi-helmchen)
Datum:

Bewertung
0 lesenswert
nicht 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");

Autor: Dieter Werner (dds5)
Datum:

Bewertung
0 lesenswert
nicht 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".

Autor: Jens Großmann (Firma: fa. Seuffer) (willi-helmchen)
Datum:

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

Autor: Jens Großmann (Firma: fa. Seuffer) (willi-helmchen)
Datum:

Bewertung
0 lesenswert
nicht 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??

Autor: Dieter Werner (dds5)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jens Großmann (Firma: fa. Seuffer) (willi-helmchen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke so gehts

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.