Utilisation de plusieurs interruptions externes dans PIC

9

J'ai utilisé PIC16F877( fiche technique ) pour plusieurs projets. Pour une seule interruption de changement de broche externe, vous pouvez utiliser PORTB0interruption. 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 INTCONregistre.

entrez la description de l'image ici

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 PORTB0changement. 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 = 8chose 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 PICs).

Nom de code SC
la source
2
Sans utiliser d'interruptions, vous pouvez peut-être surveiller les broches du programme principal. Mais ce n'est pas parfait cependant. Comme alternative, vous pouvez opter pour Arduino. Bien que ce ne soit pas un PIC, c'est assez simple, vous le comprendrez facilement car vous êtes déjà familier avec les PIC.
Anubis
1
Si vous utilisez l'interruption RBIE, vous pouvez simplement mettre en mémoire tampon la valeur précédente à chaque fois et un XOR pour trouver ce qui a changé. Devrait être assez rapide à exécuter.
PeterJ
@PeterJ je n'ai pas bien compris ça. Tampon quelle valeur?
Nom de code SC
@PeterJ super! en attendant ...
Nom de code SC
1
Une façon consiste à utiliser une porte externe à 8 entrées (comme le 74LS30 dans l'ancien temps) pour combiner les signaux externes sur une broche d'interruption. Comme le 74 (HC) 30 est une porte NAND, vous auriez besoin de toutes les entrées à l'état de repos - elles devraient également être connectées aux broches du port afin que vous puissiez identifier les interruptions actives en lisant le port.
Brian Drummond

Réponses:

3

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.

int old_port_b;

void isr_handler()
{
    int new_port_b, changed_pins;
    new_port_b = read_port_b();
    changed_pins = new_port_b ^ old_port_b;
    if (changed_pins | 1)
        rb0_hander();
    if (changed_pins | 2)
        rb1_hander();
        // ... etc
    old_port_b = new_port_b;
}

int main()
{
    old_port_b = read_port_b();
    enable_interrupt();
}
PeterJ
la source
Je comprends, merci! mais ce n'est pas la réponse exacte que je cherche. De cette façon, vous ne pouvez surveiller que RB7:RB44 broches. Mais je demande un moyen de surveiller 8 broches. toute suggestion?
Nom de code SC
Je suppose qu'il y a une raison pour laquelle vous ne pouvez pas utiliser RB0 - RB7 ce qui précède devrait fonctionner? Sinon, je ne peux pas vraiment penser à un moyen, si le déclenchement rapide du code n'est pas vital, vous pouvez utiliser le style de code ci-dessus dans une interruption de minuterie (ou tout simplement la boucle principale).
PeterJ
Pour ce PIC, si vous devez utiliser des interruptions pour ce faire, l'astuce XOR sur RB4: RB7 et quatre interruptions pour RB0: RB3 est le chemin à parcourir. Si vous n'avez pas besoin de l'interruption, interrogez simplement le port entier dans votre code, ou utilisez une interruption de minuterie pour gérer l'interrogation si vous avez besoin d'un taux d'échantillonnage dur
Scott Seidman
and four interrupts for the RB0:RB3? PIC16F877 ne supporte aucune interruption pour RB1:RB3, hein?
Nom de code SC
Je l'avais manqué dans la fiche technique, je supposais qu'il couvrait tout le port. Mais j'ai vu votre autre commentaire environ une fois par seconde, donc je pense que vous feriez mieux de simplement l'exécuter dans votre boucle principale. Avec les interruptions, vous devrez prendre soin de la mise à jour des variables à tout moment pendant l'exécution et comment gérer les changements de broches pendant l'interruption. Il semble vraiment que cela ne fera que compliquer les choses sans aucun gain réel. La seule exception à laquelle je pourrais penser est si vous vouliez utiliser le réveil du sommeil lors d'une interruption, auquel cas vous auriez besoin de les MUX matériels.
PeterJ
1

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,

Olin Lathrop
la source
Désolé pour les détails manquants. Car le taux de réponse attendu once per secondsera 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 via USARTau PC. Remettez ensuite la valeur du compteur à zéro. Aussi simple que cela. Je suppose que l'option de sondage ira bien, non?
Nom de code SC
2
Une fois par seconde ! Alors, à quoi servent toutes les angoisses des interruptions? Cela se fait facilement avec un sondage périodique. Quel est le problème alors?
Olin Lathrop du
euh ... je pense que ce sera mieux car il y en a 8 et aussi, la réponse ne peut pas être prédite (mais cette valeur peut être supposée être le minimum). Hey! les gens peuvent faire des erreurs, non .. :(
Nom de code SC
1

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

Eli Oulman
la source