Autor Tema: Int16 en Pic16f886  (Leído 1461 veces)

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

Desconectado Ranculche

  • PIC12
  • **
  • Mensajes: 74
Int16 en Pic16f886
« en: 01 de Septiembre de 2014, 18:24:22 »
Hola a todos. Escribo porque tengo alguna duda con la variable int16. Resulta que necesito usar el Timer1 del pic16f886, y para probar que funcione bien hice un pequeño programa donde el timer1 interrumpe cada 1ms, y acumulo en las variables ms (los milisegundos), seg (los segundos) y min (los minutos). El problema que tengo es que cuando utilizo a "ms" como int, solo llega hasta 256 (no se si eso esta bien, el wath del debugguer me lo muestra asi). Como necesito que llegue a 1000 cuentas, para completar el Segundo, declare a la variable "ms" como int16, pero la forma en que se acumula esta (ms++) es de la siguiente manera:

ms: 0x0000
ms++
ms: 0x0100
ms++
ms: 0x0200
ms++
ms: 0x0300
ms++
......etc

No se si eso es asi o algo funciona mal. Aqui dejo el programa para que opinen si algo tengo mal. Gracias!!

//------Directivas para el compilador--------

#Include <16F886.h>                                                                  //PIC utilizado
#Fuses HS, NOWDT, NOPUT, NOBROWNOUT, NOCPD, NOPROTECT                   //Configuramos los fuses
#Use Delay (Clock=20000000)                                                            //Oscilador a 4Mhz
#Use Fast_Io(B)                                                                       //Optimizamos E/S del PORTB
#Use Fast_Io(A)                                                                 //Optimizamos E/S del PORTA
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#byte portb = 0x06


int16 ms=0;
int seg=0;
int min=0;   



void main(void)
{
         

   //-----------------------configuramos la interrupciones------------------------------------------
   disable_interrupts(global);                                 //desactivo todas las interrupciones
   
   //-----------------------configuro el timer 1--------------------------------------------------
   setup_timer_1( T1_INTERNAL | T1_DIV_BY_1);               //Defino como fente al clock interno
     set_timer1(60336);                                              //cargo el timer0
   enable_interrupts(INT_TIMER1);

   //-----------------------configuro la Interrupcion Externa------------------------------------
   enable_interrupts(INT_EXT);
   ext_int_edge(L_TO_H);

   //---------------------------//activo las interrupciones---------------------------------------
   enable_interrupts(global);

   set_tris_a(0b00000000);
   set_tris_b(0b00000001);
   set_tris_c(0b00000000);   
   
   while(true)
   { 
      
   
      if(ms==1000)   
      {
         seg++;
         ms=0;
      }
      if(seg>=60)   
      {
         min++;
         seg=0;
      }

   }
   
}


#int_ext
void Interrupcion_ext()
{
//   set_timer1(0);
//   ext_int_edge( H_TO_L );
}

#int_timer1
void Timer_1()
{
   ms++;
   set_timer1(60336);
}
« Última modificación: 01 de Septiembre de 2014, 18:26:52 por Ranculche »

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: Int16 en Pic16f886
« Respuesta #1 en: 01 de Septiembre de 2014, 18:43:03 »
En donde estas haciendo debug?, el programa funciona, lo simule en proteus y va todo bien
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado Ranculche

  • PIC12
  • **
  • Mensajes: 74
Re: Int16 en Pic16f886
« Respuesta #2 en: 01 de Septiembre de 2014, 18:51:44 »
Hola Jhozate. El IDE qeu uso es MPLAB v8.50 y el debug lo hago con el Pickit3 grabando el micro. Tengo la duda si sera eso o que. Lo que tambien me pasaba, era que no me dejaba poner un Breakpoint dentro del "if" : if(ms>=1000), por eso termine poniendo if(ms==1000). Probe con un programa para que interrumpa cada 50ms, con todas variables int, y funciona bien. Sera que 1 ms es poco tiempo? En otras ocasiones es probado el Timer2 para que interrumpa cada 100useg y no he tenido problema, solo que en esa ocasion tenia osciloscopio y lo constataba mas facil.

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: Int16 en Pic16f886
« Respuesta #3 en: 01 de Septiembre de 2014, 19:01:34 »
No, no es poco tiempo,  pero si solo necesitas esa interrupción para ese propósito podrías ampliar el tiempo a 500mS, con eso solo cuentas dos veces y usas una variable de 1Byte, o quizás ajustar el timer a 1segundo aumentando el prescaler
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado Ranculche

  • PIC12
  • **
  • Mensajes: 74
Re: Int16 en Pic16f886
« Respuesta #4 en: 01 de Septiembre de 2014, 19:31:19 »
Si si, lo necesito para otra cosa, era solo probarlo que lo podia hacer funcionar bien. Me queda la duda de lo que pasa con el int16, alguna opinion?

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: Int16 en Pic16f886
« Respuesta #5 en: 02 de Septiembre de 2014, 14:16:01 »
ya no recuerdo como se simula en mplab, pero quizas debas indicarle al debugger cual es el  tipo de la variable  que visualizas
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA


 

anything