TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: Ranculche 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);
}
-
En donde estas haciendo debug?, el programa funciona, lo simule en proteus y va todo bien
-
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.
-
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
-
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?
-
ya no recuerdo como se simula en mplab, pero quizas debas indicarle al debugger cual es el tipo de la variable que visualizas