Hola,
Estoy conectando un PIC18F2550 a un display LCD y el problema que veo es que el PIC no siempre se resetea igual cuando aplico tension . Conecte un led a uno de los pines y resulta ser que no siempre prende. Debo conectar y desconectar varias veces para que se prenda.
Puse un cap de .1 ente + y tierra , pero sigue igual .
Lo unico que se me ocurre que puede ser, los bits de configuracion, pero ya los revise y no veo error . El display se conecta al puerto B, RB4,5,6 y 7 y estoy usando un cristal de 8Mhz . Alguna sugerencia ?
Por cierto, si pueden ver el codigo(compilador SDCC ) por que mas alla del problema del reset, aun el display no muestra nada......(inclusive cuando el led se prende)
#include <pic18f2550.h>
#include <delay.h>
// Configurations
code char at __CONFIG1L conf0 = _PLLDIV_DIVIDE_BY_2__8MHZ_INPUT__1L & _CPUDIV__OSC1_OSC2_SRC___1__96MHZ_PLL_SRC___2__1L;
code char at __CONFIG1H conf1 = _OSC_HS__HS_PLL__USB_HS_1H;
code char at __CONFIG2L conf2 = _PUT_ON_2L & _BODEN_OFF_2L ; // enable POWER UP timer
code char at __CONFIG2H conf3 = _WDT_DISABLED_CONTROLLED_2H ; // Disable WDT
code char at __CONFIG3H conf4 = _CCP2MUX_RC1_3H & _PBADEN_PORTB_4_0__CONFIGURED_AS_DIGITAL_I_O_ON_RESET_3H;// Enable pin MCLR
code char at __CONFIG4L conf5 = _LVP_OFF_4L; // Disable LVP
//Define your LCD's data PORT here:
#define LCD_PORT LATB
//Define your LCD's control pins here:
#define LCD_E LATBbits.LATB0 //Enable
#define LCD_RS LATBbits.LATB2 //Register select
void strobe(void); //Strobes the enable pin of the LCD
void send_nibble(char b); //Send high nibble of byte b to LCD
void send_byte(char b); //Send entire byte b to LCD via 4 bit interface
void send_cmd(char b); //Send command to LCD
void send_data(char b); //Send data to LCD
void set_cursor(char row, char col); //Set cursor position at (row, col)
void cursor_on(void); //Turn on cursor
void cursor_off(void); //Turn off cursor
void cls(void); //Clear screen
void sc_r(void); //Scroll all lines one character right
void sc_l(void); //Scroll all lines one character left
void home(void); //Send cursor to top-left position
char b2hc(char info); //Convert lower nibble of byte data to an ascii character
void lcd_init(void); //Initialize LCD
void strobe() {
LCD_E = 1;
delay10tcy(2); // 10*500nsec*2 = 10usec
LCD_E = 0;
delay10tcy(2);
// PORTAbits.RA0=1;
}
void send_nibble(char b) {
LCD_PORT = (LCD_PORT & 0x0F) | (b & 0xF0); //output char on higher bits with out changing
strobe(); // lower bits
}
void send_byte(char b) {
send_nibble(b); //Send high nibble
send_nibble(b << 4); //Send low nibble
}
void send_cmd(char b) {
LCD_RS = 0; //Command mode
send_byte(b);
delay1ktcy(10); // delay 5msec
}
void send_data(char b) {
LCD_RS = 1; //Data mode
send_byte(b);
delay1ktcy(20); // equiv a 500us * 20 = 10mseg
}
void set_cursor(char row, char col) {
char command = 0x80;
switch(row) {
case 1:
command += col - 1;
break;
case 2:
command += 0x40 + col - 1;
break;
case 3:
command += 0x10 + col - 1;
break;
case 4:
command += 0x50 + col - 1;
break;
default:
command += col - 1;
break;
}
send_cmd(command);
}
void cursor_on() {
send_cmd(0x0E);
}
void cursor_off() {
send_cmd(0x0C);
}
void cls() {
send_cmd(0x01);
}
void sc_r() {
send_cmd(0x1E);
}
void sc_l() {
send_cmd(0x18);
}
void home() {
send_cmd(0x02);
}
char b2hc(char info) {
switch(info & 0x0F) {
case 0:
return '0';
case 1:
return '1';
case 2:
return '2';
case 3:
return '3';
case 4:
return '4';
case 5:
return '5';
case 6:
return '6';
case 7:
return '7';
case 8:
return '8';
case 9:
return '9';
case 10:
return 'A';
case 11:
return 'B';
case 12:
return 'C';
case 13:
return 'D';
case 14:
return 'E';
case 15:
return 'F';
}
return 0;
}
void lcd_init() {
LCD_E = 0;
LCD_RS = 0;
delay10ktcy(6);
//Start initializing the LCD
send_nibble(0x30);
delay1ktcy(10); //
send_nibble(0x30);
delay1ktcy(10); // 5 msec
send_nibble(0x30);
delay1ktcy(10); // estaba en 100us
send_nibble(0x20); //4 bit interface
delay1ktcy(10);
send_cmd(0x28); // 0b00101000 Function set: 4 bit interface
delay10tcy(3); // delay = 10*500nsec*3 = 15usec
send_cmd(0x0e); // 0b00001110 Display on/off: display on, cursor on, blink off
delay10tcy(3);
send_cmd(0x06); // 0b00000110 Entry mode: increment, no shift
delay10tcy(3);
send_cmd(0x02); // 0b00000010 Cursor home
delay10tcy(3);
send_cmd(0x01); // 0b00000001 Clear DDRAM/LCD
delay1ktcy(30); // delay 15msec
}
/************
* MAIN LOOP
************/
void main()
{
ADCON1 = 0x0f ;
INTCON = 0;
TRISA = 0 ; // PORTA as outputs
PORTA = 0 ;
LATA = 0 ;
TRISB = 0 ; // PORTB as outputs
PORTB = 0 ;
LATB = 0 ;
TRISC = 0;
PORTC = 0;
LATAbits.LATA0 =1;
delay100ktcy(30); // 1,5 secs
LATAbits.LATA0=0;
lcd_init() ;
set_cursor(1,1);
send_data('h');
delay100ktcy(30);
send_data('o');
delay100ktcy(30);
send_data('l');
delay100ktcy(30);
send_data('a');
delay100ktcy(30);
}