I2C auf PIC12s mit MPLAB x (win7) und XC8

Ich habe einen Programmierhintergrund, bin aber sehr neu in Bezug auf Mikrocontroller. Verzeihen Sie mir, wenn diese Frage sehr einfach ist oder keinen Sinn ergibt. Ich versuche, mein Wissen aufzufrischen, und die Lernkurve scheint in einigen Bereichen steil zu sein.

Ich versuche, I2C mit einem neuen IC, den ich gekauft habe, dem PIC12LF1552, zum Laufen zu bringen. Dieser IC enthält ein I2C-Modul, also sollte ich nicht bit-bangen müssen. Es scheint jedoch, dass XC8 I2C auf der PIC12-Serie nicht unterstützt. MPLAB X scheint die ic2.h-Include-Datei nicht zu finden (dies ist möglicherweise kein Problem, es könnte sein, dass die Pfade nicht korrekt eingerichtet sind), also habe ich die Datei mit einem vollständigen Pfad verknüpft. i2c.h enthält pconfig.h in Zeile 32 und pconfig.h enthält p18cxxx.h in Zeile 16, was anscheinend nicht funktioniert, da es für eine andere Chipserie gilt.

Meine Frage ist also, welche Unterstützung gibt es für die Ausführung von nativem I2C auf ICs der PIC12-Serie?

Antworten (2)

Kommt darauf an, was man unter "Unterstützung" versteht. Nur weil es möglicherweise keine vorgefertigte Bibliothek gibt, heißt das nicht, dass Sie das Peripheriegerät nicht verwenden können.

Die XC-Compiler bieten direkten Zugriff auf die speziellen Funktionsregister und Interrupt-Fähigkeiten des Zielgeräts. Sie können die I2C-Peripherie und die Handhabungsroutinen genauso einfach in C konfigurieren wie in Assemblersprache. Das Gerätedatenblatt enthält alle Details zum Einrichten dieser Peripheriegeräte. Lesen Sie einfach das Datenblatt, schreiben Sie die erforderlichen Werte in die erforderlichen SFRs und fragen Sie nach Bedarf ab / unterbrechen Sie sie.

(Es ist oft einfacher, auf diese Weise zu codieren, da Sie nicht auf Closed-Source-Bibliotheken angewiesen sind, die möglicherweise nicht genau das tun, was beworben wird.)

Es gibt einen bedeutenden Abschnitt des Datenblatts, der der I2C- (und SPI-) Kommunikation gewidmet ist. Ich verstehe, wie I2C funktioniert, und der Abfrage-/Interrupt-Code sollte ziemlich einfach sein, insbesondere bei aktiviertem Clock-Stretching. Ich glaube, ich bin ein bisschen verloren, wie ein Schreiben in ein Register die I2C-Ausgabe erzeugt und wie das alles funktioniert. Ich werde den Rest des Datenblatts lesen und sehen, ob ich Kopf oder Zahl daraus machen kann.
Es ist ziemlich einfach, wenn Sie sich einiger Dinge bewusst sind, wie z.
Ja, ich kann sehen, wo es damit gehen muss. Es scheint jedoch interessant zu sein, dass dies der Weg ist, es zu tun. Es ist das Äquivalent der Desktop-Programmierung zu einer globalen Variablen, die von mehreren Threads geschrieben und gelesen wird. Wie garantieren Sie Fadensicherheit? Manuell basierend auf anderen Registern, denke ich? Ich glaube nicht, dass es wirklich Threading gibt, also wie wird das Register jemals verarbeitet, wenn wir keine Funktion aufrufen?
PICs sind per se nicht multithreaded, aber Sie müssen im Allgemeinen den Status verfolgen, wenn der Code in und aus ISRs springt (flüchtige Variablendeklarationen, Register-Clobbering usw.). wieder global zugänglich. Die PIC-Hardware kümmert sich darum, was zu tun ist, wenn diese Register von der Software geschrieben werden.

Der Microchip XC8-Compiler verfügt über integrierte Peripheriebibliotheken (einschließlich I2C-Bibliotheken), jedoch nur für die PIC18F-Mikrofamilie. Die anderen 8-Bit-Mikros (PIC10F, PIC12F, PIC16F) haben keine Peripheriebibliothek. Sie müssen Ihre eigene Implementierung/Treiber für das I2C-Peripheriegerät schreiben, indem Sie die Register direkt manipulieren.

Ich habe mir das Datenblatt angesehen und sie sagen Ihnen, was SFR-Register für I2C sind. Ich habe immer noch Probleme, mehr Informationen darüber zu finden, zum Beispiel, wie heißt dieser Prozess? Es ist kein bisschen Knallen, weil die Register einen Teil der schweren Arbeit für Sie erledigen. Ich schätze, ich bin nicht die erste Person, die darauf gestoßen ist, also hatte ich gehofft, ich könnte ein Beispiel finden.
Nein, es ist kein Bit-Banging. Ich schätze, Sie können es "Ihren eigenen Treiber für das I2C-Peripheriegerät schreiben" nennen :-) Hier sind einige Codebeispiele , die Ihnen helfen könnten.