Ejercicios Ds1302, Rs232, Pc, Keypad

download Ejercicios Ds1302, Rs232, Pc, Keypad

of 24

Transcript of Ejercicios Ds1302, Rs232, Pc, Keypad

Ejercicios ds1302#102 RE: Ejemplitos en C para 16F648A Y bien he aqui el programita!!!jeje bien decir que he intentado utilizar las funciones basicas del DS1302, es decir, su configuracion(escribir la hora y la fecha) y despues su posterior lectura para mostrarla por la lcd, la programacion es algo extensa pero creo que asi es mas clara, se puede eliminar ciertas lineas de codigo e incluso hacerse de otra forma(la cual ya pondre), pero entonces resulta mas lioso de entender el funcionamiento del programa....jeje, bueno aqui el programita: //////////////////////////////////////////////////////////////////// //////////////// // VsZeNeR'05 // 09/Septiembre/05 // // Programa: Reloj-Calendario DS1302 // Version: 0.0 // // Dispositivo: PIC 16F648A Compilador: CCS vs3.227 // Entorno IDE: MPLAB IDE v7.21 Simulador: Proteus 6.7sp3 // // Notas: Se muestra por pantalla de lcd(LM016L) la fecha y hora obtenida mediante la // lectura del DS1302. Pudiendose modificar mediante los botones Conf/Ok y up. // Se utiliza variables globales: // day-> dia ds1302 // mth -> mes ds1302 // year -> ao ds1302 // hour -> hora ds1302 // min -> minutos ds1302 // sec-> segundos ds1302 // menu -> variable que muestra opcion del menu configurar // flag -> variable que cuenta hasta 130ms aprox. // var -> ajuste fino para que desborde cada 130ms aprox. // Se carga el TMR0 con 0 por lo tanto se desborda en 65ms aprox, queremos // visualizar y restaurar valores cogidos del ds1302 cada 130ms aprox por lo tanto // utilizamos una variable llamada flag que sera la encargada de dicha tarea. // Al inicio del programa debe ser configurado el reloj, siendo el boton 'up' el // encargado de ir moviendose mediante las opciones del menu:hora,minutos,.... // y el boton 'Conf/Ok' el encargado de configurar el reloj(cuando estemos en modo ver // hora y fecha) o el encargado de salir de la configuracion de las opciones(cuando // estemos en formato de configurar fecha y hora). // Tener en cuenta que hay que poner la directiva NOLVP para que el pin B4 sea de // salida. // Conexiones: A0 -> RST DS1302 // A1 -> SCLK DS1302

// A2 -> I/O DS1302 // A3 -> Boton 'up' // A5 -> Boton 'Conf/Ok' // B0 -> E // B1 -> RS // B2 -> RW // B4 -> D4 // B5 -> D5 // B6 -> D6 // B7 -> D7 // B3 -> Zumbador(beep) //////////////////////////////////////////////////////////////////// ////////////// #include //pic a utilizar #use delay(CLOCK=4000000) //Fosc=4Mhz #fuses HS,NOPUT,NOPROTECT,NOBROWNOUT,NOLVP,NOWDT,NOMC LR //comandos para el programador #use standard_io(a) #use standard_io(b) #define use_portb_lcd TRUE //utilizar el port b para lcd #define RTC_SCLK PIN_A1 //definimos pin's... #define RTC_IO PIN_A2 #define RTC_RST PIN_A0 //...de conexion de la rtc ds1302 #include //libreria de rtc ds1302 #include //libreria de lcd ///VARIABLES GLOBALES byte day,mth,year,dow,hour,min,sec; //variabes para ds1302 byte menu=0,flag=0,var=2; //variables para menu configurar ///DEFINICION DE FUNCIONES void configurar(void); void horas(void); void minutos(void); void dia(void); void mes(void); void anio(void); void beep(void); ///LLAMADA FUNCION INTERRUPCION #INT_TIMER0 void interrupcion() { if(flag>var){ //ya es 130ms aprox? var--; //SI -> decremento var... if(var==0) var=2; //...ajuste fino de 130ms aprox flag=0; //reset flag para contar 130ms aprox rtc_get_date(day,mth,year,dow); //coge dia,mes,ao rtc_get_time(hour,min,sec ); //coge hora,minuto,segundo printf(lcd_putc,"\fFecha: %2X/%2X/%2X\nHora: %2X:%2X:%2X",day,mth,year,hour,min,sec); //lcd } set_timer0(0); //reset TMR0 flag++; //incremento variable flag }

///PROGRAMA void main(void){ enable_interrupts(INT_TIMER0); //interrupcion TIMER0 activada setup_counters(RTCC_INTERNAL,RTCC_DIV_256); //configuracion interrupcion TMR0 set_timer0(0); //carga TMR0 lcd_init(); //inicializa lcd rtc_init(); //inicializa rtc lcd_putc("Reloj Calendario\n VsZeNeR'05" ); //presentacion... delay_ms(800); //...inicial configurar(); //ve a menu configurar enable_interrupts(GLOBAL); //activadas interrupciones for( ; ; ){ //bucle... if(input(PIN_A5)==0){ //Si se pulsa Conf.... while(!input(PIN_A5)){} //elimina rebotes beep(); configurar(); } //ve a menu configurar } //...infinito } ///FUNCION CONFIGURAR void configurar(void){ disable_interrupts(GLOBAL); //desactivadas interrupciones do{ switch(menu){ case 0: lcd_putc("\fConfigurar\nhoras?" ); //horas if(!input(PIN_A5)){ while(!input(PIN_A5)){} beep(); horas(); menu=1; //apunta siguiente opcion } break; case 1: lcd_putc("\fConfigurar\nminutos?" ); //minutos if(!input(PIN_A5)){ while(!input(PIN_A5)){} beep(); minutos(); menu=2; //apunta siguiente opcion } break; case 2: lcd_putc("\fConfigurar\ndia?" ); //dias if(!input(PIN_A5)){ while(!input(PIN_A5)){} beep(); dia();

menu=3; //apunta siguiente opcion } break; case 3: lcd_putc("\fConfigurar\nmes?" ); //mes if(!input(PIN_A5)){ while(!input(PIN_A5)){} beep(); mes(); menu=4; //apunta siguiente opcion } break; case 4: lcd_putc("\fConfigurar\nanio?" ); //aos if(!input(PIN_A5)){ while(!input(PIN_A5)){} beep(); anio(); menu=5; //apunta siguiente opcion } break; case 5: lcd_putc("\fSalir\nconfigurar?" ); //salir configuracion if(!input(PIN_A5)){ menu=6; beep(); } } if(!input(PIN_A3)){ //controla el boton up... while(!input(PIN_A3)){} menu++; if(menu>5) menu=0; } //...para mostrar menu por lcd delay_ms(130); //retardo para ver lcd }while(menu incremento hour switch(hour){ //limites... case 0x0A: hour=0x10;break; case 0x1A: hour=0x20;break; case 0x24: hour=0x00; } //...hour printf(lcd_putc,"\nHora: %2X:%2X:%2X",hour,min,sec); //muestra por lcd hour } }while(input(PIN_A5)); while(!input(PIN_A5)){} //elimina rebotes } ///FUNCION CONFIGURA MINUTOS void minutos(void){ printf(lcd_putc,"\fConf.Minutos:\nHora: %2X:%2X:%2X",hour,min,sec); //muestra por lcd do{ if(!input(PIN_A3)){ //se ha pulsado up? while(!input(PIN_A3)){} //elimina rebotes min++; //SI -> incremento min switch(min){ //limites... case 0x0A: min=0x10;break; case 0x1A: min=0x20;break; case 0x2A: min=0x30;break; case 0x3A: min=0x40;break; case 0x4A: min=0x50;break; case 0x5A: min=0x00; } //...min printf(lcd_putc,"\nHora: %2X:%2X:%2X",hour,min,sec); //muestra por lcd min } }while(input(PIN_A5)); while(!input(PIN_A5)){} //elimina rebotes } ///FUNCION CONFIGURA DIAS void dia(void){ printf(lcd_putc,"\fConf.Dias:\nFecha: %2X/%2X/%2X",day,mth,year); //muestra por lcd do{ if(!input(PIN_A3)){ //se ha pulsado up? while(!input(PIN_A3)){} //elimina rebotes day++; //SI -> incremento day switch(day){ //limites... case 0x0A: day=0x10;break; case 0x1A: day=0x20;break; case 0x2A: day=0x30;break; case 0x32: day=0x01; } //...day printf(lcd_putc,"\fConf.Dias:\nFecha: %2X/%2X/%2X",day,mth,year); //muestra por lcd day } }while(input(PIN_A5)); while(!input(PIN_A5)){} //elimina rebotes } ///FUNCION CONFIGURA MES

void mes(void){ printf(lcd_putc,"\fConf.Mes:\nFecha: %2X/%2X/%2X",day,mth,year); //muestra por lcd do{ if(!input(PIN_A3)){ //se ha pulsado up? while(!input(PIN_A3)){} //elimina rebotes mth++; //SI -> incremento mth switch(mth){ //limites... case 0x0A: mth=0x10;break; case 0x13: mth=0x01; } //...mth printf(lcd_putc,"\fConf.Mes:\nFecha: %2X/%2X/%2X",day,mth,year); //muestra por lcd } }while(input(PIN_A5)); while(!input(PIN_A5)){} //elimina rebotes } ///FUNCION CONFIGURA AOS void anio(void){ printf(lcd_putc,"\fConf.Anio:\nFecha: %2X/%2X/%2X",day,mth,year); //muestra por lcd do{ if(!input(PIN_A3)){ //se ha pulsado up? while(!input(PIN_A3)){} //elimina rebotes year++; //SI -> incremento mth switch(year){ //limites... case 0x0A: year=0x10;break; case 0x1A: year=0x20;break; case 0x2A: year=0x30;break; case 0x3A: year=0x40;break; case 0x4A: year=0x50;break; case 0x5A: year=0x60;break; case 0x6A: year=0x70;break; case 0x7A: year=0x80;break; case 0x8A: year=0x90;break; case 0x9A: year=0x00; } //...year printf(lcd_putc,"\fConf.Anio:\nFecha: %2X/%2X/%2X",day,mth,year); //muestra por lcd } }while(input(PIN_A5)); while(!input(PIN_A5)){} //elimina rebotes } ///FUNCION BEEP void beep(void){ output_high(PIN_B3); //activa zumbador delay_ms(50); output_low(PIN_B3); //desactiva zumbador } Decir, que el programita aparte de manejar dispositivos externos(lcd,buzzer,ds1302), maneja tb la interrupcion del TMR0 para la visualizacion en formato visualizar fecha-hora en la lcd, aparte tb he quitado la funcion de reset externo mediante el MRCL y he utilizado ese pin para el boton 'Conf/Ok' esto no es aconsejable ya que siempre es bueno tener un reset externo pero bueno era simplemente para poner un ejemplo de eliminar el reset externo y utilizar dicho

pin como un puerto mas... Pues ya tenemos un reloj-calendario!!!!ya no hay excusa de no saber que hora es ni en que dia vivimos!jeje

Editado por 2005, 07:47

vszener, Domingo, 11 de Septiembre de Perfil #103 RE: Ejemplitos en C para 16F648A Desde este enlace os podeis descargar lo necesario para el programa anterior: Reloj-Calendario ds1302: http://miarroba.com/foros/ver.php?foroid=348538&temaid= 3584881 !!! Privado

11/Sep/2005 07:39

vszener COLABORADOR

Mensajes: 649 Desde: 19/Feb/2005

11/Sep/2005 07:42

Perfil #104

Privado

vszener COLABORADOR

RE: Ejemplitos en C para 16F648A Buenas!!!!jeje hoy hace un mes que inicie este post!!!!y ya van 33 ejemplitos creo!!!!!jeje ya sabemos encender y apagar led's de casi todas las formas habidas por haber, sabemos utilizar display's de 7seg(solos, multiplexados,de anodo comun, de catodo comun,bcd.....), sabemos utilizar lcd 2x16, sabemos leer y escribir en eeprom externa e interna, sabemos manejar un rtc.....jeje no veas en un mes lo que ha dado de si!jeje bien pues ahora el proposito es interaccionar con el PC, es decir 'enchufar' el PIC al PC, debemos saber que tenemos tener en cuenta la compatibilidad de tensiones de los pines del pic con las del puerto RS232 a tratar!para ello usaremos un dispositivo llamado MAX232 que adapta las tensiones adecuandolas al PC y al PIC, aqui el enlace al MAX232 de dallas semiconductor: http://www.maxim-ic.com/quick_view2.cfm/qv_pk/1798 Desde esta dire os explican el funcionamiento del MAX232: http://www.x-robotics.com/ !!!

Mensajes: 649 Desde: 19/Feb/2005

13/Sep/2005 12:14

Perfil #105

Privado

vszener COLABORADOR

RE: Ejemplitos en C para 16F648A Holaa!!!!!aqui esta el ejemplito de interaccionar el pic con el pc, bien consiste en mostrar por lcd un mensaje y por el pc otro: //////////////////////////////////////////////////////////////////// ////////////////

Mensajes: 649 Desde: 19/Feb/2005

// VsZeNeR'05 // 11/Septiembre/05 // // Programa: Comunicacion PC via RS232 // Version: 0.0 // // Dispositivo: PIC 16F648A Compilador: CCS vs3.227 // Entorno IDE: MPLAB IDE v7.21 Simulador: Proteus 6.7sp3 // // Notas: Se muestra por pantalla de lcd(LM016L) en la primera linea la // frase 'hola mundo ' y en la segunda linea 'VsZeNeR'05'. Se muestra el // mismo mensaje por el PC. Tener en cuenta que hay que poner la directiva // NOLVP para que el pin B4 sea de salida. // // Conexiones: B0 -> E // B1 -> RS // B2 -> RW // B4 -> D4 // B5 -> D5 // B6 -> D6 // B7 -> D7 // A0 -> T1IN MAX232 // A1 -> R1OUT MAX232 //////////////////////////////////////////////////////////////////// ////////////// #include //pic a utilizar #fuses XT,NOWDT,NOPROTECT,PUT,NOLVP,NOBROWNOUT //ordenes para el programador #use delay (clock=4000000) //Fosc=4Mhz #use rs232(baud=9600, xmit=PIN_A0, rcv=PIN_A1) //manejo del RS232 #define use_portb_lcd TRUE //definir portb lcd #include //libreria manejo lcd ///PROGRAMA void main(void) { lcd_init(); //inicializa lcd printf(lcd_putc,"hola mundo ; )\nVsZeNeR'05" ); //mensaje por lcd printf("hola mundo VsZeNeR'05" ); //mensaje por PC } Decir que en la simulacion con PROTEUS, se utilizado el MAX232, esto no hace falta para la simulacon ya que directamente podriamos haber conectado las patitas Tx y Rx al correspondiente del virtual terminal de PROTEUS, se ha aadido para se vea su conexion del pic al pc......ya hace un mes que inicie el post!!!!!oleeeee!!!!

13/Sep/2005 12:18

Perfil #106

Privado

vszener COLABORADOR

RE: Ejemplitos en C para 16F648A

Mensajes: 649 Desde: 19/Feb/2005

Desde este enlace os podeis descargar los archivos necesarios para el programa anterior: lcd & RS232: http://miarroba.com/foros/ver.php?foroid=348538&temaid= 3594736

13/Sep/2005 12:21

Perfil #107

Privado

vszener COLABORADOR

RE: Ejemplitos en C para 16F648A Buenas!!!!Bien, el siguiente ejemplito es basado el un programa anteriormente realizado, es un relojcalendario(ds1302) peor esta vez por el PC, es decir anteriormente hicimos un reloj-calendario pero en una lcd y esta vez es usando el RS232, la programacion se ha modificado muy poco, solamente se ha mejorado el modo configurar horas-fecha para que no diera tantos saltos y poquito mas(intentare con mas tiempo revisarlo entero para hacer un codigo optimo), aqui el programa: //////////////////////////////////////////////////////////////////// //////////////// // VsZeNeR'05 // 09/Septiembre/05 // // Programa: Reloj-Calendario DS1302 y RS232 // Version: 1.0 // // Dispositivo: PIC 16F648A Compilador: CCS vs3.227 // Entorno IDE: MPLAB IDE v7.21 Simulador: Proteus 6.7sp3 // // Notas: Se muestra por virtual terminal la fecha y hora obtenida mediante la // lectura del DS1302. Pudiendose modificar mediante los botones Conf/Ok y up. // Se utiliza variables globales: // day-> dia ds1302 // mth -> mes ds1302 // year -> ao ds1302 // hour -> hora ds1302 // min -> minutos ds1302 // sec-> segundos ds1302 // menu -> variable que muestra opcion del menu configurar // flag -> variable que cuenta hasta 130ms aprox./ tb vale como control menu // var -> ajuste fino para que desborde cada 130ms aprox. // Se carga el TMR0 con 0 por lo tanto se desborda en 65ms aprox, queremos // visualizar y restaurar valores cogidos del ds1302 cada 130ms aprox por lo tanto // utilizamos una variable llamada flag que sera la encargada de dicha tarea. // Al inicio del programa debe ser configurado el reloj, siendo el boton 'up' el // encargado de ir moviendose mediante las opciones del menu:hora,minutos,.... // y el boton 'Conf/Ok' el encargado de configurar el

Mensajes: 649 Desde: 19/Feb/2005

reloj(cuando estemos en modo ver // hora y fecha) o el encargado de salir de la configuracion de las opciones(cuando // estemos en formato de configurar fecha y hora). // Tener en cuenta que hay que poner la directiva NOLVP para que el pin B4 sea de // salida. // Conexiones: A0 -> RST DS1302 // A1 -> SCLK DS1302 // A2 -> I/O DS1302 // A3 -> Boton 'up' // A5 -> Boton 'Conf/Ok' // B1 -> Tx // B2 -> Rx // B3 -> Zumbador(beep) //////////////////////////////////////////////////////////////////// ////////////// #include //pic a utilizar #use delay(CLOCK=4000000) //Fosc=4Mhz #fuses HS,NOPUT,NOPROTECT,NOBROWNOUT,NOLVP,NOWDT,NOMC LR //comandos para el programador #use standard_io(a) #use standard_io(b) #use rs232(baud=9600, xmit=PIN_B1, rcv=PIN_B2, FORCE_SW) //manejo del RS232 #define RTC_SCLK PIN_A1 //definimos pin's... #define RTC_IO PIN_A2 #define RTC_RST PIN_A0 //...de conexion de la rtc ds1302 #include //libreria de rtc ds1302 ///VARIABLES GLOBALES byte day,mth,year,dow,hour,min,sec; //variabes para ds1302 byte menu=0,flag=0,var=2; //variables para menu configurar ///DEFINICION DE FUNCIONES void configurar(void); void horas(void); void minutos(void); void dia(void); void mes(void); void anio(void); void beep(void); ///LLAMADA FUNCION INTERRUPCION #INT_TIMER0 void interrupcion() { if(flag>var){ //ya es 130ms aprox? var--; //SI -> decremento var... if(var==0) var=2; //...ajuste fino de 130ms aprox flag=0; //reset flag para contar 130ms aprox rtc_get_date(day,mth,year,dow); //coge dia,mes,ao rtc_get_time(hour,min,sec ); //coge hora,minuto,segundo printf("\fFecha: %2X/%2X/%2X\nHora: %2X:%2X:%2X",day,mth,year,hour,min,sec); //lcd }

set_timer0(0); //reset TMR0 flag++; //incremento variable flag } ///PROGRAMA void main(void){ enable_interrupts(INT_TIMER0); //interrupcion TIMER0 activada setup_counters(RTCC_INTERNAL,RTCC_DIV_256); //configuracion interrupcion TMR0 set_timer0(0); //carga TMR0 rtc_init(); //inicializa rtc puts("Reloj Calendario" ); puts("VsZeNeR'05" ); delay_ms(800); //...inicial configurar(); //ve a menu configurar enable_interrupts(GLOBAL); //activadas interrupciones for( ; ; ){ //bucle... if(input(PIN_A5)==0){ //Si se pulsa Conf.... while(!input(PIN_A5)){} //elimina rebotes beep(); configurar(); } //ve a menu configurar } //...infinito } ///FUNCION CONFIGURAR void configurar(void){ disable_interrupts(GLOBAL); //desactivadas interrupciones do{ switch(menu){ case 0: printf("\fConfigurar\nhoras?" ); //horas if(!input(PIN_A5)){ while(!input(PIN_A5)){} beep(); horas(); menu=1; //apunta siguiente opcion flag=1; //para el retorno funcion ver sig } break; case 1: printf("\fConfigurar\nminutos?" ); //minutos if(!input(PIN_A5)){ while(!input(PIN_A5)){} beep(); minutos(); menu=2; //apunta siguiente opcion flag=1; //para el retorno funcion ver sig } break; case 2: printf("\fConfigurar\ndia?" ); //dias if(!input(PIN_A5)){ while(!input(PIN_A5)){} beep(); dia(); menu=3; //apunta siguiente opcion flag=1; //para el retorno funcion ver sig

} break; case 3: printf("\fConfigurar\nmes?" ); //mes if(!input(PIN_A5)){ while(!input(PIN_A5)){} beep(); mes(); menu=4; //apunta siguiente opcion flag=1; //para el retorno funcion ver sig } break; case 4: printf("\fConfigurar\nao?" ); //aos if(!input(PIN_A5)){ while(!input(PIN_A5)){} beep(); anio(); menu=5; //apunta siguiente opcion flag=1; //para el retorno funcion ver sig } break; case 5: printf("\fSalir\nconfigurar?" ); //salir configuracion if(!input(PIN_A5)){ while(!input(PIN_A5)){} //elimina rebotes menu=6; flag=1; beep(); } } do{ //controla pulsador... if(!input(PIN_A3)){ while(!input(PIN_A3)){} menu++; flag++; if(menu>5) menu=0; } if(!input(PIN_A5)) //controla pulsador... flag++; //...'Conf/Ok' }while(!flag); //..'Up' flag=0; }while(menu incremento hour switch(hour){ //limites... case 0x0A: hour=0x10;break; case 0x1A: hour=0x20;break; case 0x24: hour=0x00;

} //...hour printf("\nHora: %2X:%2X:%2X",hour,min,sec); //muestra por v.terminal } }while(input(PIN_A5)); while(!input(PIN_A5)){} //elimina rebotes } ///FUNCION CONFIGURA MINUTOS void minutos(void){ printf("\fConf.Minutos:\nHora: %2X:%2X:%2X",hour,min,sec); //muestra por v.terminal do{ if(!input(PIN_A3)){ //se ha pulsado up? while(!input(PIN_A3)){} //elimina rebotes min++; //SI -> incremento min switch(min){ //limites... case 0x0A: min=0x10;break; case 0x1A: min=0x20;break; case 0x2A: min=0x30;break; case 0x3A: min=0x40;break; case 0x4A: min=0x50;break; case 0x5A: min=0x00; } //...min printf("\nHora: %2X:%2X:%2X",hour,min,sec); //muestra por v.terminal } }while(input(PIN_A5)); while(!input(PIN_A5)){} //elimina rebotes } ///FUNCION CONFIGURA DIAS void dia(void){ printf("\fConf.Dias:\nFecha: %2X/%2X/%2X",day,mth,year); //muestra por v.terminal do{ if(!input(PIN_A3)){ //se ha pulsado up? while(!input(PIN_A3)){} //elimina rebotes day++; //SI -> incremento day switch(day){ //limites... case 0x0A: day=0x10;break; case 0x1A: day=0x20;break; case 0x2A: day=0x30;break; case 0x32: day=0x01; } //...day printf("\fConf.Dias:\nFecha: %2X/%2X/%2X",day,mth,year); //muestra por v.terminal } }while(input(PIN_A5)); while(!input(PIN_A5)){} //elimina rebotes } ///FUNCION CONFIGURA MES void mes(void){ printf("\fConf.Mes:\nFecha: %2X/%2X/%2X",day,mth,year); //muestra por v.terminal do{ if(!input(PIN_A3)){ //se ha pulsado up? while(!input(PIN_A3)){} //elimina rebotes mth++; //SI -> incremento mth switch(mth){ //limites... case 0x0A: mth=0x10;break; case 0x13: mth=0x01; } //...mth printf("\fConf.Mes:\nFecha: %2X/%2X/%2X",day,mth,year);

//muestra por v.terminal } }while(input(PIN_A5)); while(!input(PIN_A5)){} //elimina rebotes } ///FUNCION CONFIGURA AOS void anio(void){ printf("\fConf.Ao:\nFecha: %2X/%2X/%2X",day,mth,year); //muestra por v.terminal do{ if(!input(PIN_A3)){ //se ha pulsado up? while(!input(PIN_A3)){} //elimina rebotes year++; //SI -> incremento mth switch(year){ //limites... case 0x0A: year=0x10;break; case 0x1A: year=0x20;break; case 0x2A: year=0x30;break; case 0x3A: year=0x40;break; case 0x4A: year=0x50;break; case 0x5A: year=0x60;break; case 0x6A: year=0x70;break; case 0x7A: year=0x80;break; case 0x8A: year=0x90;break; case 0x9A: year=0x00; } //...year printf("\fConf.Ao:\nFecha: %2X/%2X/%2X",day,mth,year); //muestra por v.terminal } }while(input(PIN_A5)); while(!input(PIN_A5)){} //elimina rebotes } ///FUNCION BEEP void beep(void){ output_high(PIN_B3); //activa zumbador delay_ms(50); output_low(PIN_B3); //desactiva zumbador } Decir que los comandos \n, \f y demas no me funcionan en la simulacion, no se si es un bug de PROTEUS o algo que se me esta pasando por alto y no me doy cuenta......pero bueno lo importante es el programa en si!jeje

16/Sep/2005 09:58

Perfil #108

Privado

vszener COLABORADOR

RE: Ejemplitos en C para 16F648A Desde esta direccion os podeis descargar los archivos necesarios del ejemplo anterior: RS232 & DS1302

Mensajes: 649 Desde: 19/Feb/2005

http://miarroba.com/foros/ver.php?foroid=348538&temaid= 3607177 Hasta pronto!!!

16/Sep/2005 10:00

Perfil

Privado

vszener COLABORADOR

#109 RE: Ejemplitos en C para 16F648A Mirando por el subforo de simuladores....encontre varios post con link's a paginas donde se podian descargar models y librerias para el simulador PROTEUS, voy a dejar aqui los link's ya que algunos de esos modelos lo usaremos nosotros: http://uk.geocities.com/vsmlibs/ Aqui: http://www.callbus.ru/ Y bueno si encuentro mas...los ire recopilando aqui

Mensajes: 649 Desde: 19/Feb/2005

18/Sep/2005 06:50

Perfil #110

Privado

vszener COLABORADOR

RE: Ejemplitos en C para 16F648A Y el ejemplito de hoy es seguir trabjando con el puerto serie RS232 peor esta vez introduciremos un periferico externo nuevo, el teclado, en este caso vamos a usar un teclado 3x4 donde cada tecla pulsada ira apareciendo en el v.terminal, aqui el programita: //////////////////////////////////////////////////////////////////// //////////////// // VsZeNeR'05 // 17/Septiembre/05 // // Programa: RS232 y teclado 3x4 // Version: 0.0 // // Dispositivo: PIC 16F648A Compilador: CCS vs3.227 // Entorno IDE: MPLAB IDE v7.21 Simulador: Proteus 6.7sp3 // // Notas: Se muestra por virtual terminal(PC) la tecla pulsada conectado un // keypad 4x3 al pic. Tener en cuenta que hay que poner la directiva // NOLVP para que el pin B4 sea de salida. // // Conexiones: B1 -> Fila A keypad // B2 -> Fila B keypad // B3 -> Fila C keypad // B4 -> Fila D keypad // B5 -> Columna 1 keypad // B6 -> Columna 2 keypad // B7 -> Columna 3 keypad // A0 -> Rx // A1 -> Tx //////////////////////////////////////////////////////////////////// ////////////// #include //pic a utilizar #fuses XT,NOWDT,NOPROTECT,PUT,NOLVP,NOBROWNOUT //ordenes para el programador #use delay (clock=4000000) //Fosc=4Mhz #use rs232(baud=9600, xmit=PIN_A0, rcv=PIN_A1) //manejo del RS232

Mensajes: 649 Desde: 19/Feb/2005

#define use_portb_kbd TRUE //definir portb keypad #include //libreria manejo keypad ///PROGRAMA void main(void) { char c; //variable almacenamos tecla kbd_init(); //inicializa teclado port_b_pullups(TRUE); //necesario para teclado puts("Manejo del teclado 3x4 VsZeNeR'05" ); //inicio... puts("====================" ); puts("\nPulse una tecla: " ); //...presentacion for( ; ; ) { //bucle... do{ //hacer hasta... c=kbd_getc(); //recogemos tecla pulsada }while(c=='\0'); //...que no se pulse tecla printf("\b" ); //retrocede una posicion(borra ultima tecla) printf("%c",c); //mensaje por v.terminal } //...infinito } Decir que para el manejo del teclado he utilizado la libreria del CCS llamada KBD.C que es compatible con teclados 3x4, aqui dejo el link al sitio donde CCS tiene puesta sus librerias y sus data sheet patron de la realizacion de las mismas: http://www.ccsinfo.com/data.shtml Ya sabemos manejar un periferico mas!

18/Sep/2005 06:56

Perfil #111

Privado

vszener COLABORADOR

RE: Ejemplitos en C para 16F648A Desde este enlace os podeis descargar los ficheros necesarios para el programa anterior: RS232 & KEYPAD 3X4

Mensajes: 649 Desde: 19/Feb/2005

http://miarroba.com/foros/ver.php?foroid=348538&temaid= 3613821

18/Sep/2005 07:00

Perfil #112

Privado

vszener COLABORADOR

RE: Ejemplitos en C para 16F648A Pues siguiendo la politica y filosofia de un profe mi de la universidad, el cual decia: 'no pierdas el tiempo en hacer lo fabricado....' he mirado por internet y por el foro una libreria para la lcd y para el teclado, y he hallado una!!!jeje la libreria son de la empresa Microsystems Engineering...aqui dejo el enlace para que os bajeis los ejemplos donde estan la

Mensajes: 649 Desde: 19/Feb/2005

slibrerias kbd2.c y lcd2.c: http://www.msebilbao.com/tienda/downloads_ejemplos.php Decir que la libreria lcd2.c es de 8 bits y la del CCS es de 4 bits.....pero bueno ya buscaremos mas o me pondre yo mano a la obra haber que sale!!!jeje....decir quee stas librerias las vamos a usar y tb modificar.....aqui dejo el enlace para que os bajeis las librerias mencionadas y la modificacion del kbd2.c a kbd3x4.c...la modificacion la he hecho porque la kbd2.c es para teclado 4x4 y de momento nosotros vamos a usar teclados 3x4..... http://miarroba.com/foros/ver.php?foroid=348538&temaid= 3622968

20/Sep/2005 12:57

Perfil #113

Privado

vszener COLABORADOR

RE: Ejemplitos en C para 16F648A Y aqui esta un ejemplito mas!!!esta vez el ejemplo consiste en un teclado y una lcd conectados....decir que para este ejemplo hacen falta las librerias lcd2.c y kbd3x4.c que las podreis encontrar en el post anterior....lcd2.c maneja la lcd pero las lineas de control estan en el porta y las de datos en el b, tambien decir que usamos 8bits de datos, y la kbd3x4.c es para manejar teclados 3x4 y esta conectado al portb conjuntamente al lcd por lo tanto debemos hacer una seleccion dinamica para manejar conjuntamente el lcd y el teclado(de eso se encargan la slibrerias....jeje), bueno el programa consiste en mostrar por lcd la tecla pulsada en el teclado: //////////////////////////////////////////////////////////////////// //////////////// // VsZeNeR'05 // 17/Septiembre/05 // // Programa: LCD y teclado 3x4 // Version: 0.0 // // Dispositivo: PIC 16F648A Compilador: CCS vs3.227 // Entorno IDE: MPLAB IDE v7.21 Simulador: Proteus 6.7sp3 // // Notas: Se muestra por lcd la tecla pulsada conectado un // keypad 3x4 al pic. Tener en cuenta que hay que poner la directiva // NOLVP para que el pin B4 sea de salida. // // Conexiones: B0 -> D0 LCD/Columna 1 keypad // B1 -> D1 LCD/Columna 2 keypad // B2 -> D2 LCD/Columna 3 keypad // B3 -> D3 LCD // B4 -> D4 LCD/Fila A keypad // B5 -> D5 LCD/Fila B keypad // B6 -> D6 LCD/Fila C keypad // B7 -> D7 LCD/Fila D keypad // A0 -> RS LCD // A1 -> RW LCD // A2 -> E LCD

Mensajes: 649 Desde: 19/Feb/2005

//////////////////////////////////////////////////////////////////// ////////////// #include //pic a utilizar #fuses XT,NOWDT,NOPROTECT,PUT,NOLVP,NOBROWNOUT //ordenes para el programador #use delay (clock=4000000) //Fosc=4Mhz #include //libreria manejo keypad #include //libreria manejo lcd 8bits #use fast_io(A) #use fast_io(B) ///PROGRAMA void main(void) { char c; //variable donde se almacena tecla pulsada lcd_init(); //inicializa lcd lcd_putc(" VsZeNeR'05 \nTecla pulsada:" ); //presentacion lcd_gotoxy(15,2); //donde se va a mostrar tecla for( ; ; ){ //bucle... do{ //espera hasta... c=kbd_getc(); }while(c==0); //...pulsar una tecla lcd_putc(c); //muestra tecla pulsada en lcd lcd_putc("\b" ); //retrocede una posicion(escribe encima de la ultima tecla mostrada) } //...infinito } Pues ya sabemos usar lcd y teclado!!!jeje hasta pronto!

Editado por 2005, 13:0620/Sep/2005 13:02

vszener, Martes, 20 de Septiembre de Privado

Perfil #114

vszener COLABORADOR

RE: Ejemplitos en C para 16F648A Desde este enlace os podeis descargar los ficheros del programa anterior: LCD & KEYPAD 3x4 http://miarroba.com/foros/ver.php?foroid=348538&temaid= 3623000 !!!

Mensajes: 649 Desde: 19/Feb/2005

20/Sep/2005 13:04

Perfil #115

Privado

martinezavg Participante Activo

RE: Ejemplitos en C para 16F648A

Hola vszener, Te Felicito por el trabajo que ests realizando al mostrar tus proyectos y conocimientos.

Mensajes: 13 Desde: 02/Sep/2004

Siempre estoy pendiente de los consejos y simulaciones que colocas. Aunque por los momentos no puedo ocuparme de experimentar por motivos de trabajo, por lo menos con t muy nutrida informacin y con los otros hilos de esta GRAN Comunidad me pongo al da..... Gracias por t aporte y de todos que participan en este magnifico FORO, ya que con sus problemas y soluciones enriquecen el conocimiento!!!

20/Sep/2005 15:29

Perfil #116

Privado

vszener COLABORADOR

RE: Ejemplitos en C para 16F648A Ke tal martinezavg!!!GRACIAS por el apoyo y por estar pendiente de mis programitas!!!jeje eso da animos para seguir poniendo mas!jeje pues cuando tengas un huequito de tu timepo ya sabes....a probar los programas y trastearlos para asi aprender!que eso es lo que se pretende con este post de ejemplos, tener una referencia de como se programa el pic y perifericos tanto externos como internos....asi que seguimos adelante como los de alicante!!!jeje

Mensajes: 649 Desde: 19/Feb/2005

22/Sep/2005 09:59

Perfil #117

Privado

vszener COLABORADOR

RE: Ejemplitos en C para 16F648A Buenas!!!el programa de hoy consiste en manejar un pokitin mas el lcd y el keypad de forma dinamica...esta vez vamos a usar un keypad de 4x4 pero nos va hacer falta modificar en algo la libreria que os puse en algun mensaje anterior ya que necesitamos adaptarla al teclado que aparece en PROTEUS, decir que vamos a usar un teclado el cual no viene instalado en PROTEUS sino que os lo debeis bajar de los enlaces que os puse en un anterior post...ahi si vienen ya que yo lo he sacado de esos enlaces(es necesario ya que sino lo haceis PROTEUS dara un error de librerias....), bien el programita consiste en hacer una llave electronica, es decir nosotros introducimos un password/clave la cual se almacenara en una variable y despues tendremos un menu donde podremos cambiar la clave o comprobarla con una introducida por teclado....decir que la programacion se ha realizado caracter por caracter al introducir y comprobar la clave por lo que el codigo es mas extenso, peor creo que asi es mas ilustrativo.....ya en la revision de este ejemplito intentaremos modificarlo para hacerlo mas optimo!aqui el programita ke me enrollo jeje!!!: ////////////////////////////////////////////////////////////////////

Mensajes: 649 Desde: 19/Feb/2005

//////////////// // VsZeNeR'05 // 21/Septiembre/05 // // Programa: Clave // Version: 0.0 // // Dispositivo: PIC 16F648A Compilador: CCS vs3.227 // Entorno IDE: MPLAB IDE v7.21 Simulador: Proteus 6.7sp3 // // Notas: Se pide por lcd una clave a introducir, despues hay un menu de opciones: // 0->Introducir password // 1->Cambiar clave // Los caracteres * o # son fin de instruccion/accion, si estamos en cambiar clave // o en comprobar clave, cada vez que se pulsen dichos caracteres se terminara // la accion. Para introducir clave, tecleamos caracteres hasta pulsar * o # y la clave // ya estara almacenada. Para comprobar clave, tecleamos caracteres hasta pulsar * o # // y se comprobara la clave introducida con la nuestra almacenada. // Tener en cuenta que hay que poner la directiva NOLVP para que el pin B4 sea de salida. // Se utiliza variables globales: // c-> almacena letra pulsada del keypad // limit -> longitud de clave // i -> contador // var -> 1->Clave incorrecta // clave[16] -> almacena clave(maximo 16 caracteres) // // Conexiones: B0 -> D0 LCD/Columna 1 keypad // B1 -> D1 LCD/Columna 2 keypad // B2 -> D2 LCD/Columna 3 keypad // B3 -> D3 LCD/Columna 4 keypad // B4 -> D4 LCD/Fila A keypad // B5 -> D5 LCD/Fila B keypad // B6 -> D6 LCD/Fila C keypad // B7 -> D7 LCD/Fila D keypad // A0 -> RS LCD // A1 -> RW LCD // A2 -> E LCD // A3 -> Led red // A5 -> Led green //////////////////////////////////////////////////////////////////// ////////////// #include //pic a utilizar #fuses XT,NOWDT,NOPROTECT,PUT,NOLVP,NOBROWNOUT,NOMCLR //ordenes para el programador #use delay (clock=4000000) //Fosc=4Mhz #include //libreria manejo keypad #include //libreria manejo lcd 8bits #use fixed_io(a_outputs=PIN_A3,PIN_A5) #use fast_io(B) ///DEFINICION DE FUNCIONES void nueva_clave(void); //funcion que cambia clave void comprueba_clave(void); //funcion que comprueba clave

///VARIABLES GLOBALES char clave[16],c,limit; signed char i; boolean var=0; ///PROGRAMA void main(void) { lcd_init(); //inicializa lcd delay_ms(50); //presentacion... output_low(PIN_A5); delay_ms(50); output_high(PIN_A3); delay_ms(50); output_low(PIN_A3); lcd_putc(" VsZeNeR'05\n Clave" ); delay_ms(1000); //...inicial nueva_clave(); //introducimos clave for( ; ; ){ //bucle... lcd_putc("\f0->Password\n1->Cambia Clave" ); do{ //espera hasta... c=kbd_getc(); }while(c==0); //...pulsar una tecla if(c=='1') //ve a introducir nueva clave nueva_clave(); if(c=='0') //ve a comprobar clave comprueba_clave(); } //...infinito } ///FUNCION CAMBIAR CLAVE void nueva_clave(void){ lcd_putc("\fNueva clave:\n" ); //presentacion for(i=0;iclave incorrecta } //...hasta pulsar * o # if(var>0){ //Clave incorrecta lcd_putc("\fClave\nIncorrecta!" ); output_high(PIN_A3); delay_ms(500); output_low(PIN_A3); } else{ //Clave correcta lcd_putc("\fClave\nCorrecta!" ); output_high(PIN_A5); delay_ms(500); output_low(PIN_A5); } var=0; //reset var } Ya tenemos neustro sistema de claves!!!!

Editado por 2005, 10:0922/Sep/2005 10:08

vszener, Jueves, 22 de Septiembre de Privado

Perfil #118

vszener COLABORADOR

RE: Ejemplitos en C para 16F648A Desde este enlace os podeis descargar lo necesario para el programa anterior: Claves http://miarroba.com/foros/ver.php?foroid=348538&temaid= 3630339 Hasta pronto!!!

Mensajes: 649 Desde: 19/Feb/2005

22/Sep/2005 10:28

Perfil #119

Privado

vszener COLABORADOR

RE: Ejemplitos en C para 16F648A Upssss se me olvidaba, la libreria modificada para el manejo del teclado os la podeis descargar desde esta direccion: http://miarroba.com/foros/ver.php?foroid=348538&temaid= 3630352 Recordar que el teclado que usamos en el programa Claves, no viene con PROTEUS, os teneis que bajar el paquete de librerias desde los enlaces que os di en algun mensaje anterior okis???Suerte!!!

Mensajes: 649 Desde: 19/Feb/2005

22/Sep/2005 10:34

Perfil #120

Privado

vszener COLABORADOR

RE: Ejemplitos en C para 16F648A Holaaa!!!el programita de hoy consiste en interaccionar el puerto serie del PC(el RS232) con nuestro PIC, los programas anteriores del RS232 habian sido al reves, es decir, el PIC era el que mandaba las ordenes al PC y se visualizaba por el v.terminal, en este ejemplo sera al contrario, sera el PC via v.terminal quien mande las ordenes al PIC. El programa consiste en encender 4 led's conectados al pic mediante teclado del PC, es decir por el v.terminal nos dara un mensaje de seleccion de numeros(del 1 al 4) segun pulsemos se iluminara un led distinto...aqui el programa: //////////////////////////////////////////////////////////////////// //////////////// // VsZeNeR'05 // 24/Septiembre/05 // // Programa: RS232 Y PIC // Version: 0.0 // // Dispositivo: PIC 16F648A Compilador: CCS vs3.227 // Entorno IDE: MPLAB IDE v7.21 Simulador: Proteus 6.7sp3 // // Notas: Se interacciona el PC con el PIC mediante RS232, se pide por v.terminal // un numero comprendido entre 1 al 4, segun numero marcado por v.terminal // se encendera un led 0,5s. Tener en cuenta que hay que poner la directiva // NOLVP para que el pin B4 sea de salida. // // Conexiones: A0 -> led azul // A1 -> led verde // A2 -> led rojo // A4 -> led amarillo // B2 -> TxD // B1 -> RxD //////////////////////////////////////////////////////////////////// ////////////// #include //pic a utilizar

Mensajes: 649 Desde: 19/Feb/2005

#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP,NOBROWNOUT //ordenes para el programador #use delay (clock=4000000) //Fosc=4Mhz #use fixed_io(a_outputs=PIN_A0,PIN_A1,PIN_A2,PIN_A3) #use rs232(baud=9600, xmit=PIN_B1, rcv=PIN_B2, FORCE_SW) //manejo del RS232 ///PROGRAMA void main(void) { puts("Interaccion PC->PIC VsZeNeR'05" ); //presentacion... puts("=================" ); puts("Seleccione tecla:" ); puts("" ); puts(" 1->Led on Azul" ); puts(" 2->Led on Verde" ); puts(" 3->Led on Rojo" ); puts(" 4->Led on Amarillo" ); //...inicial for( ; ; ){ //bucle... switch(getc()){ //coge tecla case '1': output_high(PIN_A0); delay_ms(500); output_low(PIN_A0); break; case '2': output_high(PIN_A1); delay_ms(500); output_low(PIN_A1); break; case '3': output_high(PIN_A2); delay_ms(500); output_low(PIN_A2); break; case '4': output_high(PIN_A3); delay_ms(500); output_low(PIN_A3); } } //...infinito }

//led on azul

//led on verde

//led on rojo

//led on amarillo

Bueno ya sabemos interaccion PIC->PC y PC->PIC!!!estare perdido durante el finde ya que me voy a isla magica, aparte tengo que hacer un examen......jeje bueno ya regresare con mas ejemplos y mas ganas de programar!!!hasta pronto!!!