Forum: Mikrocontroller und Digitale Elektronik I2C-Bus mit MCC programmieren um einen Display anzusteuern


von Niklas Koch (Gast)


Lesenswert?

Hallo, Ich muss für meine Abschlussarbeit einen Display mit einem 
I2C-Bus ansteuern. Dazu verwende ich einen PIC16F1827 von der Firma 
Microchip. Ich programmiere im MCC und scheitere daran etwas am Display 
auszugeben bzw. den I2C-Bus erstmals anzusprechen. Auch durch viel 
Recherche konnte ich keine Lösung finden. Meine Frage ist, ob jemand 
weiß wie ich z.B. ein A auf meinem Display ausgebe.

void I2C1_Write1ByteRegister(i2c1_address_t address, uint8_t reg, 
uint8_t data)
{
    while(!I2C1_Open(address)); // sit here until we get the bus..
    I2C1_SetDataCompleteCallback(wr1RegCompleteHandler,&data);
    I2C1_SetBuffer(&reg,1);
    I2C1_SetAddressNackCallback(NULL,NULL); //NACK polling?
    I2C1_MasterWrite();
    while(I2C1_BUSY == I2C1_Close()); // sit here until finished.
}

Ich habe dieses vorgefertigte Teilprogramm gefunden, weiß aber nicht wie 
ich damit umgehe bzw. ob es das richtige für mich ist. Bin ein 
ziemlicher Anfänger, wenn es um programmieren geht. Darum würde ich mich 
über jedes Kommentar freuen, welches mich etwas weiterbringt.

Danke!

von Ralph S. (jjflash)


Lesenswert?

Oooooh je !

Dieses Code-Snippet das du hier gepostet hat, stellt mit seiner 
Deklaration eine Funktion zur Verfügung, die ein Register im I2C Slave 
beschreiben kann.

Diese Funktion geht davon aus, dass der I2C Bus des Controllers schon 
initialisiert ist und betriebsbereit ist.

Die Funktion eines I2C Busses kannst du unter:

https://de.wikipedia.org/wiki/i2c

nachlesen.

Auf einem I2C Bus können mehrere Geräte (Devices) mit nur 2 Leitungen 
angesprochen werden. Damit sich die Devices nicht gegenseitig ins Gehege 
kommen, besitzt jedes Device eine Adresse.

Eine Kommunikation zu einem I2C Slave kommt dadurch zustande, dass auf 
dem Bus eine Start-Condition hergestellt wird, danach erfolgt die 
Geräteadresse des Devices das angesprochen werden soll mit dem 
niederwertigsten Bit des ersten gesendeten Bytes wird bestimmt, ob auf 
dieses Gerät geschrieben oder gelesen werden soll (bei deiner obigen 
Funktion wird geschrieben).

Grob gesagt stellt deine Funktion eine Verbindung zu deinem Slave (bei 
dir willst du dort ein I2C Display haben) mit angegebener Deviceadresse 
her und schreibst genau ein einzelnes unsigned char (byte).

Kurz gesagt bist du damit in der Lage mit einem I2C-Display zu 
kommunizieren.

Viele Devices (im besonderen Displays) besitzen mehrere Register (Device 
eigene Speicherplätze) die unterschiedliche Bedeutung haben können 
(vllt. hat dein Display eine Helligkeitssteuerung, auf jeden Fall hat es 
ein Kommandoregister (um bspw. invertierte Darstellung zu generieren) 
oder auch ein Register, welches die Displayadresse setzt an die ein Wert 
geschrieben werden soll.

Damit also auf einem Display auch nur irgendetwas geschieht (und sei es 
nur ein verrauschte Darstellung) sind zuvor viele Datentransfers 
notwendig und du mußt erst das Display mit den vom Display benötigten 
Daten füttern.

Displays haben in aller Regel eigene Displaycontroller, die ihrerseits 
wieder das TFT-LCD steuern und jeder Controller funktioniert anderst.

D. h. du mußt genau wissen WAS für ein Display du hast und welcher im 
Controller verbauten Display vorhanden ist.

Hast du ein graphikfähiges Display, kannst du bspw. keinen Buchstaben 
darauf setzen, sondern dein Programm benötigt ein Array mit einem 
Zeichensatz, der die Bitmaps für jeden einzelnen Buchstaben enthält.

Zu deinem Unglück sind Beispielsprogramme für deinen Controller nicht so 
arg viele vorhanden und (deswegen kann man dir hier fast nicht helfen) 
du machst keine Angaben über das Display, das du ansteuern möchtest.

Wenn du, was ich annehme, ein so großer Anfänger bist, kann I2C schon 
eine Herausforderung sein und du solltest erst einmal grundsätzlich den 
Umgang mit diesem Bus an einem sehr einfachen I2C Baustein wie bpsw. 
PCF8574 lernen. Dieser I2C Baustein verfügt, wenn man in schreibend 
betreibt über ein einziges Register das mit deiner obigen Funktion 
beschrieben werden kann. Schreibst du in dieses Register einen Bytewert 
hinein kannst du bspw. mittels 8 LED's die einzelnen Bits dieses Bytes 
sehen.

Wenn das geklappt hat, kannst du sicher sein, dass dein Bus funktioniert 
und du kannst dich daran machen, dich um das Display zu kümmern.

von au weia (Gast)


Lesenswert?

Niklas Koch schrieb:
> Ich muss für meine Abschlussarbeit einen Display mit einem
> I2C-Bus ansteuern.

Aber:

Niklas Koch schrieb:
> Bin ein ziemlicher Anfänger, wenn es um programmieren geht.

Dann hast du wohl das Falsche gelernt, bist im falschen Film
oder dein Ausbilder kennt dich nicht und überfordert dich total.

Niklas Koch schrieb:
> einen Display

Es heisst übrigens:
ein Display, also das Display, nicht der Display.

von Olaf (Gast)


Lesenswert?

> Auch durch viel Recherche konnte ich keine Lösung finden.

Lies das Datenblatt deines COntrollers und programmiere es. Klauen im 
Internet ist nicht das Ziel von Abschlussarbeiten. Ansonsten hoffe ich 
naemlich das du durchfaellst weil niemanden spaeter einen Typen als 
Arbeitskollegen haben will dessen Faehigkeiten aus kopieren im Internet 
bestehen.

Olaf

von Julian (Gast)


Lesenswert?

Olaf schrieb:
> Auch durch viel Recherche konnte ich keine Lösung finden.
>
> Lies das Datenblatt deines COntrollers und programmiere es. Klauen im
> Internet ist nicht das Ziel von Abschlussarbeiten. Ansonsten hoffe ich
> naemlich das du durchfaellst weil niemanden spaeter einen Typen als
> Arbeitskollegen haben will dessen Faehigkeiten aus kopieren im Internet
> bestehen.
>
> Olaf

Olaf, Ich glaube nicht, dass man jemanden mit solchen Kommentaren hilft. 
Tipp: Erspar dir solche Bemerkungen und versuche zu helfen. Danke!

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.