Mar 042015
 
8.Interrupciones
5 (100%) 3 votes

Con las interrupciones en un microcontrolador vamos a poder hacer que el dispositivo pare de repente la tarea que está realizando para que haga o realice una función con urgencia y después continúe haciendo su rutina habitual. Por ejemplo. cuando hacemos el llamado de funciones desde el main, lo que se hace es que el programa ejecute un subprograma y luego regrese al programa principal, sin embargo el programador esta definiendo en que momento debe saltar a ejecutar la función mediante las instrucciones, por esta razón se considera sincronas.

Las interrupciones son desviaciones de flujo de control del programa originadas asincrónicamente por diversos sucesos que no dependen del programador, es decir, ocurren en cualquier momento.

Las interrupciones ocurren por sucesos externos como la generación de un flanco o nivel en un PIN del microcontrolador o eventos internos tales como el desbordamiento de un contador, terminación del conversor análogo a digital, entre otras.

Interripciones PICEl comportamiento del microcontrolador ante la interrupción es similar al procedimiento que se sigue al llamar una función desde el programa principal. En ambos casos se detiene la ejecución del programa en curso, se guarda la dirección a donde debe retornar cuando termine de ejecutar la interrupción, atiende o ejecuta el programa correspondiente a la interrupción y luego continua ejecutando el programa principal, desde donde lo dejo cuando fue interrumpido.

Aqui nombramos 10 diferentes causas que producen una interrupción, por lo tanto el primer paso de la rutina de interrupción será identificar la causa de la interrupción.

  • Interrupción externa RB0/INT
  • Interrupción por cambio lógico en el puerto B (pines RB7 a RB4)
  • Interrupción por desborde del timer 0 (TMR0)
  • Interrupción por desborde del timer 1 (TMR1)
  • Interrupción por comparación exitosa exitosa en TMR2
  • Interrupción del comparador
  • Interrupción del transmisor del USART
  • Interrupción del receptor del USART
  • Interrupción del módulo CCP
  • Interrupción del EEPROM

En este post vamos a tratar la interrupción externa por cambio de estado en la patica RB0.

Los pasos que se deben seguir para atender una interrupción, son los siguientes

  • Digitar la función correspondiente a la interrupción. La función debe comenzar con # y la interrupción correspondiente, por ejemplo para la función de interrupción por RB0 se digita #int_EXT
  •  En el programa principal, habilitar las interrupciones en forma global, con la instrucción: enable_interrupts(GLOBAL);
  •  En el programa principal, habilitar la interrupción correspondiente, como ejemplo se muestra como habilitar la interrupción externa por RB0: enable_interrupts(INT_EXT);

Ejemplo 1

Hacer un programa que me incremente un contador de 0 a 9, cuando ocurra una interrupción externa por RB0. Cuando el contador llegue a 9, comienza de nuevo en cero. (El código de implementación se encuentra al final del post)

Interrupciones con PIC

Vemos el video donde explico el proceso del código.

 

Flancos de Subida y Flancos de Bajada

En algunos casos, puede interesarnos leer unicamente los flancos de subida o los flancos de bajada de algún tren de pulsos que esté entrando al microcontrolador como lo vemos en la siguiente imagen

 

Flancos de Subida y Bajada

Este tipo de señales es bastante común en sensores como encoders los cuales son muy utilizados para medir posición o velocidad angular.

Encoder

 

Para configurar la lectura del FLANCO DE SUBIDA en el Compilador CCS C Compiler debemos utilizar el siguiente comando:

 

 

Para configurar la lectura del FLANCO DE BAJADA en el Compilador CCS C Compiler debemos utilizar el siguiente comando:

Ejemplo 2. Medidor de Velocidad de un Motor DC

Vamos a realizar un medidor de Velocidad de un Motor DC, utilizando como sensor un Encoder de 10 Pulsos por Revolución. Para eso vamos a necesitar configurar el MOTOR-ENCODER del proteus dando doble click y colocando los 10 pulsos. Este ejemplo es una adaptación del ejemplo visto en la entrada de PWM, si todavia no has estudiado el PWM te recomiendo primero veas esa entrada (click aqui para ir a la entrada) y luego regreses aqui para hacer la práctica del medidor de Velocidad.

 

A través de un potenciometro, regularemos la velocidad del motor 12VDC, utilizando un mosfet en la etapa de potencia. El motor tiene acoplado un Encoder que entrega un tren de pulsos. Ese tren de pulsos debe ser conectado en el PIN RB0 del PIC y por medio de la interrupción Externa y por lectura bien sea del flanco de subida o flanco de Bajada, se debe calcular la velocidad en RPM (Revoluciones por Minuto) y mostrarlas en una pantalla LCD. (El código de implementación se encuentra al final del post)

Velocidad de un Motor DC con PIC y Encoder

 

Otro Tipo de Interrupciones

Existen diferentes tipos de interrupción en el microcontrolador, algunas de ellas se mencionan a continuación:
#INT_EXT              INTERRUPCIÓN EXTERNA
#INT_RTCC            DESBORDAMIENTO DEL TIMER0(RTCC)
#INT_RB                  CAMBIO EN UNO DE LOS PINES B4,B5,B6,B7
#INT_AD                  CONVERSOR A/D
#INT_EEPROM   ESCRITURA EN LA EEPROM COMPLETADA
#INT_TIMER1      DESBORDAMIENTO DEL TIMER1
#INT_TIMER2     DESBORDAMIENTO DEL TIMER2

 

Codigo de Implementación:

A continuación se presenta el Código de Implementación de los dos ejemplos de vistos en esta entrada con relación a las interrupciones externas por RB0. Recuerda que para ver el código, solo basta con compartir la información de este post con alguno de los siguientes tres botones.

Código Ejemplo 1

Pueden descargar el código y el diseño en proteus aqui:

>>>>>8. Interrupciones<<<<<<<<

 

Código Ejemplo 2

 

Click aqui para descargar los archivos del medidor de velocidad del motor DC

>>>>Velocidad del Motor DC <<<<<<<<<

Ayuda compartiendo la información de la pagina en redes sociales, dale un like, twittea o un plus (+) en google, para que mas personas puedan acceder a la información del sitio web.

Comparte en Redes Sociales

Si te sirvió de algo la información de la pagina, podrías invitarme a un café y ayudarme a seguir manteniendo en pie el sitio WEB. Solo cuesta $2USD y me ayudarías enormemente a seguir con mi trabajo. Muchas Gracias por tu visita.




Si te sirvió de algo la información de la pagina, podrías invitarme a un café y ayudarme a seguir manteniendo en pie el sitio WEB. Solo cuesta $2USD y me ayudarías enormemente a seguir con mi trabajo. Muchas Gracias por tu visita.




  6 Responses to “8.Interrupciones”

  1. hola, muy interesante lo que compartes , tengo una duda de como implementar lo siguiente, quiero hacer un corrimiento de un led en una hilera de 5 leds con un retardo de 1000ms , al momento de leer el adc del pic poner como condicion que cuando lea un valor de 3V se detenga la secuecia y deje prendido el led justo donde iba, ojala puedas darme una idea ya he implementado el adc y la manera para obtener de 0 a 5 v con un potenciometro pero no me sale la parte que menciono. saludos

    • Bueno como vimos en el ejemplo del ADC aca en el blog (click aca) suponiendo que lees el voltaje y lo guardas en una variable tipo long llamada bits (lectura a 10bits), vas a preguntar cuando llegue a 3 voltios (614 bits) y dejas estatico. algo asi como:

      PORTB=0B00000001; //Prendo unicamente el led de RB0
      while(1){
      set_adc_channel(0); //Selecciono el canal 0 (RA0)
      delay_ms(1); //llamo retardo de 1 ms
      bits=read_adc();
      if(0b100000)
      PORTB=0B00000001; //Prendo unicamente el led de RB0
      if(bits>614){ //Si es mayor a 3 V desplace los leds
      PORTB=PORTB<<1; DELAY_MS(1000); } } Mas o menos asi, si el voltaje es mayor a 3 quedesplace los leds. Ya si solo necesitas los 3 voltios exactos, va ser muy complicado que consigas esa exactitud. Igual te digo que NO porbé ese codigo, es mas o menos lo que se me vino a la mente. Saludos.

  2. BUENAS DISCULPE NECESITO SABER COMO USAR EL DISPLAY DE 7 SEGMENTOS DE 2 DIGITOS, COMO LO PROGRAMARIA PARA QUE ME SALGAN LOS NUMEROS 10,11,12 ….
    Y COMO HARIA PARA HACER QUE DECRECIERA EL NUMERO OSEA NECESITO ESTO MISMO PERO QUE SUBA Y QUE BAJE

  3. que tal me agrada tu blog, me a ayudado bastante, tengo una dudo, se puede usar en el mismo programa tanto las interrpuciones por rb4-rb7 como por rb0?

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

(required)

(required)