Ich habe PIC16F877
( Datenblatt ) für mehrere Projekte verwendet. Für einen einzelnen externen Pinwechsel-Interrupt können Sie PORTB0
Interrupt verwenden. Aber jetzt muss ich 8 unabhängige externe Pinwechsel-Interrupts in einem einzigen Schaltkreis unterstützen.
Im Datenblatt steht, dass es 15 Interrupts gibt PIC16F877
, aber ich denke, diese werden gezählt, einschließlich Timer-Überlauf-Interrupts usw., die in diesem Fall unbrauchbar sind.
Dies ist, was Datenblatt über INTCON
Register sagen .
Kann ich mit Bit0 4 unabhängige Interrupts haben RBIF
? Es repräsentiert eine Veränderung in PB7:PB4
. Wie kann ich feststellen, welcher Pin geändert wurde, indem ich den Portwert in der Interruptroutine lese?
Auch wenn ich oben positive Antworten bekomme, brauche ich 8 Interrupts? Natürlich kann ich noch INTE
für PORTB0
Veränderung verwenden. Dann 4 + 1 = 5
, aber was ist mit anderen 3? (Da jedoch alle 8 Interrupt-Ereignisse vom gleichen Typ sind, 4 + 1 + 3 = 8
scheint das Ding hässlich, nicht wahr?)
Vom Mikrocontroller werden keine anderen schweren Aufgaben erwartet als die Überwachung von 8 Pins. (Wenn wir über die anderen Aufgaben sprechen, müssen wir einen Satz separater Zählervariablen verwalten und häufig etwa 4 Bytes seriell an den PC übertragen.)
Anregungen sind willkommen. Auch wenn es darum geht, den Mikrocontroller gegen einen geeigneteren auszutauschen (aber äh ... sag mir nicht, ich soll von PIC
s weggehen ).
quelle
Antworten:
Dies ist C-Pseudocode, um eine Idee zu erklären. Es verwendet ein exklusives ODER, um herauszufinden, welche Pins sich geändert haben, und ruft Ihre verschiedenen Handler innerhalb eines RBIE-Interrupts auf. Abhängig davon, wie kritisch die Anwendung ist, möchten Sie möglicherweise überprüfen, wie der PIC mit Situationen wie einem Portwechsel während der Ausführung des Interrupts umgeht, um sicherzustellen, dass Sie keine Ereignisse verpassen.
quelle
RB7:RB4
nur 4 Pins überwachen . Aber ich frage nach einer Möglichkeit, 8 Pins zu überwachen. irgendein Vorschlag?and four interrupts for the RB0:RB3
? PIC16F877 unterstützt keine Interrupts fürRB1:RB3
, oder?Dieser Teil hat nur 4 Pin-Change-Interrupts und einige andere, die Sie an ausgewählten Kanten einrichten können. Eine Strategie wäre, eine Änderung des 8-Bit-Werts extern zu erkennen und dann die Nichtübereinstimmung zu unterbrechen. Das wird in der Hardware chaotisch, wird aber so genau das, was Sie wollen.
Die wichtigen Parameter, die Sie nicht angegeben haben, sind, wie schnell Sie auf einen Pinwechsel reagieren müssen und wie lange ein Pinwechsel mindestens so lange dauert, bis er gültig ist. Abhängig von den Antworten können Sie basierend auf einem regelmäßigen Interrupt in der Firmware abfragen. Der 16F877 kann mit einer Befehlsrate von 5 MHz betrieben werden, und die Überprüfung auf eine Änderung würde nur wenige Befehle erfordern. Angenommen, Sie richten den Interrupt alle 50 Anweisungen ein. Das würde einen guten Teil der Prozessorzeit dem Vordergrundcode überlassen. Die Unterbrechungsrate wäre 100 kHz und die Periode 10 us. Natürlich muss der Vordergrundcode dann noch das Änderungsflag sehen und etwas dagegen tun, sodass die Antwortzeit mehr als 10 µs beträgt, aber Sie haben nichts darüber gesagt, was Sie tun müssen, wenn eine Änderung erkannt wird. Wenn dies nur in menschlicher Zeit reagieren muss,
quelle
once per second
ausreichen. Wenn ein Pinwechsel (nur eine Flanke, z. B. steigend) erkannt wird, muss ein Zähler (variabel) inkrementiert werden. In der Hauptschleife müssen die Zählerwerte überwacht werden, und wenn einer einen bestimmten Wert überschreitet, müssen vier Bytes überUSART
den PC übertragen werden . Setzen Sie dann den entsprechenden Zählerwert auf Null zurück. So einfach ist das. Ich denke, die Polling-Option wird gut gehen, oder?Sie können das von @Brian Drummond erwähnte 8-Eingangs-Gate-NAND verwenden, um einen Interrupt über den INT-Pin auszulösen und Ihre Interrupt-Quellen auch mit dem 8-Bit-Parallel-In / Serial-Out-Schieberegister wie "74HC165N" zu verbinden Um nur die Daten aus diesem Schieberegister zu lesen, nachdem der Interrupt ausgelöst wurde, erhalten Sie Informationen über Ihre tatsächliche Interruptquelle. Dies ist möglicherweise nicht der schnellste Weg, aber einfach zu erweitern und verwendet nicht mehr als 5 Pins Wenn Sie ein Adresssteuerungssystem (MUX, LATCH, ...) hinzufügen, benötigen Sie nur eine Kiefer für die Interrupt-Benachrichtigung, und andere Pins können zu unterschiedlichen Zeiten für unterschiedliche Ressourcen wiederverwendet werden.
quelle