mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik I2C mit PIC16F1939


Autor: Martin S. (drunkenmunky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

Ich hab hier das Demoboard PICDEM 2 PLUS (old version) von Microchip. 
Als Prozessor verwende ich ein PIC16F1939. Auf dem Board befindet sich 
ein EEPROM und ein Temperatursensor TC74, die beide über I2C an den PIC 
(RC3 und RC4) angeschlossen sind.

Jetzt versuche ich verzweifelt, die Temperatur über I2C ausgelesen zu 
bekommen.

Also die Initialisierung sieht folgendermaßen aus:
PORTC = 0x00;
LATC = 0x00;
TRISC = 0b00011000;         // RC3 und RC4 Input for I2C

SSPSTAT = ( BIT7 * 1 )      // Slew rate control disabled for standard speed mode (100 kHz and 1 MHz)
  | ( BIT6 * 0 );           // Disable SM bus™ specific inputs

SSPADD = 79;                // Baud Rate Clock Divider bits: bei 32 MHz Fosc -> 100kHz I2C Takt 

SSPCON1 = ( BIT7 * 0 )      // Write Collision Detect bit cleared
      | ( BIT6 * 0 )        // Receive Overflow Indicator bit cleared
      | ( BIT5 * 0 )        // Disables serial port and configures these pins as I/O port pins
      | ( BIT0 * 0b1000 );  // I2C Master mode, clock = FOSC / (4 * (SSPADD+1))

/* Enables the serial port and configures the SDA and SCL pins as the source of the serial port pins */
SSPEN = 1;

SSPCON2 = 0;
SSPCON3 = 0;

und dann für eine Kommunikation:
/* Bus übernehmen */
/* Start setzen */
SEN = 1;
          
while( SSPIF != 1 ) continue;
SSPIF = 0;
  
/* Adresse auf den Bus legen */
SSPBUF = 0b10011011;    // Adresse + 1 für lesen

Aber nach dem Befehl SEN = 1 wird das Flag BCLIF gesetzt, was bedeutet, 
dass eine Buskollision vorlag.
Jetzt hab ich den PIC mal auf ein Steckbrett getan und an SDA und SCL 
nur mal Pull-up Widerstände geschalten. Da läuft es durch ohne 
Buskollision.

Was meint ihr, liegt ein Defekt an der Hardware vor oder habe ich ein 
Fehler in der Software?

Autor: bingo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kann es sein, dass sich die Adressen von EEPROM und TC74 überschneiden?

Autor: Martin S. (drunkenmunky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
danke für die Antwort.

Die Adressen sind definitiv unterschiedlich.

Das Programm läuft auch gar nicht bis dahin, wo die Adresse in den 
Puffer übergeben wird, sondern bleibt bei

while( SSPIF != 1 ) continue;

stehen. Mit dem Setzen von SEN müsste nach der Startsequenz das Flag 
SSPIF automatisch gesetzt werden. Tut es aber nicht wegen der 
Buskollision.

Noch irgendwelche anderen Ideen?

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.