mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik I2C zwischen atmega644 u PCA9555N


Autor: I2Canfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mario (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und wo ist problem?

Autor: I2Canfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mario (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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://w...

(gegoogelt...)

Autor: I2Canfänger (Gast)
Datum:

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

Autor: Mario (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: I2Canfänger (Gast)
Datum:

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

Autor: Mario (Gast)
Datum:

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

Autor: I2Canfänger (Gast)
Datum:

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

Autor: Uwe Berger (boerge) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: I2Canfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Mario (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: I2Canfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hab mir die grundlagen schon angeschaut.

Autor: Uwe Berger (boerge) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: I2Canfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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();

Autor: I2Canfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hab mich ans datenblatt und die darin erhaltenden diagramme zum 
schreiben und lesen gehalten

Autor: I2Canfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Uwe Berger (boerge) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: I2Canfänger (Gast)
Datum:

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

Autor: Uwe Berger (boerge) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: I2Canfänger (Gast)
Datum:

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

Autor: Uwe Berger (boerge) Benutzerseite
Datum:

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

Uwe

Autor: I2Canfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Uwe Berger (boerge) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: I2Canfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Mario (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!)

Autor: I2Canfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Uwe Berger (boerge) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: I2Canfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
der interupt von dem pca ist schon mit dem von atmel verbunden.

die led leuchtet noch nicht. hilfe bin am verzweifeln

Autor: Uwe Berger (boerge) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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!)?

Autor: I2Canfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mario (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Uwe Berger (boerge) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: I2Canfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mario (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wie hast du die dioden angeschlossen? high side? low side? 
vorwiderstand?

Autor: I2Canfänger (Gast)
Datum:

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

Autor: Uwe Berger (boerge) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also nochmal der Versuch deine LED an Pin 18 zum leuchten zu bringen...
i2c_init();
i2c_start_wait(dev_addr+I2C_WRITE);
i2c_write(0x02); // Konfiguration, dass zuerst Port 0 geschrieben wird
i2c_write(0x00); // Daten für Port 0 schreiben
i2c_write(0x20); // Daten für Port 1 und da das 5 Bit schreiben
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

Autor: I2Canfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: I2Canfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Uwe Berger (boerge) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mario (Gast)
Datum:

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

Autor: Uwe Berger (boerge) Benutzerseite
Datum:

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

Uwe

Autor: I2Canfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mario (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ne endlich...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.