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:");
}