Autor Tema: Manejo del TIMER0 desde el CCS  (Leído 15319 veces)

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

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Manejo del TIMER0 desde el CCS
« Respuesta #15 en: 28 de Febrero de 2011, 13:10:35 »
por la red se consiguen programas para calcular el timer,

RedPic tiene uno:

http://www.todopic.com.ar/foros/index.php?topic=19454.0

aquí hay otro:

http://pictimer.picbingo.com/

La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado verag123

  • PIC10
  • *
  • Mensajes: 4
Re: Manejo del TIMER0 desde el CCS
« Respuesta #16 en: 27 de Febrero de 2014, 15:31:56 »
HOLA A TODOS, LO QUE SUCEDE ESQUE NECESITO UN PROGRAMA SIMILAR QUE ME LEA LOS PULSOS DE UNA ENTRADA Y QUE LOS CUENTE. AL CONTAR DOS PULSOS QUE ENCIENDA UNA SALIDA Y AL CONTAR TRES QUE ENCIENDA OTRA.

AGRADECERIA ENORMEMENTE SI ME COLABORAN CON EL CODIGO.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Manejo del TIMER0 desde el CCS
« Respuesta #17 en: 27 de Febrero de 2014, 16:10:34 »
HOLA A TODOS, LO QUE SUCEDE ESQUE NECESITO UN PROGRAMA SIMILAR QUE ME LEA LOS PULSOS DE UNA ENTRADA Y QUE LOS CUENTE. AL CONTAR DOS PULSOS QUE ENCIENDA UNA SALIDA Y AL CONTAR TRES QUE ENCIENDA OTRA.

AGRADECERIA ENORMEMENTE SI ME COLABORAN CON EL CODIGO.

  Podemos ayudar siempre y cuando muestres lo que tienes y entre todos corregir errores y/o aconsejar cambios. Pero hacer el trabajo por tí,  :? no.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado verag123

  • PIC10
  • *
  • Mensajes: 4
Re: Manejo del TIMER0 desde el CCS
« Respuesta #18 en: 28 de Febrero de 2014, 03:49:53 »
OK CLARO, POR SU PUESTO, MUCHAS GRACIAS POR RESPONDER Y POR LA BUENA INTENCION. HE INTENTADO DE MUCHAS FORMAS PERO SOY NUEVO EN ESTO Y ESTE ES EL ULTIMO CODIGO QUE HE REALIZADO

#include <16f877a.h>
#use delay(clock=4M)
#byte TRISB=0x86
#byte PORTB=0x06
#INT_EXT


RB0(){

output_high(PIN_c1);
delay_ms(100);
output_low(PIN_c1);
delay_ms(100);

}

void main(){

   int cont=0;
   
   while (INPUT(PIN_c1) ==1){
   
   cont=cont++;
   if (cont==3){
   output_high(PIN_c2);
   delay_ms(100);
   
     
   }
   
   }
   
   TRISB=0b00000001;
   PORTB=0x00;
   enable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL);
   for(;;){}
   
   }   

LO QUE HICE FUE LEER LAS INTERRUPCIONES DE UNA SEÑAL CUADRADA, DICHAS INTERRUPCIONES SON CADA CAMBIO DE ALTO A BAJO Y PENSE EN CONTAR ESOS CAMBIOS DE ESTADO PARA LUEGO ENCENDER UNA SALIDA CUANDO SE CUENTEN 3 CAMBIOS DE ESTADO.

GRACIAS



Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Manejo del TIMER0 desde el CCS
« Respuesta #19 en: 28 de Febrero de 2014, 08:59:22 »
  Como primer medida, para utilizar las interrupciones primero tienes que configurarlas y luego habilitarlas.
  No es aconsejable utilizar delays dentro de la rutina de interrupción. Pero si en tu caso estás seguro que los pulsos son mas lentos que los tiempos que tienes de delays, no afectará.
  No entiendo porque lees el puerto C, incluso antes de la configuración.
  No sé como es la sintaxis de CCS para configurar la interrupción, así que deberías buscarla en el manual del compilador.

  Yo utilizaría el contador, como variable global, dentro de la interrupción y luego lo evaluaría en el bloque principal. Algo así

Código: C
  1. int contador; // variable global
  2.  
  3. rutina de interrupcion
  4. {
  5.   contador++; // incremento contador
  6. }
  7.  
  8. void main(void)
  9. {
  10.   configurar el tris de los puertos a utilizar
  11.   configurar interrupcion
  12.   habilitar interrupcion externa
  13.   habilitar interrupciones globales
  14.   while (TRUE)
  15.   {
  16.     if (contador == 2) encender salida correspondiente
  17.     if (contador == 3) encender otra salida
  18.   }
  19. }


  Si la entrada está dada por un pulsador, habría que implementar una rutina antirrebote.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Manejo del TIMER0 desde el CCS
« Respuesta #20 en: 28 de Febrero de 2014, 11:11:16 »
Hola, como te comenta Angel, necesitas habilitar la interrupción que deseas utilizar, para la interrupción externa necesitas indicarle si va a ser en flanco de subida o de bajada, eso lo haces con la instrucción

ext_int_edge(h_to_l); para que sea de alto a bajo, o con l_to_h para que sea al contrario

y para habilitar la interrupción externa usas

enable_interrupts(int_ext);

y el enable global es:

enable_interrupts(global);

dentro de tu interrupción puedes contar el número de pulsos que deseas, con ir incrementando una variable, y en tu main checar el estado de la misma para saber si activar o no tu salida

espero te sea de utilidad

Saludos
"Nada es imposible, no si puedes imaginarlo"

Desconectado verag123

  • PIC10
  • *
  • Mensajes: 4
Re: Manejo del TIMER0 desde el CCS
« Respuesta #21 en: 28 de Febrero de 2014, 13:53:12 »
hola a todos muchas gracias por responder y por su interes.

lo que queria al habilidar el pinc1 era verificar el funcionamiento de la interrupcion y esa parte funciona bien, la interrupcion si se da y encendia el pin c1, ahora bien cuando pongo el contador dentro de la rutina de interrupcion este no funciona o por lo menos eso es lo que parece dado que no realiza las tareas que estan dentro del while, esto fue lo que intente:

#include <16f877a.h>
#use delay(clock=4M)
#byte TRISB=0x86
#byte PORTB=0x06
#INT_EXT

int contador=0;

RB0(){

contador=contador++;

}

void main(){

   
   TRISB=0b00000001;
   PORTB=0x00;
   enable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL);
   
   while (TRUE)
  {
    if (contador == 2){ // encender salida correspondiente
   
    output_high(pin_c2);
    delay_ms(100);
    output_low(pin_c2);
    delay_ms(100);
   
    output_high(pin_c2);
    delay_ms(100);
    output_low(pin_c2);
    delay_ms(100);
    }
    if (contador == 3){ // encender otra salida
   
    output_high(pin_c3);
    delay_ms(100);
    output_low(pin_c3);
    delay_ms(100);
   
    output_high(pin_c3);
    delay_ms(100);
    output_low(pin_c3);
    delay_ms(100);
   
    output_high(pin_c3);
    delay_ms(100);
    output_low(pin_c3);
    delay_ms(100);
   
  }
   for(;;){}
   
   } 
}


intente colocando la instruccion while antes de la configuracion de la interrupcion y tampoco funciona

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Manejo del TIMER0 desde el CCS
« Respuesta #22 en: 28 de Febrero de 2014, 13:59:30 »
intenta con esto

te puse en rojo los cambios:

cuando pones el #int debes poner inmediatamente después la función asociada a la interrupción, y la declaración de tu variable va antes

también te falta reiniciar tu contador, si no vas a dejar que se desborde y te genere comportamientos erroneos

#include <16f877a.h>
#use delay(clock=4M)
#byte TRISB=0x86
#byte PORTB=0x06

int contador=0;

#INT_EXT

void RB0()
{

contador++;

}

void main(){

    
   TRISB=0b00000001;
   PORTB=0x00;
   enable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL);
  
   while (TRUE)
  {
    if (contador == 2){ // encender salida correspondiente
    
    output_high(pin_c2);
    delay_ms(100);
    output_low(pin_c2);
    delay_ms(100);
    
    output_high(pin_c2);
    delay_ms(100);
    output_low(pin_c2);
    delay_ms(100);
    }
    if (contador == 3){ // encender otra salida
    
    output_high(pin_c3);
    delay_ms(100);
    output_low(pin_c3);
    delay_ms(100);
    
    output_high(pin_c3);
    delay_ms(100);
    output_low(pin_c3);
    delay_ms(100);
    
    output_high(pin_c3);
    delay_ms(100);
    output_low(pin_c3);
    delay_ms(100);
   contador=0;
    
  }
   for(;Wink{}
  
   }  
}

« Última modificación: 28 de Febrero de 2014, 14:48:42 por rivale »
"Nada es imposible, no si puedes imaginarlo"

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Manejo del TIMER0 desde el CCS
« Respuesta #23 en: 03 de Marzo de 2014, 10:13:37 »
  El ciclo for del final es innecesario ya que todo el programa se ejecuto con el ciclo while
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Manejo del TIMER0 desde el CCS
« Respuesta #24 en: 03 de Marzo de 2014, 11:24:46 »
 El ciclo for del final es innecesario ya que todo el programa se ejecuto con el ciclo while

 :oops: :oops: cierto, no habia visto el for del último
« Última modificación: 03 de Marzo de 2014, 12:50:18 por rivale »
"Nada es imposible, no si puedes imaginarlo"