mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PIC18F25J10 und 24LC64 / MCC18


Autor: thomas harasek (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich möchte mit einem PIC18F25J10 einen 24LC64 ansprechen
und habe folgende zwei Routinen geschrieben -
aber es funktioniert nicht
(ich verwende den MCC18).

Der Lesevorgang sollte über Random Read funktionieren.
Die Funktionen eeprom_WriteByte und eeprom_ReadByte
rufe ich in meiner Hauptroutine hintereinander auf.

Kann mir jemand einen Tipp geben, was ich falsch mache -
bzw. wo finde ich entsprechende Source-Code-Beispiele?

Vielen Dank
thomas

#include <p18f25j10.h>
#include <i2c.h>

#include <controller.h>

void eeprom_WriteByte (void)
{
  OpenI2C(MASTER, SLEW_ON);// Initialize I2C module
  SSPADD = 12;

  IdleI2C();
  StartI2C();

  IdleI2C();
  WriteI2C(0xA0); // control byte
  AckI2C();

  IdleI2C();
  WriteI2C(0x00); // reg address
  AckI2C();

  IdleI2C();
  WriteI2C(0x00); // reg address
  AckI2C();

  IdleI2C();
  WriteI2C('A');
  AckI2C();

  IdleI2C();
  WriteI2C('B');
  AckI2C();

  StopI2C(); 

  CloseI2C();


}


unsigned char eeprom_ReadByte (void)
{
  unsigned char ret_value;

  OpenI2C(MASTER, SLEW_ON);// Initialize I2C module
  SSPADD = 12;

  IdleI2C();
  StartI2C();

  IdleI2C();
  WriteI2C(0xA0); // control byte
  AckI2C();

  IdleI2C();
  WriteI2C(0x00); // reg address
  AckI2C();

  IdleI2C();
  WriteI2C(0x00); // reg address
  AckI2C();

  IdleI2C();
  StartI2C();
  AckI2C();

  IdleI2C();
  WriteI2C(0xA1); // control byte
  AckI2C();

  IdleI2C();
  ret_value = ReadI2C();

  StopI2C(); 

  CloseI2C();

  return ret_value;

}

Autor: André (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

also mit welchem Takt läuft dein PIC? (SSPADD = 12; deutet auf relativ 
niedrigen Takt, oder eine sehr hohe I2C Geschwindigkeit?)

In deiner Read Routine denke ich müsste das 2. StartI2C(); ein 
RestartI2C(); -- ebenso musst du bei Verwendung des Hardware I2C Moduls 
als Master noch einige Warteschleifen einbauen, bis die jeweilige 
Operation auch durchgeführt wurde - die Funktionen welche du aufrufst 
geben die Werte direkt in die Ausgaberegister des PIC - und diese läuft 
dann Parallel zum eigentlichen Programm.

Schau mal hier: -> 
http://www.fernando-heitor.de/component/option,com...

Ich kämpfe derzeit auch mit einem 64kbit I2C Eeprom an einem 18F4550 - 
vielleicht hilft Dir ein Blick auf meine Routinen - ich habe das meiste 
an Code aus den Original Microchip C18 Bibliotheken recyclet.

André

Autor: thomas harasek (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo André,

mein PIC taktet mit 20MHz
und der 24LC64 mit 400kHz

ich habe es auch mit

OpenI2C(MASTER, SLEW_OFF);    // 100 kHz
SSPADD = 49;

probiert - es funktioniert trotzdem nicht.


Wenn ich Deinen Code verwende,
bekomme ich am Ende einen bus_collision_error!?
  StopI2C();              // send STOP condition
  while ( SSPCON2bits.PEN );// wait until stop condition is over

  if ( PIR2bits.BCLIF )   // test for bus collision
       goto bus_collision_error;


lg
thomas

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.