PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : I2C Bus mit PIC18F252 Konfiguration



Adonai
01.12.2006, 15:45
Hallo

Ich möchte mich gerne mit dem I2C-Bus vertraut machen.
Als erstes möchte ich zwischen 2 PICs (PIC18F252) eine Kommunikation aufbauen. Dabei soll am ersten PIC (Master) 8 Schalter eingelesen werden und diese Daten dann via I2C zum zweiten PIC (Slave) geschickt werden. Dort soll das ganze mittels 8 LEDs ausgegeben werden.

Ich kenne mich mittelmässig gut mit den PICs aus und kenne auch den C-Syntax einigermassen. Ich habe allerdings noch nie mit I2C gearbeitet.
Deshalb habe ich mich im Internet etwas schlau gemacht. Ich weiss also in den Grundzügen wie der I2C-Bus funktioniert.
Nur leider habe ich keine Ahnung wie ich das alles beim PIC18F252 konfigurieren muss. Aus dem Datenblatt werde ich nicht recht schlau und hier habe ich auch nichts hilfreiches gefunden.

Kann mir jemand sagen (oder einen Beispiel-Code liefern) wie ich das alles konfiguriere? Wie sieht ein "Grundprogramm" für I2C aus (mit C, kompatibel für PIC18F252)?
Wie kann ich meine oben beschriebene Aufgabe lösen?


Einige Zusatzinformationen:
-PIC: PIC18F252
-Brenner: Picstart Plus
-Editor und Compiler: MPLab


Mit freundlichen Grüssen

Adonai

Adonai
04.12.2006, 10:05
Weiss denn das niemand?
I2C sollte doch ein Begriff sein, wenn man Roboter baut.

BlinkyBill
04.12.2006, 11:53
sorry, die Glaskugel ist bei der Reparatur...

Welchen C-Compiler ?

was funktioniert schon ?

was hast du bisher gezaubert ?

... fragen über fragen

Adonai
04.12.2006, 12:41
C-Compiler: MCC18
-Was bisher funktioniert: Wie soll etwas funktionieren, wenn ich bereits bei der Initialisierung scheitere?
-Bisher habe ich viel über den I2C-Bus gelesen, scheitere aber, wie gesagt, an der Konfiguration.

BlinkyBill
04.12.2006, 12:49
Google: C18 I2C
2. Treffer: http://ww1.microchip.com/downloads/en/devicedoc/MPLAB_C18_Libraries_51297f.pdf

Seite 25 gehts los

1. Treffer dürfte ein Beispiel sein... Ich schau jetzt net rein, aber klingt interessant...

Adonai
04.12.2006, 13:12
Danke für die Antwort.

Zum 2. Treffer: Ich möchte den I2C-Bus versuchen zu verstehen, deshalb nutzt es mir nichts wenn ich das mit Libraries löse.

Zum 1. Treffer: PIC --> EEPROM, ich brauche aber PIC --> PIC

-------

Ich habe auf einer russischen (!) Seite diesen Code gefunden.
Leider sind die Kommentare unverständlich....
Was meint ihr dazu?
PS: Mache ich etwas falsch wenn ich SCL und SDA über 1.8kOhm an Speisung anschliesse?


#include <p18f252.h>

long int k;

void i2c_wait (void) //îæèäàíèå ôëàãà SSPIF ïîñëå áèòà àäðåñà è ïîñëå áèòà ñòîï
{
while(PIR1bits.SSPIF==1)
{
PIR1bits.SSPIF=0; //ñáðîñ ôëàãà
}
}


void i2c_start(void) //ñòàðò i2c áèò SEN ñòàâèì â 1 è ïåðåõîäèì â îæèäàíèå SSPIF
{
SSPCON2bits.SEN=1;
i2c_wait();
}


void main()
{
TRISB=0x00;
PORTC=0;
PORTB=0b00111000;
TRISC=0b00011000; // RC3 RC4 êàê âõîäû

SSPCON1= 0b00101000; // âêë ìîäóëü MSSP,âêë âåäóùèé ðåæèì
SSPADD=39; // ðàñ÷èòàí äëÿ ÷àñòîòû 100 êÃö

PORTCbits.RC6=1; //âûâîäèì LCD èç ñáðîñà


i2c_start(); //çàïóñê(ñòàðò) i2c
SSPBUF=0x78; //àäðåñ, êàê â äîêóìåíòàöèè 0õ78 èëè 0õ7À-ðåçóëüòàòà íåò
i2c_wait(); //æäåì ôëàã SSPIF ïîñëå ñòàðòà

//òóò ïèøó ïåðåäà÷ó êîìàíä è äàííûõ êàê ïîëîæåíî ñ êîíòðîëüíûìè áàéòàìè è îæèäàíèåì ôëàãà

SSPCON2bits.PEN=1; //ñòîï i2c
i2c_wait(); //îæèäàíèå SSPIF
}

BlinkyBill
04.12.2006, 14:52
ich möcht jetzt nicht unhöflich erscheinen, aber möchtest du verlangen, dass dir hier jemand alles vorkaut ?

Wenns dir wirklich ums verstehen des I2C geht, dann vergiss den C18, und hau dir das in Assembler rein.

Wenn du ein ergebnis willst, dann bastel dir aus den gegebenen Sachen selber was.

Wenn dich die "Libraries" stören, dann öffne die header und die .c einfach mal, und schau, was da drin ist. Schließlich stellen die dir nur die Funktionen zur Verfügung, mit denen du dann arbeitest.
Wenn du diese so einsetzen kannst, dass was übertragen wird, und daran was ändern kannst und hinterher auch weisst, was die Änderung bewirkt, dann bist deinem Ziel des Verstehens schon einen Schritt näher.

und der Ansatz PIC--> EEPROM sollte auch keine Fertige Lösung bieten, sondern etwas Arbeitsmaterial um dich damit zu befassen, und mal damit zu spielen, und vielleicht sogar mal was draus übernehmen zu können.
Stichwort: Transferwissen... Soll angeblich immer wichtiger werden ;)

So, und zu den comments muss ich dich leider enttäuschen, da ich a) weder russisch kann, noch b) jemals mit c18 gearbeitet habe *G*

Also mehr als das selbsterklärende kann ich leider net erzählen. Aber vielleicht hilft dir die Doku des compilers, die sich immerhin in einem der Links versteckt, um einfach mal selbst zu kommentieren und dann zu schauen, ob du verstehst, was da passiert.
Hat viel lerneffekt.

Du musst dir einfach im klaren werden, was du willst... Und lernen konkrete Fragen zu stellen statt nach mundgerechten Komplettlösungen zu verlangen.

Gruss

Adonai
04.12.2006, 15:25
ich möcht jetzt nicht unhöflich erscheinen, aber möchtest du verlangen, dass dir hier jemand alles vorkaut ?

Vorkauen? Was denn vorkauen? Ich habe lediglich nach einer Erklärung der Konfiguration für den I2C gefragt.



Wenns dir wirklich ums verstehen des I2C geht, dann vergiss den C18, und hau dir das in Assembler rein.
Wenn du ein ergebnis willst, dann bastel dir aus den gegebenen Sachen selber was.

Sorry wenn ich jetzt unhöflich bin, aber wenn du einfach sagst "mach selber" dann brauchst du auch nicht auf eine Frage zu antworten...



Wenn dich die "Libraries" stören, dann öffne die header und die .c einfach mal, und schau, was da drin ist. Schließlich stellen die dir nur die Funktionen zur Verfügung, mit denen du dann arbeitest.
Wenn du diese so einsetzen kannst, dass was übertragen wird, und daran was ändern kannst und hinterher auch weisst, was die Änderung bewirkt, dann bist deinem Ziel des Verstehens schon einen Schritt näher.

Dass man für den C-Syntax eine Library verwendet ist mir auch klar... Jedoch möchte einfach nur den I2C-Bus mit den Standard-C-Befehlen steuern.



und der Ansatz PIC--> EEPROM sollte auch keine Fertige Lösung bieten, sondern etwas Arbeitsmaterial um dich damit zu befassen, und mal damit zu spielen, und vielleicht sogar mal was draus übernehmen zu können.
Stichwort: Transferwissen... Soll angeblich immer wichtiger werden ;)

Transferwissen? Ist mir ein Fremdwort.



So, und zu den comments muss ich dich leider enttäuschen, da ich a) weder russisch kann, noch b) jemals mit c18 gearbeitet habe *G*

Nobody is perfect.



Also mehr als das selbsterklärende kann ich leider net erzählen. Aber vielleicht hilft dir die Doku des compilers, die sich immerhin in einem der Links versteckt, um einfach mal selbst zu kommentieren und dann zu schauen, ob du verstehst, was da passiert.
Hat viel lerneffekt.
Du musst dir einfach im klaren werden, was du willst... Und lernen konkrete Fragen zu stellen statt nach mundgerechten Komplettlösungen zu verlangen.

Das tönt wie ein Lehrer...



Trotzdem danke für die Antwort...

phaidros
04.12.2006, 16:12
Bei Microchip gibt es zwei Quellen, einmal den "PIC18Fxx2 Data Sheet" und das "PIC18C Reference Manual". Wenn du in beiden das gelesen hast, was dort über I2C steht, dann sollten eigentlich keine Fragen zur Initialisierung mehr offen sein. Es ist wirklich alles dort beschrieben. Wenn du allerdings nicht weißt, wie du das in C umsetzen kannst, dann nimm doch lieber die fertigen Libraries.

BlinkyBill
05.12.2006, 07:06
Sorry wenn ich jetzt unhöflich bin, aber wenn du einfach sagst "mach selber" dann brauchst du auch nicht auf eine Frage zu antworten...

Wie gesagt... Du musst dir schlüssig werden, was du willst...

du hast jetzt schon 2 recht verschiedene Sachen behauptet:


Zum 2. Treffer: Ich möchte den I2C-Bus versuchen zu verstehen, deshalb nutzt es mir nichts wenn ich das mit Libraries löse.

Hier sagst du, dass dir die C-Funktionen nichts bringen um den I2c zu verstehen, und dann kommt wieder das Gegenteil raus



Dass man für den C-Syntax eine Library verwendet ist mir auch klar... Jedoch möchte einfach nur den I2C-Bus mit den Standard-C-Befehlen steuern.

Also ? Was machen denn nun die Header-Files, ausser den I2C mit C-Befehlen zu steuern ???
Das könnte das Beispiel sein, das du zu Anfang des Threads erfragt hast...

Ein Beispiel:
du möchtest die Funktion byte_out(...) nicht benutzen, weils dir darum geht, das aus standardbefehlen zusammenzubasteln....

Du öffnest aus der AN997 die Datei AN997_i2c.c und schon wirst du folgenden code finden:



/************************************************** ******************
* Function: unsigned char byte_out(unsigned char data)
*
* Description: This function outputs a byte to the I2C bus.
* It also receives the ACK bit and returns 0 if
* successfully received, or 1 if not.
************************************************** *****************/
unsigned char byte_out(unsigned char data)
{
unsigned char i; // Loop counter
unsigned char ack; // ACK bit

ack = 0;
for (i = 0; i < 8; i++) // Loop through each bit
{
bit_out(data); // Output bit
data = data << 1; // Shift left for next bit
}
bit_in(&ack); // Input ACK bit

return ack;
} // end byte_out(unsigned char data)

Und schon hast du die genaue Schritt für Schritt abfolge für das senden eines Bytes auf dem I2C.
Und ebenso wirds da wohl Code zur Konfiguration geben.


Ich hoffe, du weisst nun, warum ich mir nicht wirklich schlüssig bin, was du denn nun überhaupt willst...



So, und wenn du weiterhin mit der Aussage,dass man da eben auch selber was machen muss (nämlich Dateien öffnen und lesen) nicht klar kommst, dann werde ich mir weitere Antworten ersparen. Es war lediglich ein Hinweis, dass dir die fertigen Funktionen zum verstehen nicht viel bringen. Aber das wusstest du ja offensichtlich bereits.
Und für ein schnelles Ergebnis (scheinst ja etwas ungeduldig) sollst du dir "aus den gegebenen Sachen" selber was basteln... Copy&paste wirkt da wunder...


Das tönt wie ein Lehrer...

Ich wusste doch, dass ich in der falschen Branche bin...[/quote]

Adonai
05.12.2006, 08:15
Ein Beispiel:
du möchtest die Funktion byte_out(...) nicht benutzen, weils dir darum geht, das aus standardbefehlen zusammenzubasteln....
Du öffnest aus der AN997 die Datei AN997_i2c.c und schon wirst du folgenden code finden:

Das wäre natürlich auch eine Lösung. Danke für den Hinweis.

BlinkyBill
05.12.2006, 08:21
Erst glotzen, dann motzen ;)