I2C Initialisierung (Master) PIC16F1704

OP #6322333
Lesenswert?
• ▲
▼
Hallo!
Ich will Lichtstärke-Mess-Modul GY-302 (Chip = BH1750; 
(slave-)I2C-Modul) mit PIC16F1704 ansteuern (Master).
Kurzbeschreibung: Chip BH1750 braucht max. 3,3V und das Modul GY-302 hat 
3,3V Regler, sodass seine I2C-Anschluße 0V oder 3,3V liefern. PIC und 
LCD laufen von 5V, mit den GY-302-Modul versorgt wird. Für 
I2C-Kommunikation wurde ein Pegel-Wandler 3/5V zw. PIC und Modul GY-302 
eingebaut und es läuft alles mit anderem PIC.

Das komplette Programm habe ich zuerst für PIC16F1512 (28-Pin-Gehäuse) 
geschrieben und getestet und da funktioniert alles. Jetzt will ich das 
mit PIC16F1704 betreiben, weil seine 14 Pins reichen, er hat I2C 
(MSSP-Modul) und ist kostengünstig. Ich würde auch später gerne diesen 
Controller für andere Projekte nehmen. Mit I2C von PIC16F1704 stoße ich 
abber auf Probleme, und ich vermute wegen falscher Initialisierung 
(Einstellung) von
I2C-Modul. Der PIC16F1704 hat mehr Register zum Initialisieren von I2C 
und allgemein etwas mehr an Perepherie als PIC16F1512. Mit jetzigen 
Einstellungen kann ich Adresse und Daten an GY-302-Modul anscheinend 
fehlerfrei senden, das Auslesen liefert aber 0-Wert (16-Bit-Wert).

Ich suche länger nach Fehler und finde nichts. Beispiele im Netz zu 
PIC16F1704 und seinem MSSP auch nicht gefunden. Habe wohl etwas 
übersehen. Muss man vielleicht andere Perepherie-Elemente extra 
abschalten? Also SMBus ist aus. Das ist von I2C abgeleitete Bus mit 
anderen Pegeln und langsamen ist er auch (10...100KHz). Ich habe aus 
Programm-Dateien wegen besseren Übersicht viel raus gekürzt, sodass 
möglichst nur I2C-Funktionen und deren Aufrufe im Hauptprogramm zu sehen 
geblieben sind. Ich hoffe das reicht so fürs Übersicht. Eigentlich kommt 
nur die erste Funktion "InitI2C()" (I2C-

Initialisierung) aus der Datei "i2c.c" in Frage. Sie ist für die 
Einstellungen von I2C-Bus (hier Master-Mode) verantwortlich. Können Sie 
mir dabei helfen Fehler zu finden?
Angehängte Dateien:
OP #6337516
Lesenswert?
• ▲
▼
Danke Leute;
Hat sich erledigt! Hab selbst Übel gefunden.
Es waren an PORTC außer Datenleitungen von LC-Display angeschlossen. 
Beim Auslesen von Display wurde Interruptflag von I2C gesetzt. Stand 
klein im Datenblatt von PIC, dass mit Peripherie verbundene Pins nicht 
als Ausgang benutzt werden können zwar, können aber immer als Eingang 
ausgelesen werden.
Ich habe I2C-Funktionen so umgeschrieben, dass SSP1IF unmittelbar vor 
Aktionsbefehl auf '0' gesetzt wird. Dann hat alles wie gewünscht 
funktioniert.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.