Mr.T
22.09.2010, 10:57
Hi Leute,
nach 4Tagen rumprobierens und Versuchens bin ich nun mit meinem Latein echt am Ende ](*,)
Ich wollte einen einfachen I2C Bus zwischen PIC18F4550 und einem 24LC512 von Microchip zusammen bauen, aber das ganze will nicht.
Links zu Datenblättern:
24LC512: http://ww1.microchip.com/downloads/en/DeviceDoc/21754M.pdf
18F4550: http://ww1.microchip.com/downloads/en/DeviceDoc/39632b.pdf
C18Libs: http://ww1.microchip.com/downloads/en/devicedoc/mplab_c18_libraries_51297f.pdf
Zuerst hatte ich versucht die in der Librariedokumentation gegebenen EE-Funktionen für EEPromspeicher zu nutzen, diese sind aber nur für 8-Bit Speicher-Addressen ausgelegt und somit für den 24LC512 wohl ungeeignet. Kein Problem dachte ich mir, selbst ist der Mann, dann schreibe ich die Addressierung und alles halt selbst...
Hier mein Quellcode:
#include<p18cxxx.h>
#include<i2c.h>
#include<delays.h>
#pragma config PLLDIV = 3 //PLL for 12Mhz
#pragma config CPUDIV = OSC1_PLL2 //Takt = 12Mhz:1=12Mhz
#pragma config FOSC = HS //bis 20MHz Taktung
#pragma config FCMEN = OFF //keine Taktüberwachung
#pragma config PWRT = OFF //Poweruptimer on
#pragma config BOR = OFF //Kein Brown Out Reset
#pragma config WDT = OFF //WatchDogTimer Off
#pragma config MCLRE = ON //MClr on
#pragma config PBADEN = OFF //PortB digital I/Os
#pragma config STVREN = OFF //Kein Stackreset
#pragma config LVP = OFF //Kein LowPowerICSP
#pragma config DEBUG = OFF //RB6,RB7 stehen zur Verfügung
#pragma config IESO = OFF //IESO Off
#pragma code
void main(void)
{
unsigned char schreiben = 0xAA; //Soll auf EEProm geschrieben werden
unsigned char lesen = 0xFF; //Soll vom EEProm gelesen werden
TRISB=0x03; //RB0,RB1 = Input
TRISD=0; //TRISD Output für LED-Anzeige
PORTD=0; //PORTD=0
OpenI2C(MASTER,SLEW_ON); //PIC als Master
SSPADD=7; //Baudrate einstellen
StartI2C(); //I2C starten
putcI2C(0xA0); //24LC512 ansprechen
EEAckPolling(0xA0); //auf Ack warten
putcI2C(0x00); //Highteil der Speicher-Addresse
EEAckPolling(0xA0); //auf Ack warten
putcI2C(0x0F); //Lowteil der Speicher-Addresse
EEAckPolling(0xA0); //auf Ack warten
putcI2C(schreiben); //Daten in 24LC512 schreiben
EEAckPolling(0xA0); //auf Ack warten
StopI2C(); //I2C stoppen
StartI2C(); //I2C starten
putcI2C(0xA0); //24LC512 ansprechen
EEAckPolling(0xA0); //auf Ack warten
putcI2C(0x00); //Highteil der Speicher-Addresse
EEAckPolling(0xA0); //auf Ack warten
putcI2C(0x0F); //Lowteil der Speicher-Addresse
EEAckPolling(0xA0); //auf Ack warten
StartI2C(); //erneutes Starten(24LC512Datasheet)
putcI2C(0xA1); //24LC512 ansprechen(Read)
EEAckPolling(0xA1); //auf Ack warten
lesen = ReadI2C(); //Byte einlesen
StopI2C(); //I2C Stop
while(1)
{
PORTD=lesen; //Ausgabe des gelesenen Bytes
}
}
Ich weiß, dass der PIC irgendwo in der rot markierten Zeile austeigt, warum keine ahnung. Vielleicht weil er keine Daten von dem 24LC512 bekommt?!
Den Schaltplan der Verdrahtung hänge ich auch mal an. Kann mir bitte jemand helfen? Ein I2C Bus ist wirklich wichtig für den Bau eines Roboters zumal sich auch einige Sensoren über I2C ansprechen lassen. Der 25LC512 ist dazu gedacht eine Karte aufzuzeichnen...
Ein Beispielcode wäre auch schon super!Weil ich komme kein Stück mehr weiter [-(
Beste Grüße und größten Dank im vorhinaus
Sören
nach 4Tagen rumprobierens und Versuchens bin ich nun mit meinem Latein echt am Ende ](*,)
Ich wollte einen einfachen I2C Bus zwischen PIC18F4550 und einem 24LC512 von Microchip zusammen bauen, aber das ganze will nicht.
Links zu Datenblättern:
24LC512: http://ww1.microchip.com/downloads/en/DeviceDoc/21754M.pdf
18F4550: http://ww1.microchip.com/downloads/en/DeviceDoc/39632b.pdf
C18Libs: http://ww1.microchip.com/downloads/en/devicedoc/mplab_c18_libraries_51297f.pdf
Zuerst hatte ich versucht die in der Librariedokumentation gegebenen EE-Funktionen für EEPromspeicher zu nutzen, diese sind aber nur für 8-Bit Speicher-Addressen ausgelegt und somit für den 24LC512 wohl ungeeignet. Kein Problem dachte ich mir, selbst ist der Mann, dann schreibe ich die Addressierung und alles halt selbst...
Hier mein Quellcode:
#include<p18cxxx.h>
#include<i2c.h>
#include<delays.h>
#pragma config PLLDIV = 3 //PLL for 12Mhz
#pragma config CPUDIV = OSC1_PLL2 //Takt = 12Mhz:1=12Mhz
#pragma config FOSC = HS //bis 20MHz Taktung
#pragma config FCMEN = OFF //keine Taktüberwachung
#pragma config PWRT = OFF //Poweruptimer on
#pragma config BOR = OFF //Kein Brown Out Reset
#pragma config WDT = OFF //WatchDogTimer Off
#pragma config MCLRE = ON //MClr on
#pragma config PBADEN = OFF //PortB digital I/Os
#pragma config STVREN = OFF //Kein Stackreset
#pragma config LVP = OFF //Kein LowPowerICSP
#pragma config DEBUG = OFF //RB6,RB7 stehen zur Verfügung
#pragma config IESO = OFF //IESO Off
#pragma code
void main(void)
{
unsigned char schreiben = 0xAA; //Soll auf EEProm geschrieben werden
unsigned char lesen = 0xFF; //Soll vom EEProm gelesen werden
TRISB=0x03; //RB0,RB1 = Input
TRISD=0; //TRISD Output für LED-Anzeige
PORTD=0; //PORTD=0
OpenI2C(MASTER,SLEW_ON); //PIC als Master
SSPADD=7; //Baudrate einstellen
StartI2C(); //I2C starten
putcI2C(0xA0); //24LC512 ansprechen
EEAckPolling(0xA0); //auf Ack warten
putcI2C(0x00); //Highteil der Speicher-Addresse
EEAckPolling(0xA0); //auf Ack warten
putcI2C(0x0F); //Lowteil der Speicher-Addresse
EEAckPolling(0xA0); //auf Ack warten
putcI2C(schreiben); //Daten in 24LC512 schreiben
EEAckPolling(0xA0); //auf Ack warten
StopI2C(); //I2C stoppen
StartI2C(); //I2C starten
putcI2C(0xA0); //24LC512 ansprechen
EEAckPolling(0xA0); //auf Ack warten
putcI2C(0x00); //Highteil der Speicher-Addresse
EEAckPolling(0xA0); //auf Ack warten
putcI2C(0x0F); //Lowteil der Speicher-Addresse
EEAckPolling(0xA0); //auf Ack warten
StartI2C(); //erneutes Starten(24LC512Datasheet)
putcI2C(0xA1); //24LC512 ansprechen(Read)
EEAckPolling(0xA1); //auf Ack warten
lesen = ReadI2C(); //Byte einlesen
StopI2C(); //I2C Stop
while(1)
{
PORTD=lesen; //Ausgabe des gelesenen Bytes
}
}
Ich weiß, dass der PIC irgendwo in der rot markierten Zeile austeigt, warum keine ahnung. Vielleicht weil er keine Daten von dem 24LC512 bekommt?!
Den Schaltplan der Verdrahtung hänge ich auch mal an. Kann mir bitte jemand helfen? Ein I2C Bus ist wirklich wichtig für den Bau eines Roboters zumal sich auch einige Sensoren über I2C ansprechen lassen. Der 25LC512 ist dazu gedacht eine Karte aufzuzeichnen...
Ein Beispielcode wäre auch schon super!Weil ich komme kein Stück mehr weiter [-(
Beste Grüße und größten Dank im vorhinaus
Sören