PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : I2C-Bus übertragung!



14.12.2005, 12:44
Habe ein sehr großes problem!
ich muss von meinem master aus eingeben können: adresse, anzahl der folgenden daten, und die daten

dies sollte ich an die slaves schicken können und auch wieder empfangen können...

hat das schon wer programmiert???

bitte um schnelle hilfe! julia

stubborn
14.12.2005, 12:51
ach ja es handelt sich um einen pic16f877

stegr
14.12.2005, 15:42
Programmierst du in C oder Assembler?
I2C-Befehlssatz findest du in der Wiki (brauchst nur auf das I2C hier klicken).
Beim PIC musst du nur wenige Register konfigurieren, denn der hat Hardware-I2C-Unterstützung, die auch recht gut im Datenblatt erklärt ist.

stubborn
14.12.2005, 16:49
kann mir denn keiner helfen???? ist wirklich wichtig... bitte!!

stegr
14.12.2005, 16:56
ähm - Ich kann dir nur helfen, wenn du ein paar mehr Infos gibst, z.B. in welcher Sprache du programmierst oder ob du dich mit I2C selber auskennst und nur wissen willst, wie man das dem PIC beibringt, oder bei welcher Taktfrequenz du schaffen willst...

Ich mein, ich helf dir gerne, aber dazu musst du mitarbeiten ;)

mfG
Stefan

stubborn
15.12.2005, 15:11
programmiere in c
mit i2c kenn ich mich nicht aus!
müsste ein prog schreiben, bei dem ich angeben kann, welchen slave ich ansprechen möchte, also zb. 0x02 dann die anzahl der daten zb 5 und dann die daten
also: 0x025ABCD
slave und master sollten dadurch kommunizieren können.
19200 baud

lion1984
15.12.2005, 16:40
Hiho,

also hier is mal eine seite, wo es um PIC und I2C geht:
http://www.fernando-heitor.de/picforum/viewtopic.php?t=1583&highlight=i2c

Weiteres benütze ich folgenden Code:

void init_i2c()
{
output_float(I2C_SCL);
output_float(I2C_SDA);
}

//Schreiben von einem Byte über I2C
void write_i2c(Byte address, BYTE data, int c_nr)
{
short int status;

i2c_start(); //Belegen des Buses
i2c_write(0xfe & c_nr); //schreiben der Deviceadresse
i2c_write(address); //Datenadresse
i2c_write(data); //1 Byte Daten
i2c_stop(); //Busfreigabe

//Warten bis die Daten verarbeitet und Gerät wieder bereit
i2c_start();
status=i2c_write(c_nr);
//Statusabfrage, 0-Gerät reagiert, 1-Gerät reagiert nicht
while(status==1) //Warten bis es reagiert
{
i2c_start();
status=i2c_write(0xa0 | c_nr);
}
i2c_stop();
}

BYTE read_i2c(Byte address, int c_nr) //Lesen eines Bytes
{
BYTE data;

i2c_start(); //Belegen des Buses
i2c_write(0xfe & c_nr); //schreiben der Deviceadresse
i2c_write(address); //Datenadresse

i2c_start(); //Restarten des Buses
i2c_write(0xa1 | c_nr); //1 steht für Lesezugriff
data=i2c_read(0); //1 Byte lesen
i2c_stop(); //Freigeben des Buses

return(data);
}


Damit habe ich erfolgreich auf ein I2C EEprom gespeichert, also funkt es mal, dass ein PIC antwortete, an dem spiele ich mich auch gerade.
Weiteres bastle ich an einer funktion, wo man mehrere Daten lesen/schreiben kann, aber die funktionieren nicht.

hoffe es hat dir geholfen

stegr
15.12.2005, 16:51
Ansonsten wirst du wohl bei (fast allen) C-Compilern schon fertige Bibliotheken finden, mit denen du I2C ansteuern kannst... ;)

Was ich dir empfehlen würde: Klick mal auf das I2C - da findest du einiges an Infos - denn es bringt dir nix, wenn du irgendwas übernimmst, aber nicht weisst, warum und wie es funktioniert.

MfG
Stefan

lion1984
15.12.2005, 18:43
Hiho,

ja, soll mal denkanstoss sein :D
ausserdem besitzt auch jeder Compiler beispiele, ich denke, dass jeder ein I2C Beispiel zur verfügung stellt.

wenn wir dabei sind :D ich verwende CCS Compiler, und möchte gerne einen text z.B. "Hallo" auf ein I2C EEPROM speichern, lesen klappt fehlerfrei, aber beim senden werde ich es schrittweiße machen, aber wie bekomme ich zB Das 'H' von 'Hallo' in den HEX Code gewandelt? hab schon gesucht, aber leider nur i-net rechner gefunden :(

insanity
28.12.2005, 10:28
Gott zum gruße :cheesy:

Die buchstaben im string werden sowieso im ascii format abgelegt, also musst du nur eine for-schleife ablaufen lassen und die einzelnen werte des char arrays seriell ans eeprom senden

lion1984
28.12.2005, 11:20
Auch dich grüße ich mein knabe :)

thx für die antwort, aber dass habe ich schon herausgefunden :)
keine ahnung wo mein fehler lag, aber bei meiner ersten Methode hat er eben nicht das ASCII Format geschickt, aber jetzt klappt es schon einwand frei :) nochmals danke für die Hilfe.

Aber even. kannst du mir (oder jeder anderer, hier ist jeder eingeladen :) bei folgenden Problem helfen.

Ich verwende den CCS Compiler für den PIC, verwende einen PIC16F877 mit 4 Mhz. Ziel ist es, den PIC im Slave Modus zu betreiben.
Ich möchte gerne die vorgegebenen Routinen verwenden, funkt eigentlich ganz gut, also der PIC reagiert, aber vom Master wird folgedes geschickt:

- Chipnummer
- Adresse der Daten
- Daten

wenn die Chipnummer die richtige ist, wird ein Interrupt generiert, nur mein Problem ist jetzt, wie werte ich die folgenden Daten aus? also R/W, Adresse, Daten usw. even arbeitet hier auch jmd mit dem CCS.

Einen Code kkann ich euch gerne geben, aber er wird nicht helfen, da das Hauptprogramm in einer Endlossschleife steckt und bei Interrupt nur ein i2c_write ausgeführt wird, mehr ist es zur zeit leider nicht :(