mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PIC18F4455 Problem mit I2C


Autor: Edi _2k (edi_2k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute.

Ich versuch den I2C-Modus des MSSP-Moduls (PIC18F4455) zum Laufen zu 
kriegen; Mit Hilfe von sprut.de und den AppNotes auf der Microchipseite.
Ich verwende eine 20MHz Quarz.

Folgender Code ist bis jetzt entstanden:

#pragma config BOR = OFF
#pragma config FOSC = HS
#pragma config CPUDIV = OSC1_PLL2
#pragma config WDT = OFF
#pragma config LVP = OFF
#pragma config PBADEN = OFF

void i2c_w(char dat);
char i2c_r(void);
void take_i2c(void);
void release_i2c(void);

// Hauptprogramm
void main(void)
{
...
        // PortPins des PortB sind Digitale I/O

  set_bit(ADCON1,3);
  set_bit(ADCON1,2);
  set_bit(ADCON1,1);
  clear_bit(ADCON1,0);        //PortA.0 analoger Eingang

  // I2C-Bus initialisieren
  set_bit(TRISB, 0);    // SDA
  set_bit(TRISB, 1);    // SCK

  INTCON2bits.NOT_RBPU = 0;

  SSPSTAT = 0x00;
  SSPSTATbits.SMP = 1;
  SSPADD = 49;           // 100kHz bei 20MHz
  SSPCON1 = 0x28;
  SSPCON2 = 0x00;
...
}

// I2C Byte schreiben
void i2c_w(char dat)
{
  // Daten schicken
  SSPBUF = dat;
  while(!(PIR1bits.SSPIF == 1));    // Warten bis gesendet
  PIR1bits.SSPIF = 0;    // Interruptflag löschen
}

// I2C Byte empfangen
char i2c_r(void)
{
  char dat = 0;

  // Daten empfangen
  SSPCON2bits.RCEN = 1;
  while(!(PIR1bits.SSPIF == 1));    // Warten bis empfangen
  dat = SSPBUF;
  PIR1bits.SSPIF = 0;      // Interruptflag löschen

  return(dat);
}

// I2C Bus übernehmen
void take_i2c(void)
{
  // Bus übernehmen
  PIR1bits.SSPIF = 0;    // Interruptflag löschen
  SSPCON2bits.SEN = 1;  // Bus übernehmen
  while(!(PIR1bits.SSPIF == 1));    // Warten bis gesendet
  PIR1bits.SSPIF = 0;  // Interruptflag löschen
}

// I2C Bus freigeben
void release_i2c(void)
{
  // Bus freigeben
  PIR1bits.SSPIF = 0;    // Interruptflag löschen
  SSPCON2bits.PEN = 1;  // Bus übernehmen
  while(!(PIR1bits.SSPIF == 1));    // Warten bis gesendet
  PIR1bits.SSPIF = 0;  // Interruptflag löschen
}

Dieser Code hat in etwas abgewandelter Form (anderer Compiler: 
Sourceboost) einwandfrei funktioniert. Wenn ich nun diese Routinen 
benutze, bleibt der PIC in Warteschleife von "i2c_r()" hängen.

Hat jemand eine Idee?

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.