-
        

Ergebnis 1 bis 5 von 5

Thema: PIC18F4550 I2C 24LC512/C18-Compiler

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    21.11.2006
    Ort
    Hessen
    Beiträge
    35

    PIC18F4550 I2C 24LC512/C18-Compiler

    Anzeige

    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/e...Doc/21754M.pdf

    18F4550: http://ww1.microchip.com/downloads/e...Doc/39632b.pdf

    C18Libs: http://ww1.microchip.com/downloads/e...ies_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
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken schaltplan_152.jpg  

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    21.11.2006
    Ort
    Hessen
    Beiträge
    35
    Oh und noch ein kleiner Nachtrag. Gibt es denn eine Möglichkeit zu kontrollieren, ob der Bus generell funktioniert? Also ob der 24LC512 überhaupt das Byte 0xAA engegen nimmt?

    Ist alles Neuland für mich. Mit dem Oszi habe ich gemessen, der Takt ist vorhanden. Leider lassen sich die Daten nicht erfassen, da es ein altes Oszi ist und da gibt es Probleme mit dem Triggern...

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    30.09.2006
    Ort
    Hamburg
    Alter
    35
    Beiträge
    987
    Hi, am einfachsten ist es ein Config Register auszulesen die default werte stehen ja im Datenblat damit läst sicht das recht gut testen, danach weist du ob der bus funtzt.
    Legastheniker on Bord !

    http://www.Grautier.com - Projektseite
    http://www.grautier.com/wiki/doku.php?id=bt-index - BT-BUS

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    21.11.2006
    Ort
    Hessen
    Beiträge
    35
    Oweh oweh,

    also was bisher gemacht habe ist die SSCON1 und SSCON2 sowie die anderen Register die zum I2C gehören beobachtet bzw. simuliert. Meinst du das?

    Habe zwar schon etwas Erfahrung mit µCs aber dieser Anweisung kann ich leider nicht ganz folgen. Welches Register meinst du denn Speziell?

    Gruß

    Sören

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    21.11.2006
    Ort
    Hessen
    Beiträge
    35
    SOOOOOOO!Hatte mir eben geschworen, dass dies mein letzter Versuch werden sollte und siehe da, es hat funktioniert =D>

    Ich hätte wohl diese viele AckPollings weg lassen sollen! Diese Funktion dient offenbar dazu, dass der Master weiß, dass der Slave auch wirklich da ist...

    Naja ich stelle mal den Quellcode hier her, wer weiß wer ihn irgendwann mal gebrauchen kann?!

    Quellcode für 512k Speicher zu beschreiben:

    #include<p18cxxx.h>
    #include<timers.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

    unsigned char arraywrite[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
    unsigned char arrayread[]={15,14,13,12,11,10,9,8,7,6,5,4,3,2,1};

    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
    putcI2C(0x00); //Highteil der Speicher-Addresse
    putcI2C(0x0F); //Lowteil der Speicher-Addresse
    putcI2C(schreiben); //Daten in 24LC512 schreiben
    SSPCON2=0x04; //Acknoledge
    while(SSPCON2==0x04); //
    StopI2C(); //I2C stoppen
    EEAckPolling(0xA0);

    StartI2C(); //I2C starten
    putcI2C(0xA0); //24LC512 ansprechen
    putcI2C(0x00); //Highteil der Speicher-Addresse
    putcI2C(0x0F); //Lowteil der Speicher-Addresse
    StartI2C(); //erneutes Starten(24LC512Datasheet)
    putcI2C(0xA1); //24LC512 ansprechen(Read)
    lesen = ReadI2C(); //Byte einlesen
    StopI2C(); //I2C Stop
    EEAckPolling(0xA0);
    while(1)
    {
    PORTD=lesen; //Ausgabe des gelesenen Bytes
    }
    }

    Hurra! Also wegen mir kann der Threat nun geschlossen werden, ich für meinen Teil mache jetzt erstmal ein Fass auf

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •