www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PIC18F I2C Initialisierung


Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

vorab, sitze schon wochenlang an diesem Problem und habe schon sämtliche 
Foren und Varianten gecheckt und stehe jetzt am Rand meiner Fähigkeiten.

Ich habe einen PIC18F26K22 mit dem ich ein Display (Batron BT HQ 
21605AV-YETF-LED04-I2C-5V) über I2C steuern möchte. Quarz 20MHz.

Ich habe bereits die Register und Bits. manuell beschrieben aber auch 
die Funktionen aus i2c.h verwendet. Auf dem Oszi sind beide Leitungen 
auf 'Dauerhigh'. Verwende auch externe Pull-Ups (10k). Ich bekomm die 
Datenleitung einfach nicht runtergezogen für eine Startcondition. Hier 
seht ihr 2 von vielen Varianten die ich probiert habe:

//Libraries:
#include <p18f26K22.h>
#include <stdlib.h>
#include <stdio.h>
#include <delays.h>
#include <i2c.h>
...
...
...
void main()
{
...
...
...
  //I2C
  TRISCbits.TRISC3=1; //SCL Master
  TRISCbits.TRISC4=1;  //SDA
  OpenI2C(MASTER, SLEW_OFF);   // initialize master mode
  SSP1ADD=0x31; //100kHz

oder 

  SSP1CON1=0b00101000;   //I2C Enable bit + Master Mode
  SSP1CON2bits.ACKDT=0;
  SSP1STATbits.SMP=0;
  SSP1STATbits.CKE=0;
  SSP1ADD=0b00010000;  //400kHz Baud

...
...
...

  IdleI2C();
  Delay10TCYx( 50 );  
  StartI2C();
  Delay10TCYx( 50 );
  WriteI2C(0x74);  
  Delay10TCYx( 50 );  
  StopI2C();  

oder


    PIR1bits.SSP1IF=0;    //Fertig-Anzeige löschen
    SSPCON2bits.SEN=1;    //Bus übernehmen
    while(!PIR1bits.SSP1IF);//Warte bis Bus übernommen ist
    PIR1bits.SSP1IF=0;    //Zur¸cksetzen
    SSP1BUF=0x74;      //Slave adressieren + Write
    while(!PIR1bits.SSP1IF);//Warte bis fertig
    PIR1bits.SSP1IF=0;    //Zurücksetzen
    SSP1BUF=0xAA;      //Datenbyte
    while(!PIR1bits.SSP1IF);//Warte bis fertig
    PIR1bits.SSP1IF=0;    //Zurücksetzen
                while(SSP1CON2bits.ACKSTAT != 1);  //Acknowledge von Slave abwarten
    SSP1CON2bits.ACKSTAT=1;        //Zurücksetzen
    SSP1CON2bits.PEN=1;    //Bus freigeben
    while(!PIR1bits.SSP1IF);//Warte bis fertig
    PIR1bits.SSP1IF=0;    //Zurücksetzen
...
...


Hat jemand vielleicht eine Idee oder einen Code von dem er weiß dass 
dieser funktioniert? Ich wäre sehr dankbar.

lg
Patrick

Autor: Diotor (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Setz mal bei der Initialisierung das SSPEN Bit.
Bei der Startbedingung warten bis SEN gecleared wird.
Als Pull-Ups 4,7k nehmen

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Dieter für deine Antwort.

Das SSPEN ist aber ja schon gesetzt (Bit5):
SSP1CON1=0b00101000;   //I2C Enable bit + Master Mode

lg

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sonst noch jemand eine Idee oder einen Code?

lg

Autor: Programist (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich kann dir Jal empfehlen.Da ist schon eine i2c library dabei.

Autor: abc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
was passiert, wenn du die pins als digitaler io verwendest und auf loe 
ziehst?

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dann gehen die auch auf low. wie gesagt hardware ist in ordnung

Autor: Martin S. (drunkenmunky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Probier mal nach dem Start das SEN anstatt das SSPIF Flag abzufragen.

Ich habs mit dem Code aus dem Thread, der eigentlich für PIC18 und 
Microchip Compiler ist, auf nem PIC16 mit HITECH zu laufen gebracht:
http://www.microchip.com/forums/m564117.aspx

Probiers mal aus!

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.