J'ai utilisé PIC16F877
( fiche technique ) pour plusieurs projets. Pour une seule interruption de changement de broche externe, vous pouvez utiliser PORTB0
interruption. Mais maintenant, je dois prendre en charge 8 interruptions de changement de broches externes indépendantes, dans un seul circuit.
Dans la fiche technique, il est indiqué qu'il y a 15 interruptions PIC16F877
, mais je suppose que celles-ci sont comptées, y compris les interruptions de débordement de la minuterie, etc., qui sont inutiles dans ce cas.
C'est ce que dit la fiche technique sur le INTCON
registre.
Puis - je avoir 4 interruptions indépendantes à l' aide bit0, RBIF
? Cela représente un changement PB7:PB4
. Comment puis-je identifier la broche modifiée, est-ce en lisant la valeur du port dans la routine d'interruption?
Même si j'obtiens des réponses positives à ce qui précède, j'ai besoin de 8 interruptions? bien sûr, je peux toujours utiliser INTE
, pour le PORTB0
changement. Alors 4 + 1 = 5
, mais qu'en est-il des 3 autres? (Cependant, étant donné que les 8 événements d'interruption sont du même type, la 4 + 1 + 3 = 8
chose semble moche, n'est-ce pas?)
Il n'y a aucune autre tâche lourde attendue du micro-contrôleur autre que la surveillance de 8 broches. (En parlant des autres tâches, il devra maintenir un ensemble de variables de compteur séparées et transmettre fréquemment environ 4 octets au PC en série)
Toutes suggestions sont les bienvenues. Même s'il s'agit de changer le micro-contrôleur pour un plus adapté (mais euh .. ne me dites pas de m'éloigner de PIC
s).
la source
Réponses:
Il s'agit d'un pseudo-code C pour expliquer une idée. Il utilise et OU exclusif pour déterminer quelles broches ont changé et appellera vos différents gestionnaires au sein d'une interruption RBIE. Selon l'importance de l'application, vous souhaiterez peut-être vérifier comment le PIC gère les situations telles qu'un changement de port pendant l'exécution de l'interruption pour vous assurer de ne manquer aucun événement.
la source
RB7:RB4
4 broches. Mais je demande un moyen de surveiller 8 broches. toute suggestion?and four interrupts for the RB0:RB3
? PIC16F877 ne supporte aucune interruption pourRB1:RB3
, hein?Cette partie n'a que 4 interruptions de changement de broches et quelques autres que vous pouvez configurer sur les bords sélectionnés. Une stratégie consisterait à détecter une modification de la valeur de 8 bits en externe, puis à interrompre la non-concordance. Cela devient désordonné dans le matériel, mais correspondra exactement à ce que vous voulez.
Les paramètres importants que vous n'avez pas indiqués sont la vitesse à laquelle vous devez répondre à un changement de broche et la durée minimale d'un changement de broche pour qu'il soit valide. Selon les réponses, vous pouvez interroger en fonction d'une interruption régulière du micrologiciel. Le 16F877 peut fonctionner à une fréquence d'instructions de 5 MHz, et la vérification d'un changement ne prendrait que quelques instructions. Disons que vous configurez l'interruption toutes les 50 instructions. Cela laisserait une bonne partie du temps processeur au code de premier plan. Le taux d'interruption serait de 100 kHz et la période de 10 µs. Bien sûr, le code de premier plan doit alors toujours voir l'indicateur de changement et faire quelque chose, donc le temps de réponse sera supérieur à 10 µs, mais vous n'avez rien dit sur ce que vous devez faire lorsqu'un changement est détecté. Si cela doit simplement répondre en temps humain,
la source
once per second
sera suffisant. Lorsqu'un changement de broche (un seul bord, par exemple croissant) est détecté, un compteur (variable) doit être incrémenté. Dans la boucle principale, il doit surveiller les valeurs du compteur et quand on dépasse une certaine valeur, quatre octets doivent être transmis viaUSART
au PC. Remettez ensuite la valeur du compteur à zéro. Aussi simple que cela. Je suppose que l'option de sondage ira bien, non?Vous pouvez utiliser la porte NAND à 8 entrées comme mentionné par @Brian Drummond pour augmenter une interruption sur la broche INT et également connecter vos sources d'interruption au registre à décalage 8 bits parallèle en entrée / série comme "74HC165N", vous aurez donc besoin juste lire les données de ce registre à décalage après une interruption et cela vous donnera les informations sur votre source d'interruption réelle ... ce n'est peut-être pas le moyen le plus rapide, mais facile à étendre et n'utilisera pas plus de 5 broches, et si vous ajoutez un système de contrôle d'adresse (MUX, LATCH, ...), alors vous aurez besoin d'un seul pin pour la notification d'interruption et d'autres broches peuvent être réutilisées à différents moments pour différentes ressources;)
la source