#include <htc.h>
#include <pic16f84a.h>
__CONFIG(0x3FFB&0x3FFD&0x3F7F);
int a,i; /*variables int para contador ya que seran valores grandes(como dijiste aproximadamente 20 por segundo)*/
char q,m; /*variable 'q' para el minuto y 'm' para sensar el minuto*/
/*****Interrupcion del TMR0*****/
/***** *****/
interrupt isr_tmr0(void)
{
i++; /*variable 'i'para milisegundos*/
if(i>=957)
{
q++;
i=0;
}
if(m==2&&a>0)
{ /*si 'm' es igual a 2 y 'a' es mayor que cero*/
a--; /*decrementar 'a'*/
RB7=1; /*enviar 1 a la salida RB7*/
}
if(a==0)
{
m=0;
}
T0IF = 0;
TMR0 = 130;
}
/*****Programa principal*****/
/***** *****/
main()
{
a=0; /*poner todas las variables a cero para empezar*/
i=0; /* */
q=0; /* */
m=0; /* */
for;;
if(RB0==0)
{ /*cada vez que RB0 este en nivel bajo*/
a++; /*aumentará la variable 'a'*/
}
if(q==60)
{
m=2; /*la variable 'm' avisa que ya se cumplio un minuto*/
q=0; /*se reinicia el minutero*/
}
RB0=0; /*enviar un cero a la salida RB0*/
}
/*********/
/* FIN */
/*********/
El ejemplo de Adak me convencio mucho pero lo malo que tendria que adaptarlo para el CCS, debido aa que ya estoy trabando con CCS para la comunicacion para el USB, entocnes me quedo con CCS, si algun valiente se avienta la conversion del ejemplo de Adak, agradecido, sin embargo gracias Adak.
Código: [Seleccionar]#include <htc.h>
#include <pic16f84a.h>
__CONFIG(0x3FFB&0x3FFD&0x3F7F);
int a,i; /*variables int para contador ya que seran valores grandes(como dijiste aproximadamente 20 por segundo)*/
char q,m,g; /*variable 'q' para el minuto y 'm' para sensar el minuto*/
/*****Interrupcion del TMR0*****/
/***** *****/
interrupt isr_tmr0(void)
{
i++; /*variable 'i'para milisegundos*/
if(i>=957)
{
q++;
i=0;
}
if(m==2&&a>0)
{ /*si 'm' es igual a 2 y 'a' es mayor que cero*/
a--; /*decrementar 'a'*/
RB7=1; /*enviar 1 a la salida RB7*/
}
if(a==0)
{
m=0;
}
T0IF = 0;
TMR0 = 130;
}
/*****Programa principal*****/
/***** *****/
main()
{
a=0; /*poner todas las variables a cero para empezar*/
i=0; /* */
q=0; /* */
m=0;
g=0; /* */
for;;
if(RB0==0&&g==0)
{ /*cada vez que RB0 este en nivel bajo*/
a++; /*aumentará la variable 'a'*/
g++;
}if(RB0==1)
{
g=0; /*variable 'g'*/
}
if(q==60)
{
m=2; /*la variable 'm' avisa que ya se cumplio un minuto*/
q=0; /*se reinicia el minutero*/
}
RB0=0; /*enviar un cero a la salida RB0*/
}
/*********/
/* FIN */
/*********/
Probá este programita, lo termié hace unos minutos..
Sensa el pin RB0 cada un minuto y cuando detecta un nivel bajo aumenta el valor de la variable 'a', luego envia la cantidad de pulsos equivalentes al valor de la variable 'a' a la pata RB7, con una frecuencia de 1Khz :-/
Modifique algo del codigo que subi, como puedes ver la variable 'g' permitira un solo aumento de la variable 'a' (por bajada de la pata RB0), de lo contrario la variable 'a' aumentara demasiado debido a la velocidad de las instrucciones y sera un desastre, ah y por sierto este programa funciona con un cristal de 4Mz, Adios! Feliz Navidad a todos!
#include <18F2550.h> // Definición de registros internos.
#fuses HSPLL,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN
#use delay(clock=48000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#include "usb_cdc.h" // Descripción de funciones del USB.
#include "usb_desc_cdc.h" // Descriptores del dispositivo USB.
#define LED_V PIN_B6
#define LED_R PIN_B7
#define ON output_high
#define OFF output_low
int1 flag_listo = 0;
int16 cont_pulsos = 0;
int16 cont_pulsos_rec;
#INT_EXT
void interrupt_ext (void)
{
cont_pulsos++;
}
#INT_RTCC
void timer0 (void)
{
set_timer0(3036);
cont_pulsos_rec = cont_pulsos;
cont_pulsos = 0;
flag_listo = 1;
}
void main(void) {
ON(LED_R);
OFF(LED_V);
usb_cdc_init();
usb_init();
usb_wait_for_enumeration();
OFF(LED_R);
ON(LED_V);
set_tris_b(0x01);
setup_timer_0 (RTCC_INTERNAL|RTCC_DIV_16);
ext_int_edge(H_TO_L);
enable_interrupts(INT_RTCC);
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
set_tris_b (1);
set_timer0(3036);
do{
if(flag_listo)
{
flag_listo = 0;
printf("Pulsos: %Lu\r\n",cont_pulsos_rec);
}}while(1);
while(!usb_cdc_connected()) {}
// espera a detectar una transmisión de la PC (Set_Line_Coding).
do{
usb_task();
if (usb_enumerated()){ // Espera a que el dispositivo sea enumerado por el host.
if(usb_cdc_kbhit()){ // En espera de nuevos caracteres en el buffer de recepción.
if(usb_cdc_getc()=='x'){ //¿lo que llegó fué el caracter x?
printf(usb_cdc_putc, "Se recibe el caracter x.\n\r");
//si, entonces envía una cadena hacia el PC
}
if(usb_cdc_getc()=='a'){ //¿lo que llegó fué el caracter a?
printf(usb_cdc_putc, "Se recibe el caracter a.\n\r");
//si, entonces envía una cadena hacia el PC
}
}
}
}while (TRUE); // bucle infinito.
}
switch(op)
case "1":
if(cont_pulsos==0b00010011)
contador++
break;
case "2":
printf.... el contador es...
break;