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

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado electronando

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 427
Re: Ejemplitos en C para 16F648A
« Respuesta #315 en: 23 de Febrero de 2007, 13:55:53 »
ok Gracias por la ayuda  :mrgreen:

Desconectado J.C

  • PIC10
  • *
  • Mensajes: 23
Re: Ejemplitos en C para 16F648A
« Respuesta #316 en: 06 de Marzo de 2007, 12:51:05 »
me haria falta saber que espasio de memoria ROM y RAM te ocupo el programa del DS1302 con LCD saludos J.C
Todo esta ahi... no hay mas que mirar.

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
Re: Ejemplitos en C para 16F648A
« Respuesta #317 en: 07 de Marzo de 2007, 12:29:02 »
Te lo puedes bajar, y lo compilas y ya te da la información que requieres.


Suerte!!! ;)
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado mariano_pic

  • PIC18
  • ****
  • Mensajes: 499
    • Software Electronica Microncontroladores
Re: Ejemplitos en C para 16F648A
« Respuesta #318 en: 09 de Marzo de 2007, 19:02:53 »
Hola VsZener, esta todo muy bien y los ejemplos muy buenos pero como me gustaria bajar todos los ejemplos y tenerlos para usarlos offline entre a tu disco duro virtual pero aparese en "0" todos los archivos. Entonses me preguntaba si no los as subido, todabia o los estas quitando, por favor cuentanos si los volveras a colocar en otro laddo o ahi mismo
muchas gracias

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
Re: Ejemplitos en C para 16F648A
« Respuesta #319 en: 10 de Marzo de 2007, 13:54:52 »
Los volveré a subir en ese mismo lugar lo antes posible.

PD: Disculpad las molestias.


Suerte!!! ;)
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
Re: Ejemplitos en C para 16F648A
« Respuesta #320 en: 16 de Marzo de 2007, 12:02:19 »
Ya está subido de nuevo los ejemplitos para que se puedan descargar todos conjuntamente, esta vez los he puesto en otro lugar, esta es la dirección:
http://www.box.net/shared/4l7bedpqrz


Suerte!!! ;)
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado lexer

  • PIC10
  • *
  • Mensajes: 11
Re: Ejemplitos en C para 16F648A
« Respuesta #321 en: 22 de Marzo de 2007, 00:43:14 »
Hola

Por favor si alguien me pouede ayudar, estoy haciendo pruebas con el ejemplito #52, Trato de escribir en la EEPROM, pero no lo está haciendo bien. Por ejemplo trate de escribir segun las instrucciones del programa en la direccion 00 la letra a (61 Hex), Estoy usando el compilador de CCS versión 3.249 integrado con Mplab 7.41, para simular el proteus 6.9 SP4. Anexo print screen

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
Re: Ejemplitos en C para 16F648A
« Respuesta #322 en: 23 de Marzo de 2007, 06:38:28 »
Si usas el mismo programa sin modificarlo, debe funcionar, ya que la escritura es en hexadecimal también.


Suerte!!! ;)
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Ejemplitos en C para 16F648A
« Respuesta #323 en: 31 de Mayo de 2007, 15:41:27 »
Hola Vszener, eres una gran persona al dar ejemplos asi para q la gente pueda aprender y entender gracias a tus explicaciones y dicho sea de paso me incluyo en ellos. Deverdad gracias a tus ejemplos e aprendido muchas cosas ya sea AD, EEPROM, etc... y queria agradecerte  :-/  Enserio se agradace tanto esfuerzo de tu parte y lo mas importante el tiempo q te tomas para esto :o Gracias.

Ahora que me ha llegado los DS1302 q pedi e comenzado a probarlo cn tu ejemplo y dejame decirte q es un gran ejemplo (como los demas claro :mrgreen:), el problema q tengo esq yo uso el PIC18F2550 y nose si alterara algo el programa... creo q ay q configurar ago aqui:
Código: [Seleccionar]
setup_counters(RTCC_INTERNAL,RTCC_DIV_256);
Ya me habian hablado de esto pero no logro entenderlo muy y pues por eso creo q abra q modificarlo o algo no ¿?  :? Tambien para el DS1302 uso un cristal de 455KH y se que en el datashet dicen q tiene q ser de 37,64KH si mal no recuerdo, por eso quiero saber cual usas tu y si este q uso alteraria algo. Y bien, el lcd y todo funciona pero al salir del menu d configuracion los segundos no avanzan o avanzan muy muy lentos y aveces toman valores en hexadecimal o almenos asi parece; ese es el problema q tengo, porsiacaso te dejo el proyecto q no e modificado nada solo pines y nada, todo lo entiendo... como aces esto y el otro :) :

Código: [Seleccionar]
////////////////////////////////////////////////////////////////////////////////////
//                     VsZeNeR'05     
//                     09/Septiembre/05
//                  vszener@gmail.com
//   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
//               C7 -> Boton 'up'
//               A5 -> Boton 'CONF/Ok'
//               B0 -> E           
//               B1 -> RS         
//               B2 -> RW     
//               B4 -> D4       
//               B5 -> D5           
//               B6 -> D6   
//               B7 -> D7
//               B3 -> Zumbador(beep)                   
//////////////////////////////////////////////////////////////////////////////////

#include <18F2550.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(c)
//#use standard_io(b)
//#define use_portb_lcd TRUE         //utilizar el port b para lcd
#define RTC_SCLK PIN_C1            //A  definimos pin's...
#define RTC_IO   PIN_C2
#define RTC_RST  PIN_C0            //...de conexion de la rtc ds1302
#include <ds1302.c>               //libreria de rtc ds1302
#include <lcd_F2550.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\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   VZENER'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_C6)){
                  while(!input(PIN_C6)){}
                  beep();
                  horas();
                  menu=1;                        //apunta siguiente opcion
                  }
               break;
         case 1: lcd_putc("\fCONFIGURAR\nMINUTOS?");      //minutos
               if(!input(PIN_C6)){
                  while(!input(PIN_C6)){}
                  beep();
                  minutos();
                  menu=2;                        //apunta siguiente opcion
                  }
               break;
         case 2: lcd_putc("\fCONFIGURAR\nDIA?");         //dias
               if(!input(PIN_C6)){
                  while(!input(PIN_C6)){}
                  beep();
                  dia();
                  menu=3;                        //apunta siguiente opcion
                  }
               break;
         case 3: lcd_putc("\fCONFIGURAR\nMES?");         //mes
               if(!input(PIN_C6)){
                  while(!input(PIN_C6)){}
                  beep();
                  mes();
                  menu=4;                        //apunta siguiente opcion
                  }
               break;
         case 4: lcd_putc("\fCONFIGURAR\nANIO?");      //años
               if(!input(PIN_C6)){
                  while(!input(PIN_C6)){}
                  beep();
                  anio();
                  menu=5;                        //apunta siguiente opcion
                  }
               break;
         case 5: lcd_putc("\fSALIR\nCONFIGURAR?");      //salir CONFiguracion
               if(!input(PIN_C6)){
                  menu=6;
                  beep();
                  }               
         }
         
      if(!input(PIN_C7)){            //controla el boton up...
         while(!input(PIN_C7)){}
         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:\nHORA: %2X:%2X:%2X",hour,min,sec);   //muestra por lcd
   do{
      if(!input(PIN_C7)){                  //¿se ha pulsado up?
         while(!input(PIN_C7)){}            //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,"\nHORA: %2X:%2X:%2X",hour,min,sec);   //muestra por lcd hour
         }
      }while(input(PIN_C6));
   while(!input(PIN_C6)){}         //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_C7)){            //¿se ha pulsado up?
      while(!input(PIN_C7)){}         //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_C6));
   while(!input(PIN_C6)){}         //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_C7)){               //¿se ha pulsado up?
         while(!input(PIN_C7)){}         //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_C6));
   while(!input(PIN_C6)){}         //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_C7)){               //¿se ha pulsado up?
         while(!input(PIN_C7)){}         //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_C6));
   while(!input(PIN_C6)){}         //elimina rebotes
}
///FUNCION CONFIGURA AÑOS
void anio(void){
   printf(lcd_putc,"\fCONF.ANIO:\nFECHA: %2X/%2X/%2X",day,mth,year);   //muestra por lcd
   do{
      if(!input(PIN_C7)){               //¿se ha pulsado up?
         while(!input(PIN_C7)){}         //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_C6));
   while(!input(PIN_C6)){}         //elimina rebotes
}
///FUNCION BEEP
void beep(void){
   output_high(PIN_B3);   //activa zumbador
   delay_ms(50);
   output_low(PIN_B3);      //desactiva zumbador
}

Lo de la modificacion de las letras (mayuscula/minuscula) de lo q se muestra por el LCD llo cambie porq en minusculas aveces ocurren errores :S Y lo de <lcd_f2550> es una moficacion q hice para q el lcd funcionara de eso no ay nada q preocuparse.

Ah cambie los pines de conexion del DS1302 y los botones pocierto  :mrgreen:

Espero q me puedas ayudar  :-)  Gracias de antemano.
salu2  8) 8) 8)

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Ejemplitos en C para 16F648A
« Respuesta #324 en: 31 de Mayo de 2007, 20:32:50 »
Hola, disculpen el doble post pero esque regreso de comprarme el Cristal 32.768 q me piden en el datashet para el DS1302; lo cambie y el problema persiste... todo bien pero cuando salgo de la configuracion se demora como 1 minuto en ejecutar el Timer0 por asi decirlo; despues, los segundos avanzan al parecer bien pero en el lcd no se muestra o se muestra por partes, y si se muestra lo hace aveces en haxadecimal  :?. Parece q el problema, como ya e dicho, esta en esta linea:
Código: [Seleccionar]
setup_counters(RTCC_INTERNAL,RTCC_DIV_256);
Dado q uso otro PIC (18F2550), aunq no estoy del todo seguro. Haber Vszener si me das una ayudita porfavor :lol: o quien sepa del tema, cualquier ayuda es bienvenida  :)


salu2 8) 8) 8)

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
Re: Ejemplitos en C para 16F648A
« Respuesta #325 en: 01 de Junio de 2007, 09:31:28 »
Los pic's de la familia mejorada de 8-bits, es decir, los PIC18, el timer puede ser configurable de 8 o 16-bits, me parece que ese es el problema, que por defecto viene configurado a 16-bits, configuralo a 8-bits y ya el timer estará solucionado.


Suerte!!! ;)
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Ejemplitos en C para 16F648A
« Respuesta #326 en: 01 de Junio de 2007, 15:57:51 »
Los pic's de la familia mejorada de 8-bits, es decir, los PIC18, el timer puede ser configurable de 8 o 16-bits, me parece que ese es el problema, que por defecto viene configurado a 16-bits, configuralo a 8-bits y ya el timer estará solucionado.


Suerte!!! ;)
Y como hago eso?  :?  Disculpa mi ignorancia :$

salu2 8)

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
Re: Ejemplitos en C para 16F648A
« Respuesta #327 en: 01 de Junio de 2007, 17:59:44 »
Buenas!!! No pretendo ser gruñón, pero en la 'help' del compilador está todas las funciones del mismo y sus respectivas configuraciones, en este caso, la del timer0, sólo para la família PIC18 están estas dos nuevas configuraciones:
Código: C
  1. PIC18XXX only: RTCC_OFF, RTCC_8_BIT

Por lo tanto, nuestra línea de código referente al timer0, debe quedar tal como sigue:
Código: C
  1. setup_timer_0(RTCC_8_BIT|RTCC_INTERNAL|RTCC_DIV_256);

Así, diremos que configure el timer0 como timer interno, de 8-bits y un preescaler de 256, con lo que quedaría equivalente al de la família PIC16.


Suerte!!! ;)
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Ejemplitos en C para 16F648A
« Respuesta #328 en: 01 de Junio de 2007, 18:25:24 »
Gracias Vszener, disculpa mi ignorancia ^.^' 

Bueno ahora todo bien, pero hay un pequeño problemita y es que cuando los segundos llegan al 10 enves de este aparece: 0A luego 0B, 0C, 0D, 0E, 0F y de ahi se pone en 10 y comienza recien en 11, 12... y asi pasa en el 20, 30... y por eso acaban los segundos en el 40 creo. ¿ Sabes q esta pasando ? :?

Ah, y me surge una preguntita y esque en el puerto B en el pin 5 puse un led para comprobar el funcionamiento, prendiendolo justo cuando salimos del menu de configuracion. Entonces, saliendo del menu configurar, este led comienza a oscilar contnuamente cada 250ms masomenos y bueno queria saber a q se debe esto  :-) Ah y me acabo de dar cuenta q pasa lo mismo con los minutos  :? supongo q tb para las horas sera igual y para los dias y eso  :? :? :(

Gracias nuevamente  :P
salu2  8) 8)
« Última modificación: 01 de Junio de 2007, 18:27:47 por jeremylf »

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Ejemplitos en C para 16F648A
« Respuesta #329 en: 02 de Junio de 2007, 14:20:57 »
Bueno, ya encontre el fallo y esq solo tenia q cambiar el %2X por %02u  :-/ Si, estuv revisando la ayuda del CCS  :-)

Gracias dnuevo Vszener por estos grandiosos ejemplos :o


salu2 8) 8) 8)

PD: Disculpn el doble post  :mrgreen:


 

anything