Hola a todos
Necesito saber si es posible llamar a una función dentro de una rutina de interrupción.Por ejemplo necesito transmitir un dato
cada 10 milisegundos al computador mediante USB y para ello necesito utilizar la función DOUSBOut pero dentro de la rutina de interrupción y no como está en el código que sigue. Este código funciona, pero para estar seguro de transmitir el dato (adval) cada 10ms al PC me parece que lo ideal sería que el código de transmisión estuviera dentro de la rsi.
'**************************************************************************
'* Notes : ESTE PROGRAMA ADQUIERE DATA DESDE EL PUERTO A DEL PIC *
'* Y LA TRANSMITE VÍA USB AL PC, Y SIMULTANEAMENTE REALIZA EL *
'* PARPADEO,CADA 1 SEGUNDO, DE UN LED CONECTADO AL PIN 1 DEL *
'* PUERTO C MEDIANTE INTERRUPCIÓN.LA RUTINA DE INTERRUPCIÓN *
'* INCLUYE EL CÓDIGO DE CONVERSIÓN A/D Y EL INCREMENTO DEL *
'* TIEMPO ASOCIADO AL DATO ADQUIRIDO.FALTA TAL VEZ INCLUIR UNA *
'* BANDERA O INDICADOR QUE ASEGURE EL ENVÍO DE LA DATA CADA 10 *
'* MILISEGUNDOS AL COMPUTADOR.
'************************************************************************ *
DEFINE OSC 24 ' Usa cristal de 24 MHz
USBBufferSizeMax con 8 ' maximum buffer size
USBBufferSizeTX con 8 ' input
USBBufferSizeRX con 8 ' output
' the USB buffer...
USBBuffer Var Byte[USBBufferSizeMax]
USBBufferCount Var byte
adval VAR BYTE ' valor o dato adquirido
t1 var byte ' valor asociado al dato
t2 var byte
interrupciones VAR BYTE
detener var bit
usbinit ' initialise USB...
TRISA = %11111111 ' Set PORTA to all input
TRISB = 0 ' setea PORTB como salida
TRISC = 0 ' setea PORTC como salida
interrupciones = 0 ' Valor inicial de variable interrupciones igual a 0
RCON.7 = 1 ' Habilita prioridad en interrupciones
INTCON.7 = 1 ' Habilita todas las interrupciones con prioridad alta
INTCON.6 = 1 ' Habilita todas las interrupciones de periféricos con prioridad baja
INTCON.5 = 0 ' Bit de habilitación de interrupción por desbordamiento deTMR0
' igual a 0, deshabilitado
INTCON2.2 = 1 ' Bit de prioridad de interrupción de TMR0 por
' desbordamiento igual a 1 (prioridad alta)
T0CON = %01000111 ' Carga (en decimal 71) T0CON para: Stop Timer0,
' Timer0 configurado como contador/timer de 8
' bit, fuente de reloj CLK0 para Timer0, asignación de Prescaler
' igual a 256
TMR0L = %00010110 ' Carga 22 (en decimal) a byte bajo de TMR0 para obtener
'interrupción cada 9.998 ms
T0CON.7 = 1 ' Bit de control ON/OFF de TMR0 (Timer0) igual a 1, habilita Timer0
ADCON1 = %00000010 ' Set PORTA analog
t1 = 0
t2 = 0
PORTB.1 = 1
detener = 1
On Interrupt Goto timer0
ProgramStart:
gosub DoUSBIn ' subrutina de entrada de datos USB
if usbbuffer[1] = 1 then ' si recibe comando (1) para inicializar
' tiempos y habilitar interrupción
if detener = 1 then
t1 = 0
t2 = 0
detener = 0
INTCON.5 = 1 ' Bit de habilitación de interrupción por desbordamiento de
'TMR0 igual a 1, habilitado
endif
endif
IF USBBUFFER[2] = 2 THEN ' si recibe comando (2) para aduirir
PORTB = USBBuffer[6] ' envía al PuertoB dato de entrada
USBBUFFER[1] = adval ' Buffer 1 recibe dato convertido
usbbuffer[4] = t1 ' Buffer 4 recibe punto asociado
usbbuffer[5] = t2 ' buffer 5 recibe punto asociado para poder
' dibujar en Visual mas de 255 puntos
gosub DoUSBOut ' subrutina salida de dato puerto USB
endif
IF USBBUFFER[3] = 3 THEN ' si recibe comando (3) para detener
PORTB = 0 ' apaga los led del puerto B
detener = 1 ' bandera para detener conversión e incrementos de tiempo
' en la RSI
INTCON.5 = 0 ' Bit de habilitación de interrupción por desborde de TMR0
' igual a 0, deshabilitado
endif
goto ProgramStart
' ************************************************************
' * receive data from the USB bus *
' ************************************************************
DoUSBIn:
USBBufferCount = USBBufferSizeRX ' RX buffer size
USBService ' keep connection alive
USBIn 1, USBBuffer, USBBufferCount, DoUSBIn ' read data, if available
return
' ************************************************************
' * wait for USB interface to attach *
' ************************************************************
DoUSBOut:
USBBufferCount = USBBufferSizeTX ' TX buffer size
USBService ' keep connection alive
USBOut 1, USBBuffer, USBBufferCount, DoUSBOut ' if bus available, transmit data
return
'******************************************
'* Rutina se servicio de interrupción *
'******************************************
disable
Timer0:
if INTCON.2 = 1 then ' Chequea si el Bit flag de interrupción por
' desborde de TMR0 es igual a 1 (ocurrió una interrupción)
INTCON.2 = 0 ' Limpia bit flag de interrupción por desborde de TMR0 (Timer0)
TMR0L = %00010110 ' Carga 22 (en decimal) a byte bajo de TMR0
' para obtener interrupción cada 9.998
interrupciones = interrupciones + 1
if interrupciones = 50 then ' Si llegó a 50 implica que transcurrieron
' 500 milisegundos (0.5 segundos) y se
' enciende o apaga el led conectado al pin
' 1 del PUERTO C, obteniendose una frecuencia
' de parpadeo de 0.5 Hz (período de 1 segundo)
if PORTC.1 = 0 THEn
PORTC.1 = 1
else
PORTC.1 = 0
ENDIF
interrupciones = 0
endif
IF detener = 0 then
ADCIN 0, adval ' Read channel 0 to adval
'Pauseus 50 ' Wait 50 us
if t1 < 255 then ' incrementa tiempo asociado al dato adquirido
t1 = t1 + 1
else
t2 = t2 + 1
t1 = 0
if t2 = 4 then
t1 = 0
t2 = 0
endif
endif
endif
endif
RESUME
ENABLE
Cualquier ayuda se las agradezco desde ya
Saludos