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.
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.
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...)
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.
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!
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?
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.
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
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
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
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?
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?
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!)
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.
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
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!)?
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.
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).
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
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.
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
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.
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
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
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