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