* NIP - Core Independent Peripherals in Microchip-Mikrocontrollern, auch bekannt als CIP - Core Independent Peripheral.
Teil 4
Die vorherigen Artikel [
1 ], [
2 ] und [
3 ] waren den PeripheriegerĂ€ten der Core Independent (NEV) -Mikrochip-Mikrocontroller gewidmet: konfigurierbare Logikzellen, Eingangs- / Ausgangsports mit Strombegrenzungsfunktion und ADCs mit einem Computer; einige Merkmale solcher PeripheriegerĂ€te wurden gezeigt. Ich möchte Sie daran erinnern, dass UnabhĂ€ngigkeit nicht vom Typ des PIC-Kerns von Mikrocontrollern (BaseLine, Mid-Range, Enhanced Mid-Range, PIC18, 16-, 32-Bit), sondern vom Betrieb des Kerns, d. H. unabhĂ€ngige AusfĂŒhrung von Aufgaben, die der Peripherie des CPU-Zustands zugeordnet sind. Solche PeripheriegerĂ€te und insbesondere die Möglichkeit, sie fĂŒr die Zusammenarbeit und Synthese von Hardwarefunktionen zu konfigurieren, sollen den Softwareteil auslagern und den Stromverbrauch senken.
In diesem kurzen Artikel möchte ich Beispiele fĂŒr die Implementierung des Empfangs von "benutzerdefinierten", nicht standardmĂ€Ăigen Kommunikationsschnittstellen unter Verwendung der vom Kernel unabhĂ€ngigen PeripheriegerĂ€te zeigen.
Die PWM-Codierung von Informationen ist sehr hÀufig, wenn diskrete Signale log. 1 und log. 0 durch die Impulsbreite codiert werden. ErwÀgen Sie die Möglichkeit, solche Signale mithilfe der periphere kernunabhÀngigen PIC-Controller zu empfangen und zu decodieren.
PWM-Decodierung des AM2302-Sensorsignals
In DIY-Projekten wird hĂ€ufig der Temperatur- und Feuchtigkeitssensor DHT22 (AM2302) verwendet. Der Sensor hat 3 AusgĂ€nge, Informationen werden ĂŒber einen einzigen Draht ĂŒbertragen. In Reaktion auf eine Anfrage (niedriger Pegel mit einer Dauer von ungefĂ€hr 1 ms) antwortet der Sensor mit einem Startbit und dann einer Folge von 40 Bits, wobei die Informationen in der Impulsdauer: log codiert werden. "0" - Impuls 30mk Sek., Log. "1" - 70 mk sec (typische Werte). Die Antwort vom Sensor enthĂ€lt 5 Bytes: 2 Bytes Feuchtigkeitsdaten, 2 Bytes Temperatur und 1 Kontrollbyte.
Abb. 1. ErlĂ€uterungen zum Prinzip der DHT22-Sensorsignalerzeugung.Das Netzwerk hat viele Beispiele fĂŒr die Arbeit mit solchen Sensoren auf Arduino. Einige Bibliotheksimplementierungen verwenden Konstrukte wie:
loopCnt = TIMEOUT; while(PIN) { if(--loopCount == 0) return ErrorTimeout; } if (loopCnt < cntOne) { // bit =1 ⊠} else { // bit =0 ⊠}
In solchen Implementierungen sehe ich die folgenden Probleme:
- das Programm fĂŒr die gesamte Messzeit (> 5 ms) âhĂ€ngtâ im Messcode;
- Das Auftreten eines ausreichend langen Interrupts stört das Lesen der Daten vom Sensor.
- mögliche Probleme beim Arbeiten mit einer niedrigen Taktfrequenz des Mikrocontrollers;
Der Algorithmus des Programms solcher Lösungen hat ungefÀhr die folgende Form (siehe Fig. 2)
Abb. 2. Ein Algorithmus zum programmgesteuerten Empfangen und Decodieren von Sensorsignalen.Im Folgenden wird eine Variante des Hardware-Empfangs / -Decodierens des Protokolls mit minimalem Software-Overhead betrachtet.
Die Idee ist, Taktimpulse vom Bitstrom zu isolieren, gefolgt von der Richtung des ursprĂŒnglichen Signals und den Taktimpulsen zum SPI-Hardwaremodul. In diesem Fall kann das Programm des Mikrocontrollers nur nacheinander 5 Byte Daten vom SPI ĂŒbernehmen.
Ein Teil des KVP ist ein Timer mit der FĂ€higkeit, Ereignisse auszulösen (Ănderungen des Eingangsstatus oder anderer PeripheriegerĂ€te). Das heiĂt, Das Ăndern des Eingangszustands kann einen Timer auslösen, siehe TMR6-Signal in Abb. 3. Wenn der Timer den eingestellten Wert erreicht, stoppt seine ZĂ€hlung und der Timer befindet sich im Zustand TMR6 = PR6 (PR - Periodenregister). Der Timer-Status kann eine Eingabe fĂŒr eine konfigurierbare Logikzelle (CLC, siehe Teil 1) sein.
Somit können wir unter Verwendung eines Zeitgebers und von Logikzellen ein Signal erzeugen, das zum Anlegen an den Takteingang des SCK des SPI-Moduls geeignet ist. Um Informationen zu extrahieren, sollte die Dauer eines solchen Blocks einen Durchschnittswert zwischen der Dauer von Null und Eins haben. Dann kann SPI das Bit entsprechend dem Zerfall des Blocks fixieren (siehe Fig. 3 SCK-Signal).
Das Signal vom Sensor hat falsche Impulse, die aus der Anforderung erzeugt werden, und Startimpulse. Damit diese Impulse den Betrieb nicht stören, mĂŒssen Sie SPI nur fĂŒr die Dauer von Informationsimpulsen aktivieren oder unnötige Impulse abschneiden. Wir können dieses Problem auch mit CIP lösen.
Ein anderer Timer fungiert als ImpulszÀhler beim Umschalten der Rezession: Schreiben Sie die Nummer 2 in das Periodenregister, der Timer zÀhlt die ersten 2 Impulse (siehe Signal TMR4 in Abb. 3) und stoppt die ZÀhlung (siehe EN-Signal in Abb. 3), die durchlÀuft Der Block logischer Zellen ermöglicht die Ausgabe der verbleibenden Impulse an den Eingangs-SPI.
Abb. 3. Diagramme zur ErlÀuterung des Empfangs von DHT22-Sensorsignalen.Die logische Funktion der SCK-Signalerzeugung ist in einer logischen Zelle (CLC) implementiert, die vollstÀndige Schaltung in der UND-ODER-Konfiguration ist in Fig. 4 gezeigt.
Der Ausgang der Logikzelle ist mit dem SCK-Eingang verbunden, und das DHT22-Sensorsignal ist mit dem MOSI des SPI-Moduls verbunden. Alle Verbindungen werden im Mikrocontroller hergestellt (Abb. 5). Zur Ăberwachung und zum Debuggen können Signale an die Ports des Mikrocontrollers ausgegeben werden.
Abb. 4. Konfiguration der CLC-Logikzelle im PIC-Mikrocontroller.Abb. 5. Die vollstĂ€ndige Struktur der Konfiguration der Peripherie.Wenn es den Anschein hat, dass 2 Timer fĂŒr die Dekodierung des Protokolls des Sensors eine Verschwendung von Ressourcen darstellen, kann ein ZĂ€hler von bis zu zwei auf freien logischen Zellen des CLC "gesammelt" werden.
Insgesamt lĂ€uft die Decodierungsaufgabe auf einen sehr einfachen Algorithmus hinaus: Der Mikrocontroller und seine PeripheriegerĂ€te werden bei Bedarf initialisiert, das SPI-Modul eingeschaltet und eine Messanforderung generiert (log. â0â fĂŒr ~ 1 ms).
Es bleiben Daten aus dem Puffer zu lesen, wenn ein Interrupt von SPI auftritt.
Abb. 6. Der Algorithmus fĂŒr die Arbeit mit dem DHT22-Sensor bei Verwendung des Stumpfes.
Abb. 7. Signale von den Ports des Mikrocontrollers. Signal SSP1IF - Unterbrechungen beim Empfang eines Bytes durch das SPI-Modul.Abbildung 7 zeigt die Signaldiagramme, wobei:
DHT (dat) - Signal auf der Signalleitung des Sensors - Einspeisung in den Eingang des MOSI-Moduls SPI;
TMR6! = RP6 - dedizierte Uhr - an den SCK des SPI-Moduls senden;
SSP1IF - Interrupt-Signal (Datenbereitschaft im SPI-Puffer) - TatsÀchlich zeigt dieses Signal die Last des Mikrocontrollerkerns - Lesen der Ergebnisdaten.
Dekodierung anderer PWM-Protokolle
Ăhnliche "Single-Wire" PWM-Protokolle werden in IR-Fernbedienungen fĂŒr HaushaltsgerĂ€te verwendet. WĂ€hrend der IR-Ăbertragung wird hĂ€ufig die Codierung durch die Position des Impulses verwendet, wenn die Dauer konstant und die Pause variabel ist. Diese Option wird auch als "Variable Pause Encoding" bezeichnet. TatsĂ€chlich ist dies die gleiche PWM-Codierung, jedoch mit einem invertierten Signal. Bei Vorhandensein logischer Zellen ist die Inversion kein Problem, auĂerdem invertieren IR-EmpfĂ€nger das empfangene Signal. In Abb. Abbildung 8 zeigt die Signale, nachdem der EmpfĂ€nger von zwei verschiedenen Konsolen empfangen wurde.

Abb. 8. Codierungsoptionen fĂŒr IR-Fernbedienungen.Beide Fernbedienungen haben unterschiedliche Protokolle, aber diese Protokolle können auf die oben beschriebene Weise leicht decodiert werden. Das einzige ist, dass der Beginn des Sendens bestimmt werden muss, um die Einbeziehung von SPI zu synchronisieren, da der IR-EmpfĂ€nger Interferenzen abfangen kann.

Abb. 9. Mit SPI dekodierte Signale.Nicht alle IR-Fernbedienungen verfĂŒgen ĂŒber eine PWM-Codierung. Einige Protokolle, zum Beispiel RC5, haben eine Phasenkodierung (Manchester-Code, "0" wird als 10 und "1" als 01 ĂŒbertragen) [4]. Die Dekodierung des Manchester-Codes unter Verwendung der Peripherie eines unabhĂ€ngigen Kernels haben wir bereits weiter oben im ersten Teil betrachtet [1].
Zusammenfassung
Anstelle von fast 100% der CPU-Auslastung des Mikrocontrollers fĂŒr die Dekodierung des PWM-Protokolls in der Arduino-Version (ja, ich weiĂ, das Problem kann mithilfe von Erfassungsmodulen oder anderen PeripheriegerĂ€ten effizienter gelöst werden) haben wir den Empfang des Informationspakets an die Hardware ĂŒbertragen. Die Vorderseite des Eingangssignals startet den Timer, der Status des Timers bestimmt den Ausgang des Blocks logischer Zellen, der Ausgang der logischen Zelle wird dem SPI zugefĂŒhrt.
Die Verwendung von PeripheriegerĂ€ten unabhĂ€ngig vom Kern ermöglicht die Optimierung der Ressourcennutzung, die Ăbertragung einiger Aufgaben auf die Hardware, die Vereinfachung des Codes und die Reduzierung des Verbrauchs.
Literatur
1.
Konfigurierbare Logikzellen in PIC-Controllern.2.
50 Schattierungen von Stumpf. Eingangs- / AusgangsanschlĂŒsse3.
50 Schattierungen von Stumpf. ADC und ADC mit Microchip-Mikrocontroller-Computer4.
sbprojects.com/knowledge/ir/rc5.php