Interrupcion RB0 y inicio del TMR0 CCS

Iniciado por eric090, 7 Junio 2013, 20:05 PM

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

eric090

Hola a todos! Planteo el proyecto, para saber si me veis algo mal. Las interrupciones se me generan correctamente pero creo tener un problema en la gestion del timer ya que he exo varias pruebas y no funciona correctamente. Hice una prueba de encender un led cuando llegara a un cierto tiempo y que me lo apagara seguidamente, pero la funcion de output_low(PIN_B4) no me la hizo, se quedo en estado alto todo el rato. Gracias por adelantado !

Trabajo con el PIC 18F2550. La interrupcion sera generada por RB0, el cual le vendran flancos de subida y de vajada. Quiero que la interrupcion se genere al iniciar el flanco de subida.
Una vez iniciada la interrupcion, tendre que iniciar el Timer0 con un valor equivalente a 10ms. Despues de eso tendre que ir comparando el valor del timer con 4 variables que sus valores (res,res2,res3,res4) iran de 0 a 100 (estas variables seran el resultado de una conversion de tiempo para adecuarlas al timer0) y seran RB4,RB5,RB6,RB7. En el momento que coincida el valor del timer con alguna de las 4 variables sacaran un 1 y 0 en la variable que sea igual que el timer, y ir haciendo las comparaciones con el resto de los puertos restantes hasta acabar los 10ms, que durara el flanco.

El programa esta basado en la comunicacion usb, por lo cual las interrupciones creo que deberan ser habilitadas despues de la deteccion de datos.
El resultado en el oscilador debe ser:
Si escojemos un 100% de potencia (65066) en alguno de las 4 variables (su valor vendran del visual basic), deberiamos obtener un pulso (1 y 0) en los flancos de subida, y en el caso contrario (65534) en el final.
La frecuencia de subidas y vajadas en rb0 es de 50Hz, la de la red.
Utilizo un cristal de 20Mhz exterior con sus condensadores corresponientes de 15pF.

Aqui pongo el programa, le e quitado la parte del usb en comentario para que podais simular bien. Cuando esteis simulando simplemtene tendreis que subtituir el valor res por alguno de 65066 a 65534 . Espero haberme explicado bien y gracias!

#include <18F2550.h>
#use delay(clock=48000000)
#fuses HSPLL,PLL5,CPUDIV1,NOWDT,NOPROTECT,NOLVP,NODEBUG
#define USB_HID_DEVICE     FALSE             //deshabilitamos el uso de las directivas HID
#define USB_EP1_TX_ENABLE  USB_ENABLE_BULK   //turn on EP1(EndPoint1) for IN bulk/interrupt transfers
#define USB_EP1_RX_ENABLE  USB_ENABLE_BULK   //turn on EP1(EndPoint1) for OUT bulk/interrupt transfers
#define USB_EP1_TX_SIZE    4                 //buffer entrada
#define USB_EP1_RX_SIZE    3                 //buffer salida
#define RB4   PIN_B4
#define RB5   PIN_B5
#define RB6   PIN_B6
#define RB7   PIN_B7
#define RB3   PIN_B3
#include <pic18_usb.h>     //Microchip PIC18Fxx5x Hardware layer for CCS's PIC USB driver
#include "usb_desc_scope.h" //Configuración del USB por Enumerador Palitroquez
#include <usb.c>           //handles usb setup tokens and get descriptor reports

   
    int res,res2,res3,res4,value,inter=0,recibe[4]; // desde 0 hasta  4.294.967.295


#int_EXT
void EXT_isr(void)
{   

   set_timer0(65066;//65067 = desbordamiento en 10ms, pero restamos uno para sincronizar con el calculo y asi poder comparar todos los canales
   while(input_state(PIN_B0)){
   value=get_timer0(); //coge el valor del timer0
   if (value>65066){ output_high (PIN_B4); output_low(PIN_B4);//si el timer es mas grande o igual a res saca un 1 en rb4
   }
   if (value>=res2){output_high(PIN_B5); output_low(PIN_B5);// sino es mas grande pregunta a res2 y si es mas grande o igual que el timer saca a rb5
   }
   if (value>=res3){output_high (PIN_B6); output_low(PIN_B6); //sino es mas grande pregunta a res3 y si es mas grande o igual que el timer saca a rb6
   }
   if (value>=res4){output_high (PIN_B7); output_low(PIN_B7); //sino es mas grande pregunta a res4 y si es mas grande o igual que el timer saca a rb7
   }
}
   
   clear_interrupt(INT_EXT);

}

void main(void) {


  set_tris_b(0b00000111); // RB0(INTPUT = INTERRUPCIONES)  RB3(OUTPUT = INDICADOR USB LED) RB4-RB7(OUTPUTS = DISPARADORES TRIACS)
      
/*   output_low(PIN_B3);
   output_low(PIN_B4);
   output_low(PIN_B5);
   output_low(PIN_B6);
   output_low(PIN_B7);
   
  usb_init();                      //inicializamos el USB
  usb_task();                      //habilita periferico usb e interrupciones
  usb_wait_for_enumeration();      //esperamos hasta que el PicUSB sea configurado por el host

 
  output_high(PIN_B3); //Ya fue detectado por PC
  delay_ms(250);
  output_low(PIN_B3); //Ya fue detectado por PC
  delay_ms(250);
  output_high(PIN_B3); //Ya fue detectado por PC
  delay_ms(250);
  output_low(PIN_B3); //Ya fue detectado por PC
  delay_ms(500);
  output_high(PIN_B3); //Ya fue detectado por PC
  delay_ms(250);
  output_low(PIN_B3); //Ya fue detectado por PC
  delay_ms(250);
  output_high(PIN_B3); //Ya fue detectado por PC
  delay_ms(250);
  output_low(PIN_B3); //Ya fue detectado por PC
  delay_ms(250);

   
  while (1)
  {   
      
       if(usb_enumerated())          //si el PicUSB está configurado
     {
        if (usb_kbhit(1))          //si el endpoint de salida c ontiene datos del host
         {
           usb_get_packet(1, recibe, 4); //almacena los 4 bytes en la variable recibe
   
             output_low(PIN_B3);
            delay_ms(500);
            output_high(PIN_B3);
            delay_ms(500);
            output_low(PIN_B3);
            delay_ms(500);
            output_high(PIN_B3);

   res=65534-4.7*recibe[0];
   res2=65534-4.7*recibe[1];
   res3=65534-4.7*recibe[2];
   res4=65534-4.7*recibe[3];
*/
while(1){
if(inter<=0){
   ext_int_edge(L_TO_H);//activa interrupcion por flanco de subida
   enable_interrupts(GLOBAL); //activa la funcion de interrupciones
   enable_interrupts(INT_EXT);//interrupciones por RB0
   setup_timer_0(T0_INTERNAL|T0_DIV_256);//INICIA EL TIMER0
inter=1;}

//}//si no recibe datos del host vuelve a preguntar   
//}//si el usb no esta numerado vuelve a preguntar
}//final del while

}//final programa


ruibal69

Buenas noches. Podrias decir que quieres controlar, pues por lo que entendi, me parece que quieres construir un dimmer ya que utilizas la frecuencia de red 50Hz para detectar su flanco de subida.

eric090

Si, veras es un proyecto basado en un regulador de voltaje controlado por PC. Tengo exa una fuente de alimentacion que transformara 220v a 5v directamente sin transformador ni nada, y esos 5v que tendran flancos de subida y de vajada iran a RB0, el cual activara la interrupcion y se accionara el timer. Despues de alli sacara pulsos a esos 4 canales accionando los triacs y asi obteniendo el voltaje que hemos aplicado en el PC.

ruibal69

Buenas tardes, en la pagina de un coloborador de UControl, realizo un dimmer muy basico controlado
con dos botones para controlar una señal alterna.

El programa esta escrito en JALV2 para un PIC16  pero creo que te puede servir para captar la idea de captura del flaco de subida y como varia la salida asi como el esquema electrico que utiliza.

El creador el progama es Felixls y si pagina es : sergiols.blogspot.com

Dentro de la pagina busca "dimmer muy basico".

Si tienes algun problema no dudes en preguntar.

P.D. Espero no infringuir ninguna norma al indicar una pagina externa a esta