Autor Tema: llamar a una función dentrro de una rutina de interrupción  (Leído 1939 veces)

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

Desconectado juanaca

  • PIC10
  • *
  • Mensajes: 8
llamar a una función dentrro de una rutina de interrupción
« en: 07 de Julio de 2007, 14:41:55 »
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 :lol: