Autor Tema: Ejemplitos en C para 16F648A  (Leído 736319 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado RaDoN

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1498
RE: Ejemplitos en C para 16F648A
« Respuesta #90 en: 08 de Septiembre de 2005, 13:43:00 »
Bueno sí, eso esta claro, en programacion no hay nada "aleatorio", todo tiene una secuencia, si no que se o pregunten a los que se curran los generadores de claves Vacilando
Si juegas contra el mejor, pierdes como los demás.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
RE: Ejemplitos en C para 16F648A
« Respuesta #91 en: 09 de Septiembre de 2005, 02:30:00 »
¿No creeis que se podría generar una semilla aleatoria realmente aleatoria si formamos un byte con 8 lecturas consecutivas sobre un pin que esté configurado como entrada "al aire"?

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: Ejemplitos en C para 16F648A
« Respuesta #92 en: 09 de Septiembre de 2005, 03:51:00 »
Sí esa sería una forma.

Otra leyendo el valor de un TMR en un momento al hazar.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
RE: Ejemplitos en C para 16F648A
« Respuesta #93 en: 09 de Septiembre de 2005, 04:10:00 »
Sí, pero ese momento al azar sólo puede venir de un evento externo, ¿no?.

Desconectado RaDoN

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1498
RE: Ejemplitos en C para 16F648A
« Respuesta #94 en: 09 de Septiembre de 2005, 04:21:00 »
Escrito originalmente por nocturno66
¿No creeis que se podría generar una semilla aleatoria realmente aleatoria si formamos un byte con 8 lecturas consecutivas sobre un pin que esté configurado como entrada "al aire"?


Tenia entendido que eso no es especialmente bueno para la entrada loco
Si juegas contra el mejor, pierdes como los demás.

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
RE: Ejemplitos en C para 16F648A
« Respuesta #95 en: 11 de Septiembre de 2005, 05:30:00 »
Bueno el siguiente ejemplito vamos a utilizar un RTC(real time clock), es decir un reloj de tiempo real, el dispositivo rtc a tratar es el DS1302 de Dallas Semiconductor, este dispositivo aparte de dar la hora en tiempo real, tambien da la fecha, es decir es un dispositivo que se comporta como reloj-calendario, la pagina que dedica Dallas al dispositivo:
http://www.maxim-ic.com/quick_view2.cfm/qv_pk/2685
Y vamos a trabajar con la libreria que trae CCS para este dispositivo la cual es DS1302.C donde estan todas las funciones definidas para el manejo del dispositivo en cuestion, la pagina web donde esta la libreria mencionada:
http://www.ccsinfo.com/data.shtml
Bien, mirarse los enlaces anteriores(los data sheet) para saber con que nos enfrentamos!!!!jeje
Al lio!!!!Giño
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
RE: Ejemplitos en C para 16F648A
« Respuesta #96 en: 11 de Septiembre de 2005, 05:39:00 »
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 -> año 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 <16f648a.h>            //pic a utilizar          
#use delay(CLOCK=4000000)         //Fosc=4Mhz
#fuses HS,NOPUT,NOPROTECT,NOBROWNOUT,NOLVP,NOWDT,NOMCLR   //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 <ds1302.c>               //libreria de rtc ds1302
#include <lcd.c>                //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,año
         rtc_get_time(hour,min,sec );      //coge hora,minuto,segundo
      printf(lcd_putc,"fFecha: %2X/%2X/%2X
Hora: %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
   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
horas?" );      //horas
               if(!input(PIN_A5)){
                  while(!input(PIN_A5)){}
                  beep();
                  horas();
                  menu=1;                     

   //apunta siguiente opcion
                  }
               break;
         case 1: lcd_putc("fConfigurar
minutos?" );      //minutos
               if(!input(PIN_A5)){
                  while(!input(PIN_A5)){}
                  beep();
                  minutos();
                  menu=2;                     

   //apunta siguiente opcion
                  }
               break;
         case 2: lcd_putc("fConfigurar
dia?" );         //dias
               if(!input(PIN_A5)){
                  while(!input(PIN_A5)){}
                  beep();
                  dia();
                  menu=3;                     

   //apunta siguiente opcion
                  }
               break;
         case 3: lcd_putc("fConfigurar
mes?" );         //mes
               if(!input(PIN_A5)){
                  while(!input(PIN_A5)){}
                  beep();
                  mes();
                  menu=4;                     

   //apunta siguiente opcion
                  }
               break;
         case 4: lcd_putc("fConfigurar
anio?" );      //años
               if(!input(PIN_A5)){
                  while(!input(PIN_A5)){}
                  beep();
                  anio();
                  menu=5;                     

   //apunta siguiente opcion
                  }
               break;
         case 5: lcd_putc("fSalir
configurar?" );      //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<6);
      
      menu=0;                                 

//actualiza indices menu
      rtc_set_datetime(day,mth,year,dow,hour,min);   //nueva hora,minuto,...
      enable_interrupts(GLOBAL);                  //activadas

interrupciones
      set_timer0(0);                           

//carga TMR0
}
///FUNCION CONFIGURA HORAS
void horas(void){
   printf(lcd_putc,"fConf.Horas:
Hora: %2X:%2X:%2X",hour,min,sec);   //muestra por lcd
   do{
      if(!input(PIN_A3)){                  //¿se ha pulsado up?
         while(!input(PIN_A3)){}            //elimina rebotes
         hour++;                        //SI ->

incremento hour
         switch(hour){                  //limites...
            case 0x0A:   hour=0x10;break;      
            case 0x1A:   hour=0x20;break;
            case 0x24:   hour=0x00;
            }                        

//...hour
         printf(lcd_putc,"
Hora: %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:
Hora: %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,"
Hora: %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:
Fecha: %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:
Fecha: %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:
Fecha: %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:
Fecha: %2X/%2X/%2X",day,mth,year);   //muestra por

lcd
         }
      }while(input(PIN_A5));
   while(!input(PIN_A5)){}         //elimina rebotes
}
///FUNCION CONFIGURA AÑOS
void anio(void){
   printf(lcd_putc,"fConf.Anio:
Fecha: %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:
Fecha: %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!jejeGiño
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
RE: Ejemplitos en C para 16F648A
« Respuesta #97 en: 11 de Septiembre de 2005, 05:42:00 »
Desde este enlace os podeis descargar lo necesario para el programa anterior: Reloj-Calendario ds1302


Suerte!!! :wink:
« Última modificación: 25 de Mayo de 2006, 10:50:48 por vszener »
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
RE: Ejemplitos en C para 16F648A
« Respuesta #98 en: 13 de Septiembre de 2005, 10:14:00 »
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/

Giño!!!
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
RE: Ejemplitos en C para 16F648A
« Respuesta #99 en: 13 de Septiembre de 2005, 10:18:00 »
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:

////////////////////////////////////////////////////////////////////////////////////
//                     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 Giño" 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 <16f648a.h>            //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<lcd.c>                  //libreria manejo lcd

///PROGRAMA
void main(void)
{   
   lcd_init();         //inicializa lcd
   
   printf(lcd_putc,"hola mundo ; )
VsZeNeR"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 añadido para se vea su conexion del pic al pc......ya hace un mes que inicie el post!!!!!oleeeee!!!!Giño
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
RE: Ejemplitos en C para 16F648A
« Respuesta #100 en: 13 de Septiembre de 2005, 10:21:00 »
Desde este enlace os podeis descargar los archivos necesarios para el programa anterior: lcd & RS232


Suerte!!! :wink:
« Última modificación: 25 de Mayo de 2006, 10:51:38 por vszener »
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
RE: Ejemplitos en C para 16F648A
« Respuesta #101 en: 16 de Septiembre de 2005, 07:58:00 »
Buenas!!!!Bien, el siguiente ejemplito es basado el un programa anteriormente realizado, es un reloj-calendario(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 -> año 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 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 <16f648a.h>            //pic a utilizar          
#use delay(CLOCK=4000000)         //Fosc=4Mhz
#fuses HS,NOPUT,NOPROTECT,NOBROWNOUT,NOLVP,NOWDT,NOMCLR   //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 <ds1302.c>               //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,año
         rtc_get_time(hour,min,sec );      //coge hora,minuto,segundo
      printf("fFecha: %2X/%2X/%2X
Hora: %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
horas?" );      //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
minutos?" );      //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
dia?" );         //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
mes?" );         //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
año?" );         //años
               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
configurar?" );      //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<6);      
      
      menu=0;                                 //actualiza indices menu
      rtc_set_datetime(day,mth,year,dow,hour,min);   //nueva hora,minuto,...
      enable_interrupts(GLOBAL);                  //activadas interrupciones
      set_timer0(0);                           //carga TMR0
}
///FUNCION CONFIGURA HORAS
void horas(void){
   printf("fConf.Horas:
Hora: %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
         hour++;                        //SI -> incremento hour
         switch(hour){                  //limites...
            case 0x0A:   hour=0x10;break;      
            case 0x1A:   hour=0x20;break;
            case 0x24:   hour=0x00;
            }                        //...hour
         printf("
Hora: %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:
Hora: %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("
Hora: %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:
Fecha: %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:
Fecha: %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:
Fecha: %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:
Fecha: %2X/%2X/%2X",day,mth,year);   //muestra por v.terminal
         }
      }while(input(PIN_A5));
   while(!input(PIN_A5)){}         //elimina rebotes
}
///FUNCION CONFIGURA AÑOS
void anio(void){
   printf("fConf.Año:
Fecha: %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.Año:
Fecha: %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
, 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!jejeGiño
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
RE: Ejemplitos en C para 16F648A
« Respuesta #102 en: 16 de Septiembre de 2005, 08:00:00 »
Desde esta direccion os podeis descargar los archivos necesarios del ejemplo anterior: RS232 & DS1302


Suerte!!! :wink:
« Última modificación: 25 de Mayo de 2006, 10:52:22 por vszener »
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
RE: Ejemplitos en C para 16F648A
« Respuesta #103 en: 18 de Septiembre de 2005, 04:50:00 »
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 aquiGiño
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
RE: Ejemplitos en C para 16F648A
« Respuesta #104 en: 18 de Septiembre de 2005, 04:56:00 »
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 <16f648a.h>            //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_kbd TRUE         //definir portb keypad
#include<kbd.c>                  //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("
Pulse una tecla:  " );                  //...presentacion
   
   for( ; ; )   {   //bucle...
      do{               //hacer hasta...
         c=kbd_getc();   //recogemos tecla pulsada
      }while(c=="");    //...que no se pulse tecla
      
      printf("" );      //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!Giño
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte