www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Timing PIC 18F4550, I2C Softwaremodus mit EEPROM 24C32A


Autor: Hans Rüdiger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
kann mir jemand helfen den I2C Bus zu konfigurieren.

Mein PIC läuft mit eine Frequenz von 5 MHz.

Ziel meiner Bemühungen ist und war es den EEPROM auszulesen.
Doch leider klappt es leider nicht mit dem Hardware MSSP Module auf dem 
Chip.
Daher habe ich es mit der Software variante probiert doch hier habe ich 
enorme Probleme meine Timing so einzustellen das der EEPROM alles 
schafft zu schreiben bzw. die Daten bereitzustellen und auf den I2C-Bus 
rauszuschieben.

SDA und SCL Leitung haben bei pullup Widerstände von 20k.
Wie berechen ich die zeit für schreiben, also einfag gefragt wie lang 
müssen die delays sein damit die kommunikation zwischen. Master (PIC) 
und Slave(EEPROM) klappt??

Ich benutze den MPLAB C18 Compiler und ICD2 fürs Debugen.

Der Code sieht bei mir so aus:

//main.c

//** I N C L U D E S ************************************************/
#include <p18f4550.h>
#include <sw_i2c.h>
#include <delays.h>
#include <sw_i2c.h>


//** D E C L A R A T I O N S ******************************************/

#pragma config CPUDIV = OSC4_PLL6
#pragma config PLLDIV = 5
#pragma config FOSC = HS
#pragma config PWRT = ON
#pragma config WDT = OFF


#define control_IN 0b10100000
#define control_OUT 0b10100001
#define address_HI 0b00000000
#define address_LO 0b00000000


void init(void)
{
ADCON1 = 0b00001111; // Enable digital I/O
TRISB = 0b11111111; // Configure PORTB I/O
} // initializes the PICmicro


void main (void)
{


//**********************************

init();
SWStartI2C(); // Generate bus start condition
test = SWPutaI2C(p1 , 1); // write control_in byte
Delay10TCY();
test = SWPutaI2C(p2 , 1); // write address hi byte
Delay10TCY();
test = SWPutaI2C(p3 , 1); // write address lo byte
SWStopI2C();
Delay10TCY();

SWRestartI2C(); // Generate bus restart condition
test = SWPutaI2C(p4 , 1); // write control_OUT byte
for (k=0;k<dlength;k++)
{
Delay10TCY();
data[k] = SWReadI2C(); //read in a single byte
SWAckI2C();
Delay10TCY();
}

SWStopI2C(); // Generate bus stop condition





} // end main function

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.