I2C zwischen atmega644 u PCA9555N

Gast #1009117
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.
Gast #1009140
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...)
Gast #1009210
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.
Persönliche Seite #1009263
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
Gast #1009281
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();
Persönliche Seite #1009332
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
Gast #1009469
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!)
Persönliche Seite #1009550
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
Gast #1009597
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.
Persönliche Seite #1009706
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
Gast #1010240
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
Persönliche Seite #1010715
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren