Autor Tema: Interrupcion RB0 TMR0  (Leído 1522 veces)

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

Desconectado eric090

  • PIC10
  • *
  • Mensajes: 3
Interrupcion RB0 TMR0
« en: 31 de Mayo de 2013, 15:19:22 »
Hola a todos, el asunto es el siguiente:

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.

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

« Última modificación: 07 de Junio de 2013, 14:56:45 por eric090 »


 

anything