Saltar al contenido
Control Automático Educación

Interrupciones PIC

Bienvenidos Controleros y Controleras, en esta entrada vamos a aprender a usar las interrupciones con PIC para desarrollar diferentes proyectos. Veremos algunos ejemplos como la detección de Interrupción Externa con PIC.

Antes de comenzar te hago la invitación para que veas todo nuestro Curso gratuito de microcontroladores PIC

Y que te suscribas al canal si te gusta la programación de microcontroladores y la teoría de control.

Interrupciones PIC

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 PIC 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 PIC ocurren por sucesos externos como la generación de una interrupción por flanco PIC, una interrupción externa PIC cambiando el 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 PIC

El 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.

Tipos de Interrupciones PIC

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

  • Interrupción externa PIC 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

Interrupciones PIC en CCS

Vamos a ver como podemos utilizar las interrupciones en un PIC utilizando el PIC C Compiler CCS. Lo que veremos aqui puedes aplicarlo en cualquier microcontrolador de Microchip, por ejemplo esto sirve para las interrupciones PIC 18F4550 CCS, Interrupciones PIC 16F877A, Interrupciones PIC 16F84 o cualquier otro. A modo de ejemplo lo mostraremos como usar las interrupciones PIC en el 18F887.

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);

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

Aqui de dejo un Documento con todas las interrupciones del PIC usando PIC C Compiler 👉 Interrupciones PIC

Interrupción Externa PIC 16F887 – PIC 16F877A – PIC 18F4550

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 el código de implementación de la interrupcion externa PIC 16F887, sin embargo el código sirve para la interrupcion PIC 18F4550, el PIC 16F877A o cualquier otro PIC.

KIT para PIC BARATOS

A continuación te dejo algunas placas de desarrollo BARATAS y Motores DC con el ENCODER ya incluido para que puedas aprender más facilmente sobre los microcontroladores PIC y los puedas adquirir desde cualquier parte del MUNDO, a través del sitio web chino de Aliexpress.

Es importante destacar que para la construcción de nuestros proyectos electrónicos con microcontroladores podemos comprarlos también desde la comodidad de nuestra casa en Amazon que tiene envios para cualquier lugar de latinoamerica y para europa:

No products found.

Código 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 – Interrución Externa CCS

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

#INCLUDE <16F887.H>
#FUSES XT,NOLVP,NOWDT,PUT
//#USE DELAY(CLOCK=4000000) //Cystal interno 4MHz
#use delay(clock=4000000,crystal)//Crystal Externo 4MHz
Byte CONST display[10]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};
#BYTE PORTC = 7
#BYTE PORTB = 6
INT CONT=0;


#INT_EXT             //Funcion de la Interrupcion
VOID INTERRUPCION()
{
   DELAY_MS(200);    //Retardo
   CONT++;           //Incremente la variable CONT
   IF(CONT==10)      //Si la variable CONT es igual a 10
      CONT=0;        //Ponga en cero la variable CONT
}

VOID MAIN()
{
   SET_TRIS_B(0B11111111);       //Configurar el puerto B
   SET_TRIS_C(0);                //Configurar el puerto C
   ENABLE_INTERRUPTS(GLOBAL);    //Habilita todas las interrupciones
   ENABLE_INTERRUPTS(INT_EXT);   //Habilita la interrupción externa
   WHILE(TRUE)
   {
      PORTC= (display[CONT]);    //Muestra lo que hay en la variable CONT en el display
   }
}

Si desean utilizar la interrupción externa PIC 18F4550 o cualquier otro de la familia 18, debes cambiar el encabezado por:

#include <18f4550.h>
#byte porta = 0xf80 // Identificador para el puerto A. 
#byte portb = 0xf81 // Identificador para el puerto B. 
#byte portc = 0xf82 // Identificador para el puerto C. 
#byte portd = 0xf83 // Identificador para el puerto D. 
#byte porte = 0xf84 // Identificador para el puerto E.

Si desean utilizar la interrupción externa PIC 16F877A o cualquier otro de la familia 16, debes cambiar el encabezado por:

#include <16f877A.h>

Eso es todo por la entrada del dia de hoy, espero les haya gustado y hayan aprendido algo nuevo. Si te ha servido el contenido de esta entrada, de los videos y los códigos de implementación y deseas apoyar mi trabajo invitandome a un café super barato, puedes hacerlo en el siguiente link:

👉 Invitar a Sergio a un Café ☕️

Que esten muy bien, nos vemos en la siguiente entrada.

Entradas relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Comentarios (53)

#INT_RB CAMBIO EN UNO DE LOS PINES B4,B5,B6,B7
Estoy realizando un proyecto pero no acierto a configurar una interrupción solo en el pin 5 dl puerto B.
#INT_RB5 no me lo acepta el compilador.
Tambien he probado #INT_RB_5 pero nada.
Puedes decirme que hago mal?

Responder

Algunas interrupciones que se muestran en el post para colocar en el encabezado son solo para habilitar/deshabilitar las interrupciones. Por ejemplo, para tu caso si deseas usar la directiva INT_RB5 la puedes usar para habilitar/deshabilitar el pin B5. Sin embargo, el handler (manejador) de interrupciones que colocas en el encabezado siempre debe ser #INT_RB.

Responder

podrías poner :
#int_rb ///en el encabezado (antes de “void interrupcion()”
/*luego en el void main() configurar la direccion de memoria de cual puerto utlizarías, en tu caso RB5*/
set_tris_b(0x20); // o en bin 0b00100000 como quieras
enable_interrupts(global);
enable_interrupts(int_rb);
debería funcionar, es más o menos lo q te enténdí sino, equisd

Responder

Hace varios días que estoy estudiando el curso de microcontroladores. He ido viendo los videos en el orden que tienen en la lista de reproducción. Sin embargo, hoy encontré un obstáculo que me ha desalentado un poco: al estudiar el video titulado “Medir velocidad RPM de un motor encoder con PIC” pude ver varios contenidos que no se han estudiado aun en el curso. Intenté analizar el código y hubo varias cosas que no pude entender, simplemente porque no han sido estudiadas aun en los videos precedentes. Creo que es importante que los videos que componen un curso sigan un orden lógico. No se debe dar por sentado un contenido que aun no haya sido tratado en clases anteriores. De lo contrario los estudiantes del curso se desalientan al no poder entender un tema determinado. El curso me parece muy bueno; pero creo que hay que ordenar los videos de modo tal que no se quede nada importante sin explicar. Temas como “prescaler”, “postcaler”, “duty cycle”, entre otros, no han sido tratados aun en los videos que preceden al video que menciono arriba.

Responder

Es correcto Edi, gracias por la observación, voy a tratar de ordenar el contenido de forma ascendente, este mes estaré haciendo esto. Saludos.

Responder

Hola!!! soy estudiante de ing electronica y tu blog me a servido bastante.
Tengo que hacer un proyecto sobre como medir la velocidad del tiempo con un pic, ¿Crees que pudiera lograrlo con un encoder? y hacerlo funcionar con unas aspas que hagan moverse la perilla del encoder mientras corre la velocidad del tiempo.

Responder

Hola Sergio, quiero darte las gracias por la excelente dedicación en los cursos; además, te quiero comentar que intenté hacer el ejercicio del contador de interrupción externa RB0 en la versión de CCS 5.076 y fue imposible que lo simulara proteus (no detecta la interrupción), incluso uso el mismo procesador que colocas en el ejemplo (16f887). Tuve la oportunidad de aprender a programar en Mikroc y te comento que si permite detectar las interrupciones sin detalles. Concluyo que es un problema de la versión de CCS.
Te han comentado algo parecido, tienes una opinión al respecto? Muchas gracias

Responder

Hola Lisandro, acabé de descargar el ejemplo del contador, que contiene el archivo de simulación y el código. Volví y compilé el código con la versión 5.076 de CCS y ejecuté la simulación, y me funciona perfecto, detecta la interrupción sin problemas e incrementa el contador. He vuelto a colocar los archivos en el botón de descarga junto con los archivos de compilación binaria (.hex), realmente nadie me ha comentado sobre haber tenido problemas con ese ejemplo. Intenta descargarlo de nuevo, ejecutas el proteus sin compilar nada para ver si corre, y luego compilas y ejecutas el proteus de nuevo, si no funciona, talvez si sea algo del compilador.

Responder

Buenos días. Estoy iniciando en los PIC y tengo una duda, espero puedas orientarme. Hay una función para poner un “Thread” en los PIC o como puede ejecutar varias tarea en paralelo. De antemano muchas gracias y continúa adelante.

Responder

Hola Ulises, habría que consultar si el compilador CCS C permite el multitasking, pues yo hasta el momento no he trabajado con ello en el microcontrolador PIC. Lamento no poder orientarte en ese tema. Éxitos.

Responder

hola, yo de verdad quisiera saber que función tiene el diodo que se coloca entre las terminales del encoder? llevo un rato tratando de encontrar info pues apenas estoy aprendiendo a utilizarlos.

Responder

Hola Wilhem, el diodo realmente se usa en los terminales del motor, es decir que está en paralelo a la bobina del motor. Este se emplea como protección para el microcontrolador y para el transistor (si estuviéramos usando uno) o el Mosfet (para este caso). Dado que estamos conmutando o swichando la corriente que circula por el motor, a alta velocidad, la bobina del motor puede generar una corriente inversa, es decir hace que la corriente se devuelva, si no colocamos el diodo, esa corriente puede entrar a nuestro PIC por el transistor y dañar nuestros componentes. Con el diodo, estamos generando un camino para la corriente que se devuelve y se vaya directamente a positivo. Saludos.

Responder

muchas gracias 😀
Tengo otra pregunta, si por ejemplo estoy tratando de utilizar las interrupciones externas INT0, INT1 del pic 18f4550 para que cuando me detecte un flanco de subida en INT0 me incremente el contador y en cambio con un flanco en INT1 lo decremente, como cambia la sintaxis?

aparte reemplazo las lineas de:
#INCLUDE
#BYTE PORTC = 7
#BYTE PORTB = 6

por:
#include
#byte porta = 0xf80 // Identificador para el puerto A.
#byte portb = 0xf81 // Identificador para el puerto B.
#byte portc = 0xf82 // Identificador para el puerto C.
#byte portd = 0xf83 // Identificador para el puerto D.
#byte porte = 0xf84 // Identificador para el puerto E.

no se si así ya esta correcto para utilizar el 18f4550

este es el codigo que hice, no me marca errores de compilación pero cuando hago la simulacion en proteus no funciona, de hecho nada del puerto c cambia (el 7 seg va en ese puerto)

#include
#byte porta = 0xf80 // Identificador para el puerto A.
#byte portb = 0xf81 // Identificador para el puerto B.
#byte portc = 0xf82 // Identificador para el puerto C.
#byte portd = 0xf83 // Identificador para el puerto D.
#byte porte = 0xf84 // Identificador para el puerto E.

#FUSES XT,NOLVP,NOWDT,PUT
//#USE DELAY(CLOCK=4000000) //Cystal interno 4MHz
#use delay(clock=4000000,crystal)//Crystal Externo 4MHz
Byte CONST display[10]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};
//!#BYTE PORTC = 7
//!#BYTE PORTB = 6
INT CONT=0;
#INT_EXT //Funcion de la Interrupcionhh
VOID INTERRUPCION()
{
DELAY_MS(200); //Retardo
CONT++; //Incremente la variable CONT
IF(CONT==10) //Si la variable CONT es igual a 10
CONT=0; //Ponga en cero la variable CONT
}

#INT_EXT1 //Funcion de la Interrupcion
VOID INTERRUPCION1()
{
DELAY_MS(200); //Retardo
CONT–; //decremente la variable CONT

}

VOID MAIN()
{
SET_TRIS_B(0B11111111); //Configurar el puerto B
SET_TRIS_C(0); //Configurar el puerto C
ENABLE_INTERRUPTS(GLOBAL); //Habilita todas las interrupciones
ext_int_edge(L_TO_H); //Activa interrupción por flanco de subida
ENABLE_INTERRUPTS(INT_EXT); //Habilita la interrupción externa
ENABLE_INTERRUPTS(INT_EXT1); //Habilita la interrupción externahh

WHILE(TRUE)
{
PORTC= (display[CONT]); //Muestra lo que hay en la variable CONT en el display
}
}

Responder

Hola tengo una duda yo quiero controlar el motor con PID y un encoder como podría hacerlo? no se si tengas alguna información de ayuda.

Responder

Hola Juan, aqui tenemos varias entradas usando un controlador PID, dale un vistazo a la pagina principal del curso de PIC, observa la entrada 18, 20 y 28. La numeración está en los titulos. Saludos: https://controlautomaticoeducacion.com/microcontroladores-pic/

Responder

Hola, esta muy cool tu video pero he tenido problemas para que se proyecten las rpm en el LCD, descargue tal cual el archivo de proteus y el archivo c pero aun asi no me imprime nada, sabrias que esta mal? saludos desde México

Responder

Hola Andres, pero no te muestra nada en el LCD? Acabé de descargar el archivo dando click al botón naranja y abrí directamente el proteus sin hacer ninguna compilación, si no que usando directamente el .hex disponible en el ZIP y funcionó perfectamente. Luego abrí el compilador y compilé un nuevo .hex y continuo funcionando perfectamente. No se que te pueda pasar. Intenta cargar el .hex sin compilarlo en tu computadora. Y luego pruebalo compilandolo en tu computadora. Mi version del CCS C es la 5.076. Saludos

Responder

Hola quiero preguntarle que pasa si uso dos interrupciones al mismo tiempo digamos el int0 y el int1 hay alguna configuración para usar las dos interrupciones al mismo tiempo

Responder

Buenos días. Estoy iniciando en los PIC y tengo una duda, espero puedas orientarme. Hay una función para poner un “Thread” en los PIC o como puede ejecutar varias tarea en paralelo. De antemano muchas gracias y continúa adelante.

Responder

buenas quisiera de tu ayuda en un programa , necesito detectar un flanco de subida por interrupción externa y al detectarlo activar el timer0 hacer un conteo de 2,5 ms y luego mandar un pulso alto en c0 por 50us luego detectar el flanco de bajada y hacer lo mismo pero por 20us la entrada que da los pulsos es un detector de cruce por cero , no se como usar ambas interrupciones al mismo tiempo , gracias de antemano

Responder

debes crear las funciones con el identificador #int_EXT y #INT_RTCC. En la externa activas el timer, ENABLE_INTERRUPTS(INT_RTCC). Dale un vistazo a la entrada del timer, quizas te pueda servir.

Responder

Cuando corro el programa que sigue, imprime el valor cada 260 milisegundos con el preescaler en 1 y el reloj en 4 MHZ.

setup_counters(RTCC_INTERNAL,RTCC_DIV_1); // TIMER0: Clock Interno, Presescaler 128
setup_timer_1(T1_DISABLED); // para una RTCC cada 33.3 milisegundos
setup_timer_2(T2_DISABLED,0,1); // -> 1 Segundo = 30 RTCC
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
enable_interrupts(INT_RTCC); // Habilito Interrupción RTCC
enable_interrupts(global); // Habilito Interrupciones

#INT_RTCC
void RTCC()
{
mili=mili+1;
LCD_GOTOXY(1,1);
printf(lcd_putc,”%f”,mili);
}

void main()
{
}
No debería ser cada 256 microsegundos aproximadamente (eliminé muchas líneas que no hacen a la cuestión)

Responder

Dale un vistazo a la entrada del Timer 0 que hay varias ejemplos de como configurarlo. También evita usar muchas funciones dentro de la rutina de interrupción, en especial la del printf que es exageradamente pesada. Lo único que deberías hacer dentro de la función del timer seria incrementar aquel contador. El printf debe ir en el void main.

Responder

BUENAS UNA CONSULTA COMO PUEDO ABRIR LOS CODIGOS CON EL COMPILADOR MICRO C o el codigo es distinto o q librerias activo ayuda xfa

Responder

Hola Carlos, la sintaxis es distinta para el MicroC. Saludos

Responder

Sabes como hacer que un pin que no corresponda a alguna interrupción externa se utilizado como una?
Ejemplo:
hacer que el PIN_C3 se comporte como INT_EXT, INT_EXT la cual esta asociada a PIN_B0
es para leer un cambios de estado de bajo a alto(H_TO_L).
He visto en el .h del micro que se puede utilizar este tipo de interrupciones pero al momento de tratar de compilar me marca error, al parecer no están bien definidas #define INT_RA 0x30FF1610
#define INT_RA0 0x30011610
#define INT_RA0_L2H 0x10011610
#define INT_RA0_H2L 0x20011610
Así es como aparecen en el .h del micro, pero no se como utilizarlas.
Me podrías ayudar por favor.

Responder

Hola Juan, que micro estas usando?? Por ejemplo en el caso del 16F887 o 16F877A la interrupción externa solo está en el PIN_B0, no tienes como ejecutarla en el PIN_C3. Eso lo puedes ver con claridad en el datasheet. Saludos!

Responder

Estoy utilizando el 16f18445, el datasheet dice que se puede usar distintos pines como interrupción, son re-mapeables, y el .h que tiene CCS del micro al parecer o lo que yo entiendo es que si es posible, pero no logro hacer que funcione, me marca error al definir la interrupción.

Responder

Hola estoy tratando de hacer un protector por falta de fase trifasico con pic16f876 y tengo problemas para comparar el valor RMS con el seteo de dos potenciometros Umax y Umin para discriminar falla por baja tension o sobretension, ademas quisiera hacer todo por soft y se me hace muy largo el programa , quisiera tambien agregarle deteccion de falla de fase o desfasaje asi como seteo de retardo de sensibilidad y proteccion por sobretemperatura, uso una fuente capacitiva en la misma placa y la entrada de las 3 fases es por rectificacion de media onda atenuada y filtrada, llegue a posisionarme dentro de los parametros del pic pero haciendo simulaciones con proteus no consigo que la s condicionales se cumplan correctamente y no entiendo por que razon, no uso interrupciones solo un lazo infinito y otro para la toma de 100 muestras con un clock de 4Mhz interno, la finalidad es tener la menor cantidad de componentes externos posible asi como reducir el espacio ocupado por el protector, esta claro que para la falta de fase solo se sensan 2 de ellas ya que la tercera al usarla como entrada de alimentacion ,si falta o falla por baja tension , el sistema queda desconectado ademas de apagado, he visto protectores similares con pic16f785 pero su velocidad no es buena y suelen fallar los relays de salida por inestabilidad en el sensado, quisiera saber si el uso de interrupciones me ayudaria a solucionar algo o complicaria mas el software, muchas gracias por tanta informacion , prometo co mi palabra que si este proyecto llega a funcionar te envio toda la documentacion para que sea publicado y asi poder aportar algo a tu obra, espero poder en algun momento.

Responder

Hola Ariel. Bueno tu proyecto requiere de paciencia para conseguirlo hacer funcionar. Primero si deseas hacer todo por software, talvez en lugar de usar potenciometros, podrías definir el umbral min y max dentro del programa y ajustarlo para cada protector, si usas potenciometros entonces te recomiendo usar trimmers. Para la detección de fallas estas detectando directamente con el PIC la caida de la fase a través de una retificación? El uso de Interrupciones no debería complicar tu programa, ellas podrían ayudarte a que el PIC pare de hacer lo que este haciendo en el ciclo infinito y atienda una tarea prioritaria, por ejemplo la caída de una fase, para desenergizar el sistema. Saludos!

Responder

hola, con el tema del motor con encoder como seria para la construccion fisica del diagrama?? porque por lo que vi no vienen motores asi con encoder incorporados

Responder

Hola Nicolas, en el mercado SI venden motores con el encoder incorporado. Claro que también puedes colocar tu encoder directamente en el eje del motor y usar un circuito optico para capturar los pulsos del motor.

Responder

hola ,excelente tu manera de enseñar,te pido un favor para un proyecto ¿como hago pwm con 2 botones uno + y otro – ,no logro hacer el programa

Responder

Has visto la entrada de PWM? Con eso colocas los dos botones y haces un contador que será tu duty cicle. Con el boton + aumentas el contador el cual ira a la función set_pwm1(contador); y con el boton – lo decrementas y listo. El como usar botones y contadores, lo puedes ver en la entrada de display 7 segmentos por ejemplo. Saludos.

Responder

hola soy nuevo aayudeme, como hago para grabar el programa al pic tengo el pickit3

Responder

Empieza el curso desde el comienzo, Da click aqui para ver el curso Gratis de Microcontroladores PIC, en la tercera entrada se explica como usar el PicKit3

Responder

Hola Sergio C, me gustabti explicación, sin embargo eso de las interrupciones conozco poco, por ello te pregunto ¿cómo hacer que una función ponga la hora en tiempo real (cada milesima de segundo ) en una parte de la pantalla mientras corre mi programa?
De antemano michas gracias Sergio

Responder

Si quieres poner la hora, te recomiendo mejor que le adiciones al PIC un reloj calendario de tiempo real (DS1307) comunicado con I2C, aqui te dejo la entrada donde se explica como configurar ese reloj y como usarlo. Comunicación I2C con PIC (click aqui). Exitos!

Responder

muy buena pagina,fue de mucha ayuda

Responder

Que bueno que te gustó!!. Saludos.

Responder

hola, al usar el INT_RB no logro conseguir que me lea las interrupciones por otro pin, me insiste en solo usar el RB0, ¿podria regalarme otro ejemplo usando otro pin porfa?.
por cierto muy buen blog.

Responder

#INT_EXT
ext_isr()
{
contador++;
}
en esta parte me genera un error
warning 208 funtion not void and does not return a value ext_isr
cuando coloco void ext_isr se soluciona pero no estoy seguro de que sea la solucion correcta, agradeceria su respuesta

Responder

No es un error, es simplemente una advertencia. Tu solución es correcta, dado que esa función no retorna nada para evitar la advertencia basta colocar el void.

Responder

muy buen video y explicacion amigo me sirvio de mucho, pero quisiera saber como se realizaria pero para que me marcara las revoluciones en 3 display si pudiears ayudarme seria de mucha ayuda

Responder

Es tomar los datos de las revoluciones y en lugar de mandarlos al lcd los mostramos en los displays multiplexando cada uno de estos de la forma como se ve en esta entrada: https://controlautomaticoeducacion.com/microcontroladores-pic/multiplexaje-de-display/

Responder

Hola es muy bueno tu sitio y estoy aprendiendo mucho. Estoy tratande de hacer interrupciones por cambio de estado en los puertos b4-b7 y no funciona. Lei que debo usar ANSE y ANSEH pero el compilador me dice que no estan inicializados y ya no encuentro manera de hacer eso y nadie ha hecho nada en la red acerca del tema. Me podrias ayudar?

Responder

Albert es similar al ejemplo que hemos visto acá en el post. Puedes inicialmente hacer el Ejemplo 1 por interrupción por los pines b4-b7, es solo cambiar #INT_EXT por #INT_RB y activar las interrupciones antes de entrar al ciclo infinito

clear_interrupt(int_rb); // borro el flag de interrupción para que no entre al principio
enable_interrupts(int_rb);      //activar interrupcion rb4:7
enable_interrupts(GLOBAL);      //activar interrupciones

saludos

Responder

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

Responder

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.

Responder

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

Responder

Hola. Puedes dar un vistazo al post donde hablo de multiplexación de display:
https://controlautomaticoeducacion.com/multiplexaje-de-display/

Responder

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?

Responder

Hola jose Maria. Claro que si. Puedes usar ambas interrupciones. Saludos

Responder