Forum: Mikrocontroller und Digitale Elektronik I2C zwischen atmega644 u PCA9555N


von I2Canfänger (Gast)


Lesenswert?

Hallo leute,

Bräuchte bischen hilfe. wie schon im betreff steht will ich zwischen 
einem atmega644 u PCA9555N über i2c verbinden, ich habe mir die 
libraries von peter fleury angeschaut und eingebaut. an dem PCA9555 hab 
ich eine led und einen taster angeschlosen und wollt durch das auslösen 
des tasters die led zum leuchten bringen. habe das so gemacht weil die 
ports am atmega schon besetzt sind bzw verplannt für was anderes. 
deswegen will ich meine tasten und leds an den pca anschliessen und über 
i2c bus steuern.

von Mario (Gast)


Lesenswert?

und wo ist problem?

von I2Canfänger (Gast)


Lesenswert?

Mein problem liegt in der programmierung. muss ich dafür EEProm 
beschreiben? bzw muss ich ihm mitteilen wer slave und wer master ist? 
und wenn ja wie mach ich das.

von Mario (Gast)


Lesenswert?

der pca9555 ist immer slave.
dem atmega644 mußt du sagen das er master ist.
eeprom mußt du nicht beschreiben.

- von peter fleury mußt du die twimaster.c und die i2cmaster.h einbinden
- schau dir die test_i2cmaster.c an.
- dananch das datenblatt vom pca9555, dort ist beschrieben wie das teil
  angesteuert ist.
- mach dich auch mit den grundlagen der i2c-kommunikation vertraut 
(start
  condition, stop condition etc...)
- benutze google...

schau mal hier:
http://www.timmermann.org/ralph/index.htm?http://www.ralph.timmermann.org/elektronik/i2c.htm

(gegoogelt...)

von I2Canfänger (Gast)


Lesenswert?

ok danke dir erstmal. das problem ist das beispiel von fleury versteh 
ich nicht ganz.

von Mario (Gast)


Lesenswert?

nun gut, dann hake dich nicht so sehr an dem beispiel fest.

schau dir mal das online-manual zur library von peter fleury an, da ist 
ein sehr viel einfacheres beispiel für schreiben und lesen vom device 
drin. ich bin mir fast sicher das du das fast 1:1 verwenden kannst.

von I2Canfänger (Gast)


Lesenswert?

wo finde ich dieses online manual zur library von peter fleury? ist es 
hier im forum zu finden? oder über google?

von Mario (Gast)


Lesenswert?

nein, du findest es unter http://jump.to/fleury ->libraries -> I2C 
Master Interface -> Online manual

von I2Canfänger (Gast)


Lesenswert?

aber er benutzt in seinem beispiel die adresse vom EEPROM kann ich das 
dann einfach so ignorieren? bzw rausnehmen?

von Uwe B. (boerge) Benutzerseite


Lesenswert?

beschäftige dich doch bitte erstmal mit den I2C-Grundlagen (obiger Link 
ist da schon mal ganz hilfreich) und dann kannst du dir die Frage auch 
selbst beantworten!

von I2Canfänger (Gast)


Lesenswert?

ich hab es mir durchgelesen und mich beschäftigt. ich frag ja weil ich 
es nicht ganz versteh was EEPROM damit zu tun hat bzw wieso er da die 
adresse von EEPROM benutzt. ich weiss das man dem master mitteilen muss 
und eine addresse zuweisen muss damit er bescheid weis. mach ich das 
wohl über EEPROM?

von Mario (Gast)


Lesenswert?

Das ist nur ein Beispiel mit dem EEPROM! In Online Manual ist das Slave 
Device ein EEPROM (ja, es gibt auch I2C-EEPROMs). Du hast natürlich kein 
EEPROM, sondern dein PCA9555. Natürlich mußt du die Basisadresse 
anpassen (siehe Datenblatt PCA9555). Evtl. mußt du auch de 
Kommunikationszyklus anpassen, ist von Bauteil zu Bauteil manchmal etwas 
verschieden (steht alles im Datenblatt). Und nicht die Pull-Ups 
vergessen.

So schwierig ist das doch nicht! Die Library von Peter Fleury erledigt 
doch schon fast alles. Schau dir erst mal die Grundlagen von I2C an.

von I2Canfänger (Gast)


Lesenswert?

hab mir die grundlagen schon angeschaut.

von Uwe B. (boerge) Benutzerseite


Lesenswert?

Dann schaue dir das Datenblatt des PCA9555 (z.B. 
http://www.elab-pascal.de/downloads/DOCs/PCA9555.pdf) an, Auf Seite 6 
und folgende steht, wie das I2C-Protokoll für diesen Chip auszusehen 
hat. Alles weitere ist von deinem Anwendungsfall abhängig und sollte mit 
den angelesenen I2C-Grundlagen verständlich sein. Mehr können wir dir 
eigentlich nun nicht mehr helfen, oder?

Uwe

von I2Canfänger (Gast)


Lesenswert?

Also ich hab mir was zusammengebastelt aber irgendwie funktioniert es 
nicht.

#define dev_addr  0x40

 int main(void)
 {
     unsigned char ret;

     i2c_init();                             // initialize I2C library


     i2c_start_wait(dev_addr+I2C_WRITE);
     i2c_write(0x02);
   i2c_readAck();
   i2c_write(0xff);
   i2c_readAck();
   i2c_write(0xff);
   i2c_readAck();
   i2c_stop();


     i2c_start_wait(dev_addr+I2C_WRITE);
     i2c_write(0x02);
     i2c_readAck();
     i2c_rep_start(dev_addr+I2C_READ);
   i2c_write(0x01);
   i2c_readAck();
   i2c_write(0xff);
   i2c_readAck();
   i2c_write(0xff);
   i2c_readNak();
     ret = i2c_readNak();
     i2c_stop();

von I2Canfänger (Gast)


Lesenswert?

hab mich ans datenblatt und die darin erhaltenden diagramme zum 
schreiben und lesen gehalten

von I2Canfänger (Gast)


Lesenswert?

ach und noch eine frage hätte ich: funktioniert es wenn ich die 
Adressierung also die PINS A0 A1 und A2 auf masse ziehe? oder ist das 
falsch?

von Uwe B. (boerge) Benutzerseite


Lesenswert?

I2Canfänger wrote:
> ach und noch eine frage hätte ich: funktioniert es wenn ich die
> Adressierung also die PINS A0 A1 und A2 auf masse ziehe? oder ist das
> falsch?
>
ja reicht, dann lautet die Adresse 0x40

von I2Canfänger (Gast)


Lesenswert?

ja das ist mir klar das die addresse 0x40 lautet, ist was am 
programmcode falsch?

von Uwe B. (boerge) Benutzerseite


Lesenswert?

Vielleicht solltest du schrittweise vorgehen, um zu verstehen, was 
passiert...

Zum ersten Codeblock in main():

>      i2c_start_wait(dev_addr+I2C_WRITE);
>      i2c_write(0x02);
>    i2c_readAck();
>    i2c_write(0xff);
>    i2c_readAck();
>    i2c_write(0xff);
>    i2c_readAck();
>    i2c_stop();
>
du willst alle Bits beider Ports des PCA9555 auf Hight setzen? Dann 
sieht es ja schon mal gut aus, wenn du die Reads rausnimmst. Probiere 
das doch mal.

Den 2.Teil in main() verstehe ich nicht ganz. Was willst du da machen?

Uwe

von I2Canfänger (Gast)


Lesenswert?

na man muss doch es auch rauslesen oder nicht? und dafür ist der 2. 
block da

von Uwe B. (boerge) Benutzerseite


Lesenswert?

probiere doch erstmal die Ausgabe auf den Ports und prüfe ob die Bits 
gesetzt werden...

Uwe

von I2Canfänger (Gast)


Lesenswert?

so das empfängt er, kann ich dann einfach in die for schleife 
reinschreiben das da ne led dranhängt und er die anmachen soll?

von Uwe B. (boerge) Benutzerseite


Lesenswert?

I2Canfänger wrote:
> so das empfängt er, kann ich dann einfach in die for schleife
> reinschreiben das da ne led dranhängt und er die anmachen soll?
>
???

wie meinst du das?

von I2Canfänger (Gast)


Lesenswert?

na ich hab an die pins einen taster und eine led angeschlosen vom pca. 
so wie bringe ich die led jetzt zum leuchten? muss ich dann das byte 
noch irgendwie aus dem register rauslesen oder nicht?

von Mario (Gast)


Lesenswert?

Mach dich generell erstmal vertraut mit µC-Programmierung. Deine Fragen 
deuten daraufg hin das du im Urschleim anfängst.

Der PCA9555 wird über bestimmte (Sub-)Adressen konfiguriert. Dabei wird 
festgelegt welche Pins am PCA9555 als Ausgang oder Eingang geschalten 
werden. Dementsprechend kannst du die Ausgänge wieder über bestimmte 
(Sub-)Adressen setzen bzw. die Eingänge am PCA9555 abfragen. Steht alles 
glasklar im Datenblatt.

Was daran nicht zu verstehen ist weiß ich nicht. Ich bin davon 
ausgegangen, das du schon ein wenig Erfahrung mit µCs hast. Wenn nicht, 
lass die I2C-Kommunikation erstmal bleiben und häng die Taster/LEDs 
direkt an den µC (max. Stromstärke beachten!)

von I2Canfänger (Gast)


Lesenswert?

ich hab bischen erfahrung mit µc und ich hab deswegen als namen 
hingeschrieben das ich ein i2canfänger bin. ich hab aber keine freien 
pins am µc weil die für was anderes vorgesehen sind.
ausserdem bin ich leider nicht so gut in englisch, und such deswegen 
hier hilfe.

von Uwe B. (boerge) Benutzerseite


Lesenswert?

I2Canfänger wrote:
> na ich hab an die pins einen taster und eine led angeschlosen vom pca.
> so wie bringe ich die led jetzt zum leuchten?
>
na die sollte jetzt schon leuchten, wenn die obigen ersten Zeilen 
funktionieren und die LED an Port0 hängt...

> muss ich dann das byte
> noch irgendwie aus dem register rauslesen oder nicht?
>
überdenke mal deinen Programmablauf. Der PCA9555 hat einen 
Interrupt-Ausgang, der immer dann schaltet, wenn an einem Port, welches 
als Eingang konfiguriert wurde, eine Pegeländerung erfolgt.

Also INT-Pin des PCA9555 an einen interruptfähigen Pin des Atmel hängen. 
Wenn der externe Interrupt ausgelöst wird, Schaltzustände des 
entsprechenden Ports via I2C abfragen und entsprechend reagieren...

Uwe

von I2Canfänger (Gast)


Lesenswert?

der interupt von dem pca ist schon mit dem von atmel verbunden.

die led leuchtet noch nicht. hilfe bin am verzweifeln

von Uwe B. (boerge) Benutzerseite


Lesenswert?

I2Canfänger wrote:
> der interupt von dem pca ist schon mit dem von atmel verbunden.
>
Schaltung?

> die led leuchtet noch nicht. hilfe bin am verzweifeln
>
Code (vollständig!)?

von I2Canfänger (Gast)


Lesenswert?

habe das avrstk 500 board und an den PORTC vom atmel hab ich den pca 
angeschlossen an die entsprechenden pins und an den pin 18 von pca hab 
ich meine led angeschlossen.

code:

include <avr/io.h>
#include "i2cmaster.h"
#include <stdint.h>
#include <stdlib.h>



#define dev_addr  0x40

 int main(void)
 {
     //unsigned char ret;


     i2c_init();

     i2c_start_wait(dev_addr+I2C_WRITE);
            i2c_write(0x01);
   i2c_write(0x00);
   i2c_write(0x20);
   i2c_stop();

     for(;;);
 }

wenn du sagst dadurch müsste die led leuchten dann ist er schon 
vollständig, die library ist auch eingebunden.

von Mario (Gast)


Lesenswert?

ist die richtige Taktfrequenz eingestellt (wichtig für I2C library)?
Led richtig rum gepolt?

Poste mal den schaltplan (natürlich nur den I2C-Teil) bzw. wie die die 
LEDs und die Taster angeschlossen hast (an PortC).

von Uwe B. (boerge) Benutzerseite


Lesenswert?

Mario wrote:
> ist die richtige Taktfrequenz eingestellt (wichtig für I2C library)?
> Led richtig rum gepolt?
>
> Poste mal den schaltplan (natürlich nur den I2C-Teil) bzw. wie die die
> LEDs und die Taster angeschlossen hast (an PortC).
>
wollte ich auch gerade hinterfragen...

Uwe

von I2Canfänger (Gast)


Lesenswert?

hab keinen schaltplan dafür habs auf einer extra kleinen platine selber 
zamgelötet, kurzschlüsse gibts nicht hab schon überprüft.
ok schau mir dann mal die frequenz und so an bin mal gespannt.

von Mario (Gast)


Lesenswert?

wie hast du die dioden angeschlossen? high side? low side? 
vorwiderstand?

von I2Canfänger (Gast)


Lesenswert?

es ist nur eine led aber mit zwei farben, jeweils mit einem widerstand 
davor. und müssten highside angeschlosen sein

von Uwe B. (boerge) Benutzerseite


Lesenswert?

Also nochmal der Versuch deine LED an Pin 18 zum leuchten zu bringen...
1
i2c_init();
2
i2c_start_wait(dev_addr+I2C_WRITE);
3
i2c_write(0x02); // Konfiguration, dass zuerst Port 0 geschrieben wird
4
i2c_write(0x00); // Daten für Port 0 schreiben
5
i2c_write(0x20); // Daten für Port 1 und da das 5 Bit schreiben
6
i2c_stop();

Voraussetzungen, dass dies funktioniert sind:

-Taktfrequenz richtig eingestellt (im Makefile oder irgendwo in den 
Libs)
-LED richtig angeschlossen (hier muss sie High-Aktiv geschaltet werden, 
also gegen Masse, mit Vorwiderstand und korrekt gepolt)
-SDA und SCL des I2C-Bus sollten jeweils einen Widerstand von ca. 10k 
gegen Vcc haben, sonst passiert auch nichts über den Bus

Wenn dies alles stimmt sollte obiges (ungetestetes) Bsp. eigentlich die 
LED an Pin 18 des PCA zum leuchen bringen. Und eher brauchst du auch 
nicht weiter experimentieren, weil du sonst einen prinzipiellen Fehler 
hast!

Uwe

von I2Canfänger (Gast)


Lesenswert?

ok dann ist der pull up widerstand zu klein gewällt. muss dann den 
auswechseln. der ist bei mir bei 4,8k. und schau dann mal nach der 
frequenz. danke erstmal. fals ich das nicht hinbekomme dann meld ich 
mich nochmal.

von I2Canfänger (Gast)


Lesenswert?

also LED ist auf high aktiv angeschlossen. die Frequenz ist auch richtig 
eingestellt:

*#ifndef F_CPU
#define F_CPU 20000000UL //frequenz vom quarz.
#endif

/* I2C clock in Hz */
#define SCL_CLOCK  100000L


und die pull up widerstände sind auch richtig verbaut.
aber die LED leuchtet trotzdem nicht, hab auch schon bits vertauscht und 
an der frequenz auch schon rumgedreht aber nichts funktioniert

von Uwe B. (boerge) Benutzerseite


Lesenswert?

MoinMoin,

LED high aktiv angeschlossen heisst bei dir auch Pin -> Anode -> Kathode 
-> Vorwiderstand (ca. 220R) -> Masse?

Richtige MCU steht auch in den Makefiles drin (Standard im Makefile von 
i2cmaster ist at90s8515...)?

In i2cmaster.S hast du auch die richten Ports/Pins für SDA und SCL des 
Mega644 angegeben?

Das wäre es noch, was mir jetzt einfällt. Ansonsten wäre jetzt dann doch 
mal ein Schaltplan ganz sinnvoll...

Grüße Uwe

von Mario (Gast)


Lesenswert?

er nimmt doch die "i2cmaster.c" und nutzt den hardware i2c port, denke 
ich?

von Uwe B. (boerge) Benutzerseite


Lesenswert?

... wenn ich den Quelltext richtig verstehe (habe gerade nochmal 
nachgeschaut), muss er es wohl schon anpassen, oder?

Uwe

von I2Canfänger (Gast)


Lesenswert?

hab das problem schon gelösst..es lag nicht an der hardware sondern an 
der software. ich habe vergessen die pins davor zu konfigurieren, welche 
als input bzw output benuzt werden sollen

von Mario (Gast)


Lesenswert?

ne endlich...

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.