Follow along with the video below to see how to install our site as a web app on your home screen.
Nota: This feature currently requires accessing the site using the built-in Safari browser.
Saludos.Leí todos los temas y hasta ahora no tengo solución con lo del LCD.
El PIC manda las señales pero no aparece nada en la pantalla
#include <16F877A.h>
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)
#include <lcd_portd.c>
#ZERO_RAM
//#byte porta = 0x05 // Asignamos PortA (No lo usamos).
#byte portb = 0x06 // Asignamos PortB (Usamos RB0 y RB1).
//#byte portc = 0x07 // Asignamos PortC (8 salidas a LED).
// ------ Variable Global ------
long x=1; //Declaramos el valor de X 10 bits
// x=88d-->5[V]
// x=48d-->3,3[V]
// x=255-->12 [V]
// ---------- Interrupción ----------
#INT_EXT
void IntRB0()
{
if (bit_test(portb,0)) // Si RB0 se ha puesto a 1 (flanco de subida),
{
ext_int_edge(H_TO_L); // entonces activar la siguiente interrupción por flanco de bajada.
if (bit_test(portb,1)) // Si RB1 está 1,
{
x++; // entonces incrementar el contador X.
if((x==0xFF)){
x=0xFE;
}
}
}
else // Si RB0 se ha puesto a 0 (flanco de bajada),
{
ext_int_edge(L_TO_H); // entonces activar la siguiente interrupción por flanco de subida.
if (bit_test(portb,1)) // Si RB1 está 1,
{
x--; // entonces decrementar el contador X.
if((x==0)){
x=1;
}
}
}
}
//Interrupcion por cambio de estado en puerto B.
/*#int_RB
void RB_isr(void) //función de interrupción
{
if(bit_test(portb,4)) x=88;
if(bit_test(portb,5)) x=48;
if(bit_test(portb,6)) x=255;
} */
// ---------- Programa Principial ----------
void main()
{
port_b_pullups(FALSE);
setup_adc_ports(NO_ANALOGS); //activar para leer voltaje.
setup_adc(ADC_CLOCK_INTERNAL);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DIV_BY_1,63,1); //segun tabla 78 khz @ 8 bits
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
setup_ccp1(CCP_PWM);
lcd_init();
//---- Fin de la configuración del 16F876A ----
enable_interrupts(int_ext); //Activar Interrupcion Externa.
ext_int_edge(L_TO_H); //Inicialmente Interrupción por Flaco de Subida.
enable_interrupts(INT_RB);
enable_interrupts(GLOBAL); //Interrupciones Generales Activadas.
While (true)
{
lcd_gotoxy(1,1);
set_pwm1_duty(x); //x= 0 a 255 -->0 a 100%.
printf(lcd_putc,"hola");
}
}
delay_cycles(1)
delay_cycles(5)
Estuve revisando los delay de la libreria, pensando en que al cambiar cristal de 20 Mhz, lo estaba afectando.
Me parecio logico que a 4 MHz, la linea
era de 1 us, en cambio a 20 Mhz, este retardo seriaCódigo:delay_cycles(1)
de 0,2 us, por lo tanto lo cambié por
Resultado: NADA...Código:delay_cycles(5)
Cuando estaba a punto de volver a cambiar el codigo (y prenderle fuego al protoboard), recordé que entre todas las cosas que iba
probando, le habia puesto unos capacitores del cristal de 4 Mhz de 0,22 pF, se los quité y voilá! ahi comenzó a funcar!!
Le volví a poner el retardo de 1 ciclo, para ver si le habia ayudado en algo, y fue lo mismo...
Ahi dejo un videito para que vean como va el proyecto:
http://www.youtube.com/embed/IQbxlDka7e0
void MostrarPrograma(int programa){
lcd_gotoxy(1,2);
if (programa==1)
printf(lcd_putc, "%u-Ropa algodon ",programa); // El string debe ser tan largo como el mas largo de todos.
if (programa==2)
printf(lcd_putc, "%u-Ropa delicada ",programa);
if (programa==3)
printf(lcd_putc, "%u-Ropa muy sucia",programa);
if (programa==4)
printf(lcd_putc, "%u-Modo agresivo ",programa);
if (programa==5)
printf(lcd_putc, "%u-Desagote ",programa);
if (programa==6)
printf(lcd_putc, "%u-Centrifugado ",programa);
// if (programa==7)
// printf(lcd_putc, "%u-[CONFIGURAR] ",programa);
generate_tone(800, 100);
while (input(BUT_IZQ)==0 || input(BUT_DER)==0) restart_wdt();
}
//#org 0x800 // Se coloca en el segundo segmento porq no entra en el primer segmento
// y ademas usando la directiva #separate hace q cuando se llame a la directiva rtos_terminate()
// el programa salta a cualquier posicion de memoria q no tiene nada q ver... No se porq es.
#SEPARATE
void menu(){
int programa=1;
int i;
ldiv_t time; // Para cargar la funcion de espera
short prelavado=0;
int temperatura=0;
lcd_gotoxy(1,1);
printf(lcd_putc, "*Menu Programas*");
MostrarPrograma(programa);
while (input(BUT_MID)==1){
if( input(BUT_IZQ)==0 && input(BUT_DER)==1){ // Solo entra si se aprieta un solo boton
if (programa>1)
MostrarPrograma(--programa);
else {
generate_tone(800, 600);//PITIDO ERROR
};
Olvidaste adjuntar tu código y el esquema de las conexiones para ver si por ahí está el problema.Buenas tardes, estoy intentando configurar un display FDCC1602P con el controlador SPLC780D, hasta donde pude revisar en las hojas de datos es igual al hitachi, pero no logro hacerlo funcionar, probe con la lcd.c (la nueva) el flex_lcd.c y no anda, sera por el controlador o me estoy comiendo algo.
/////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <16f877a.h>
#use delay(clock=4000000)
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use fast_io (A)
#use fast_io (B)
#include <lcd.c> // libreria lcd//
#define use_portb_lcd==TRUE //defino puerto b para usarlo//
char abecedario [26]={'a','b','c','d','e','f','g','h','i','j',
'k','l','m','n','o','p','q','r','s',
't','u','v',"'w','x','y','z'};
int numeros[10]= {0,1,2,3,4,5,6,7,8,9};
void main()
{
set_tris_a(0x3);
int x,y;
lcd_init();
lcd_putc('\f');// borrar lcd
while(true)
{
x,y=0;
if (input(pin_A0)) //cuando pulso esta entrada veo el abc en el lcd//
{
for(x;x<26;x++)
{
lcd_gotoxy(1,1);
printf(lcd_putc,"car=%c,abecedario");
delay_ms(300);
abecedario[x];
delay_ms(300);
lcd_putc('\f');// borrar lcd
}
}
if (input(pin_A1)) // muestra los numeros al pulsar la entrada//
{
for(y;y<10;x++)
{
printf(lcd_putc," Num=%u",numeros);
lcd_gotoxy(1,1);
delay_ms(300);
numeros[y];
delay_ms(300);
lcd_putc('\f);// borrar lcd
}
}
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <16f877a.h>
#fuses NOBROWNOUT
#use delay(crystal=4MHz)
#include <lcd.c> // libreria lcd
// #define use_portb_lcd=TRUE // Ésto se define en la librería lcd.c
// Por default para el PIC16F877A se usará el puerto D
char abecedario [26] = {'a','b','c','d','e','f','g','h','i','j','k',
'l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
int numeros[10] = {0,1,2,3,4,5,6,7,8,9};
void main()
{
setup_adc_ports(NO_ANALOGS);
lcd_init();
lcd_putc("\fCaracter = a\nNumero = 0"); // escribir en la dos líneas del LCD
int x,y=0;
while(true)
{
if(input(pin_a0)) // cuando pulso esta entrada veo el abc en el lcd
{
for(x=0;x<=25;x++)
{
lcd_gotoxy(1,1);
printf(lcd_putc,"Caracter = %c",abecedario[x]);
delay_ms(300);
}
}
if(input(pin_A1)) // muestra los numeros al pulsar la entrada
{
for(y=0;y<=9;y++)
{
printf(lcd_putc,"\nNumero = %u",numeros[y]);
delay_ms(300);
}
}
}
}
Porque no vas a utilizar ningún pin como salida en el puerto Atengo ciertas dudas con esto porque quitaste el set_tris
el cual indicaba quienes eran entradas
El puerto A y el puerto E del PIC16F877A tienen conversores AD, y éstos por default están activos.y al colocar setup_adc_ports(NO_ANALOGS); es para indicar que?
Con algunas modificaciones a tu programa, prueba ahora así...Hola, quiera que me ayuder porque tengo un problema al simular en el proteus el 16f887 con lcd, la lcd no muestra ningun dato, pues arme el cicuito en protoboard y si me me hace lo que le programe, mi duda es el porque no me lo simula el proteus, aqui les dejo el programa y el circuito
#include <16f887.h>
#fuses NOWDT,NOMCLR,NOLVP
#use delay(internal = 8MHz)
#include <lcd.c>
unsigned int dato1=0;
void main()
{
setup_adc_ports(NO_ANALOGS);
setup_oscillator(OSC_8MHZ|OSC_STATE_STABLE);
lcd_init();
while (true)
{
while (input(pin_a0)){
lcd_putc("\fPRESIONE TECLA");
printf(lcd_putc,"\nDATO=%d",dato1);
while (input(pin_a0));
}
while (!input(pin_a0)){
dato1++;
lcd_putc("\fPULSADOR EN 0");
printf(lcd_putc,"\nDATO=%d",dato1);
while (!input(pin_a0));
}
}
}
De seguro el código que usaste, es para otro PIC, pues no tenía las instrucciones para un 16F887.Pues utilize esas modificaciones que hiciste y me sigue fallando, de hecho ese programa que escribí es de un libro y pues en el libro hay imágenes que asi funciona, que raro que en mi proteus no funcione :s