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:"); }
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");
> ... 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".
Aja, und wie stelle ich das am besten an?? ist das ein großer Akt??
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??
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.