Forum: Mikrocontroller und Digitale Elektronik PIC18 C18 I2C


von Andreas R. (blackpuma)


Lesenswert?

Hallo erstmal!

Es ist mir schon fast Peinlich aber ich bin schon wieder da mit einem 
anderen Problem! Ich versuche gerade den I2C Bus zu bedienen. Ich 
verwende die von Microchip bereitgestellten Libraries.

Was ich dabei nicht verstehe ist das Beispiel aus dem Handbuch. Zu 
verwenden ist der Befehl so:

1
unsigned char EEByteWrite(
2
   unsigned char control,
3
   unsigned char address,
4
   unsigned char data );

Ok wenn ich nun ein kleines EEProm habe komme ich mir meinen 255 
Adressen aus. Ich habe aber ein 24CC256. Dabei brauche ich eine High und 
eine Low Adresse. Wie kann ich die höheren Adressen aber damit 
ansprechen? Mit

1
EEByteWrite(0xA0, 0x30, 0xA5);

komme ich ja nur bis 255 wenn ich mich nicht täusche.

Weiß einer von euch da weiter?

LG
Andreas

von Andreas R. (blackpuma)


Lesenswert?

Hab da nochwas gefunden in dem UserGuide für die Libraries. Also so wie 
das da steht funktioniert das aber nicht oder?
1
EEByteWrite( 0xA0, 0x30, 0xA5 );
2
.
3
.
4
.
5
EERandomRead( 0xA0, 0x30 );

Also Kommando wird hier doch immer schreiben übergeben oder? Da kann ja 
nie was zurückkommen?!

LG
Andi

von Andreas R. (blackpuma)


Lesenswert?

Hab das jetzt mal soweit gelöst. Es können nur 255 Speicherstellen 
angesprochen werden mit dem EEByteWrite. Jetzt habe ich die C Bibliothek 
von Microchip umgeschrieben das ich eine High und ein Low Adresse senden 
kann. Habe aber noch Probleme.

Es wird ein Fehlercode zurückgegeben.

-1 bei bus collsion
-2 bei not ack
-3 bei write collision

Wie kann ich diese Fehlercodes auswerten?

Also zB.
1
unsigned int EERandomRead( unsigned char x, unsigned char y)
2
{
3
.
4
.
5
.
6
return( -2 );
7
}
8
9
void main( void )
10
{
11
  unsigned int temp;
12
13
  test = EERandomRead( 0xA0, 0x00 );
14
15
  if( test == '-1' )
16
    putsUSART( "Bus collition" );
17
  else if( test == '-2' )
18
    putsUSART( "Not ACK Error" );    
19
  else if( test == '-3' )
20
    putsUSART( "write collision" );
21
  else
22
.
23
.
24
.
25
}

So habe ich es versucht aber funktioniert nicht. Führt immer das else 
aus.

Bitte um Hilfe.

von nols (Gast)


Lesenswert?

Auf den ersten Blick würde ich jetzt sagen:

Vergleich den Rückgabewert mit einem Int und nicht mit einer 
Zeichenkette:
1
  if( test == -1 )
2
    putsUSART( "Bus collition" );
3
  else if( test == -2 )
4
    putsUSART( "Not ACK Error" );    
5
  else if( test == -3 )
6
    putsUSART( "write collision" );
7
  else
also die einfachen Anführungszeichen weg und es sollte funktionieren

von Joel (Gast)


Lesenswert?

Hallo zusammen, ich habe dasselbe Probleme.
Wie habtihr das gelöst. bei mir mit der funktion test = EERandomRead( 
0x05, 0x68 ); komm immer raus test=0xFD und bei der SSPBUF=0x05;
wie habt ih das Problem gelöst.
Grüß

von Andreas R. (blackpuma)


Lesenswert?

Ich habe die Microchip Bibliothek umgeschrieben. Mein EERandomRead sieht 
jetzt so aus:
1
test = EERandomRead( 0xA0, 0x02, 0x03 );
2
// EERandomRead( Bauteiladresse, HighAdresse, LowAdresse );

Also kann ich bis zu 64k Speicherstellen des EEProms beschreiben.

LG
Andreas

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.