en el pin del contraste tengo un potenciometro de 10k y en serie una r de 10K, he probado a ponerlo directamente y tampoco.
En esta función:Código: C
void lcd_send_byte( BYTE address, BYTE n ) { lcd.rs = 0; while ( bit_test(lcd_read_byte(),7) ) ; lcd.rs = address; delay_cycles(1); //lcd.rw = 0; delay_cycles(1); lcd.enable = 0; lcd_send_nibble(n >> 4); lcd_send_nibble(n & 0xf); }
Reemplaza la linea: while ( bit_test(lcd_read_byte(),7) ) ;
Por un delay --> delay_us(60);
Estas esperando la habilitación del LCD, realizando una lectura, la cual no la tienes habilitada.
Respecto al pdf, que me recomiendas hacer, me refiero a que experimentos de los que cita
o que quiero decir, bajale la resistencia esa en serie y tenés que ver los cuadraditos si es que tu lcd funciona correctamente y seguis los pasos correctamente (sin pic) después es cuestion de conectar todo nuevamente.
se me ocurren 3 cosas por las cuales no ves los cuadrados:
1- El contraste está muy bajo (hay que bajar la tensión vee).
tengo problemas con el lcd, hace tiempo venia simulando en proteus con la libreria flex_lcd y todo bien, pero ahora pruebo en hardware y no funciona el lcd, sale lleno de cuadros en la primera fila, el pin de contraste lo tengo a tierra (siempre lo he usado asi). decidi probar algo sencillo como poner un hola, el pic esta bueno y estoy probando en una entrenadora, monitoreo la actividad del puerto con leds y si esta sacando datos por el puerto q le asigno, me asegure de poner XT en el fuse para un cristal de 4Mhz+..pero no se que pasa..
saludos
Hola wichooox, bienvenido al foro. Está algo extenso el código, pero veo que tienes el lcd en el puerto B, entonces comienza por cambiar este fuse:
#FUSES PBADEN //PORTB pins are configured as analog input channels on RESET
por este:
#FUSES NOPBADEN //PORTB pins are configured as digital I/O on RESET
Si veo algo más te cuento.
Saludos!
EDITO: No me habia dado cuenta que lo extenso es la librería del lcd :oops:
Hola wichooox, intenta compilar el programa asi:Código: C
#include <18F2525.h> #device adc=10 #FUSES NOWDT //No Watch Dog Timer #FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale #FUSES INTRC //Internal RC Osc #FUSES FCMEN //Fail-safe clock monitor enabled #FUSES NOIESO //Internal External Switch Over mode disabled #FUSES NOPUT //No Power Up Timer #FUSES NOBROWNOUT //No brownout reset #FUSES BORV20 //Brownout reset at 2.0V #FUSES NOPBADEN //PORTB pins are configured as digital I/O on RESET #FUSES NOLPT1OSC //Timer1 configured for higher power operation #FUSES MCLR //Master Clear pin enabled #FUSES NOSTVREN //Stack full/underflow will not cause reset #FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O #FUSES NOXINST //Extended set extension and Indexed Addressing mode disabled (Legacy mode) #FUSES NODEBUG //No Debug mode for ICD #FUSES NOPROTECT //Code not protected from reading #FUSES NOCPB //No Boot Block code protection #FUSES NOCPD //No EE protection #FUSES NOWRT //Program memory not write protected #FUSES NOWRTC //configuration not registers write protected #FUSES NOWRTB //Boot block not write protected #FUSES NOWRTD //Data EEPROM not write protected #FUSES NOEBTR //Memory not protected from table reads #FUSES NOEBTRB //Boot block not protected from table reads #use delay(int=4000000) #define ENABLE_PIN B0 #define RS_PIN B1 #define RW_PIN B2 #define Data4 B4 #define Data5 B5 #define Data6 B6 #define Data7 B7 #define LCD_TYPE 2 #include <lcd.c> int seguir; void main() { setup_adc_ports(AN0_TO_AN1|VSS_VDD); setup_adc(ADC_CLOCK_INTERNAL|ADC_TAD_MUL_2); setup_spi(SPI_SS_DISABLED); setup_wdt(WDT_OFF); setup_timer_0(RTCC_INTERNAL); setup_timer_1(T1_DISABLED); setup_timer_2(T2_DISABLED,0,1); setup_timer_3(T3_DISABLED|T3_DIV_BY_1); setup_comparator(NC_NC_NC_NC); setup_vref(FALSE); setup_oscillator(OSC_4MHZ|OSC_INTRC|OSC_PLL_OFF); set_tris_a(0x03); lcd_init(); seguir=0; do { output_low(pin_a2); delay_ms(300); output_high(pin_a2); delay_ms(300); } while (seguir==0); }
Saludos!