He usado PIC16F877
( hoja de datos ) para varios proyectos. Para una interrupción de cambio de pin externo, puede usar PORTB0
interrupción. Pero ahora necesito admitir 8 interrupciones de cambio de pin externas independientes, en un solo circuito.
En la hoja de datos dice que hay 15 interrupciones PIC16F877
, pero supongo que se cuentan, incluidas las interrupciones de desbordamiento del temporizador, etc., que son inútiles en este caso.
Esto es lo que dice la hoja de datos sobre el INTCON
registro.
¿Puedo tener 4 interruptores independientes usando bit 0, RBIF
? Representa el cambio en PB7:PB4
. ¿Cómo puedo identificar qué pin cambió, es leyendo el valor del puerto en la rutina de interrupción?
Incluso si recibo respuestas positivas a las anteriores, ¿necesito 8 interrupciones? Por supuesto que todavía puedo usar INTE
, para el PORTB0
cambio. Entonces 4 + 1 = 5
, pero ¿qué pasa con los otros 3? (Sin embargo 4 + 1 + 3 = 8
, dado que los 8 eventos de interrupción son del mismo tipo, la cosa parece fea, ¿no?)
No se esperan otras tareas pesadas del microcontrolador que no sean monitorear 8 pines. (Hablando de las otras tareas, tendrá que mantener un conjunto de variables de contador separadas y con frecuencia transmitir aproximadamente 4 bytes a la PC en serie)
Cualquier sugerencia es bienvenida. Incluso si se trata de cambiar el microcontrolador por uno más adecuado (pero uh ... no me digas que me aleje de PIC
s).
fuente
Respuestas:
Este es un pseudocódigo C para explicar una idea. Utiliza un OR exclusivo para determinar qué pines han cambiado y llamará a sus diferentes controladores dentro de la única interrupción de RBIE. Dependiendo de cuán crítica sea la aplicación, es posible que desee verificar cómo el PIC maneja situaciones como un cambio de puerto mientras se ejecuta la interrupción para asegurarse de que no se perderá ningún evento.
fuente
RB7:RB4
solo 4 pines. Pero estoy pidiendo una forma de monitorear 8 pines. ¿cualquier sugerencia?and four interrupts for the RB0:RB3
? PIC16F877 no admite interrupciones paraRB1:RB3
, ¿eh?Esa parte solo tiene 4 interrupciones de cambio de pin y algunas otras que puede configurar en los bordes seleccionados. Una estrategia sería detectar un cambio en el valor de 8 bits externamente, luego interrumpir el desajuste. Eso se vuelve complicado en el hardware, pero será exactamente lo que quieres.
Los parámetros importantes que no ha indicado son qué tan rápido necesita responder a un cambio de pin y qué tiempo mínimo persistirá un cambio de pin para que sea válido. Dependiendo de las respuestas, puede realizar una encuesta en función de una interrupción regular en el firmware. El 16F877 puede ejecutarse a una velocidad de instrucción de 5 MHz, y buscar un cambio solo requeriría unas pocas instrucciones. Digamos que configura la interrupción cada 50 instrucciones. Eso dejaría una buena parte del tiempo del procesador al código de primer plano. La velocidad de interrupción sería de 100 kHz y el período de 10 µs. Por supuesto, el código de primer plano todavía necesita ver el indicador de cambio y hacer algo al respecto, por lo que el tiempo de respuesta será de más de 10 µs, pero no ha dicho nada sobre lo que debe hacer cuando se detecta un cambio. Si esto solo necesita responder en tiempo humano,
fuente
once per second
será suficiente. Cuando se detecta un cambio de pin (solo un borde, digamos ascendente), se debe incrementar un contador (variable). En el bucle principal, tiene que monitorear los valores del contador y cuando uno se eleva por encima de un cierto valor, se deben transmitir cuatro bytesUSART
a la PC. Luego restablezca el valor del contador relevante a cero. Simple como eso. Supongo que la opción de votación irá bien, ¿verdad?Puede usar la compuerta NAND de 8 entradas como lo menciona @Brian Drummond para aumentar una interrupción sobre el pin INT y también conectar sus fuentes de interrupción al registro de desplazamiento de entrada paralela / salida de 8 bits como "74HC165N", por lo que necesitará simplemente leer los datos de ese Registro de turnos después de que se disparó la interrupción y eso le dará la información sobre su fuente de interrupción real ... puede que no sea la forma más rápida, pero fácil de expandir y usará no más de 5 pines, y si agrega un sistema de control de dirección (MUX, LATCH, ...), solo necesitará un pino para la notificación de interrupción y otros pines pueden reutilizarse en diferentes momentos para diferentes recursos;)
fuente