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...)
ok danke dir erstmal. das problem ist das beispiel von fleury versteh ich nicht ganz.
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.
wo finde ich dieses online manual zur library von peter fleury? ist es hier im forum zu finden? oder über google?
nein, du findest es unter http://jump.to/fleury ->libraries -> I2C Master Interface -> Online manual
aber er benutzt in seinem beispiel die adresse vom EEPROM kann ich das dann einfach so ignorieren? bzw rausnehmen?
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
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();
hab mich ans datenblatt und die darin erhaltenden diagramme zum schreiben und lesen gehalten
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?
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
ja das ist mir klar das die addresse 0x40 lautet, ist was am programmcode falsch?
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
na man muss doch es auch rauslesen oder nicht? und dafür ist der 2. block da
probiere doch erstmal die Ausgabe auf den Ports und prüfe ob die Bits gesetzt werden... Uwe
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?
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
der interupt von dem pca ist schon mit dem von atmel verbunden. die led leuchtet noch nicht. hilfe bin am verzweifeln
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.
wie hast du die dioden angeschlossen? high side? low side? vorwiderstand?
es ist nur eine led aber mit zwei farben, jeweils mit einem widerstand davor. und müssten highside angeschlosen sein
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
er nimmt doch die "i2cmaster.c" und nutzt den hardware i2c port, denke ich?
... wenn ich den Quelltext richtig verstehe (habe gerade nochmal nachgeschaut), muss er es wohl schon anpassen, oder? 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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.