elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Informática
| |-+  Electrónica
| | |-+  Interrupcion RB0 y inicio del TMR0 CCS
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Interrupcion RB0 y inicio del TMR0 CCS  (Leído 6,867 veces)
eric090

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Interrupcion RB0 y inicio del TMR0 CCS
« en: 7 Junio 2013, 20:05 pm »

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



« Última modificación: 7 Junio 2013, 20:22 pm por eric090 » En línea

ruibal69

Desconectado Desconectado

Mensajes: 8


Ver Perfil
Re: Interrupcion RB0 y inicio del TMR0 CCS
« Respuesta #1 en: 7 Junio 2013, 22:33 pm »

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.


En línea

eric090

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Re: Interrupcion RB0 y inicio del TMR0 CCS
« Respuesta #2 en: 8 Junio 2013, 14:28 pm »

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.
En línea

ruibal69

Desconectado Desconectado

Mensajes: 8


Ver Perfil
Re: Interrupcion RB0 y inicio del TMR0 CCS
« Respuesta #3 en: 8 Junio 2013, 15:57 pm »

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
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
TMR0 16f84a 1 segundo de retraso
Electrónica
Toxico 1 6,192 Último mensaje 11 Marzo 2008, 03:53 am
por dabo
Ayuda con la interrupcion por RB_0
Electrónica
josegenio 0 2,927 Último mensaje 19 Enero 2008, 22:51 pm
por josegenio
Interrupcion de teclado « 1 2 »
.NET (C#, VB.NET, ASP)
darnali 12 9,217 Último mensaje 13 Abril 2010, 17:51 pm
por darnali
interrupcion 13h,02h
ASM
AYLASER 1 4,035 Último mensaje 27 Mayo 2010, 10:16 am
por Eternal Idol
TMR0 como contador por pulsos (P16F628A)
ASM
danissj 0 1,764 Último mensaje 28 Septiembre 2018, 00:16 am
por danissj
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines