Forum: Mikrocontroller und Digitale Elektronik I2C Initialisierung (Master) PIC16F1704


von Johann R. (iwan)


Angehängte Dateien:

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?

von Johann R. (iwan)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.