Forum: Mikrocontroller und Digitale Elektronik PIC18F I2C Initialisierung


von Patrick (Gast)


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:

1
//Libraries:
2
#include <p18f26K22.h>
3
#include <stdlib.h>
4
#include <stdio.h>
5
#include <delays.h>
6
#include <i2c.h>
7
...
8
...
9
...
10
void main()
11
{
12
...
13
...
14
...
15
  //I2C
16
  TRISCbits.TRISC3=1; //SCL Master
17
  TRISCbits.TRISC4=1;  //SDA
18
  OpenI2C(MASTER, SLEW_OFF);   // initialize master mode
19
  SSP1ADD=0x31; //100kHz
20
21
oder 
22
23
  SSP1CON1=0b00101000;   //I2C Enable bit + Master Mode
24
  SSP1CON2bits.ACKDT=0;
25
  SSP1STATbits.SMP=0;
26
  SSP1STATbits.CKE=0;
27
  SSP1ADD=0b00010000;  //400kHz Baud
28
29
...
30
...
31
...
32
33
  IdleI2C();
34
  Delay10TCYx( 50 );  
35
  StartI2C();
36
  Delay10TCYx( 50 );
37
  WriteI2C(0x74);  
38
  Delay10TCYx( 50 );  
39
  StopI2C();  
40
41
oder
42
43
44
    PIR1bits.SSP1IF=0;    //Fertig-Anzeige löschen
45
    SSPCON2bits.SEN=1;    //Bus übernehmen
46
    while(!PIR1bits.SSP1IF);//Warte bis Bus übernommen ist
47
    PIR1bits.SSP1IF=0;    //Zur¸cksetzen
48
    SSP1BUF=0x74;      //Slave adressieren + Write
49
    while(!PIR1bits.SSP1IF);//Warte bis fertig
50
    PIR1bits.SSP1IF=0;    //Zurücksetzen
51
    SSP1BUF=0xAA;      //Datenbyte
52
    while(!PIR1bits.SSP1IF);//Warte bis fertig
53
    PIR1bits.SSP1IF=0;    //Zurücksetzen
54
                while(SSP1CON2bits.ACKSTAT != 1);  //Acknowledge von Slave abwarten
55
    SSP1CON2bits.ACKSTAT=1;        //Zurücksetzen
56
    SSP1CON2bits.PEN=1;    //Bus freigeben
57
    while(!PIR1bits.SSP1IF);//Warte bis fertig
58
    PIR1bits.SSP1IF=0;    //Zurücksetzen
59
...
60
...


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

lg
Patrick

von Diotor (Gast)


Lesenswert?

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

von Patrick (Gast)


Lesenswert?

Danke Dieter für deine Antwort.

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

lg

von Patrick (Gast)


Lesenswert?

Sonst noch jemand eine Idee oder einen Code?

lg

von Programist (Gast)


Lesenswert?

Ich kann dir Jal empfehlen.Da ist schon eine i2c library dabei.

von abc (Gast)


Lesenswert?

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

von Patrick (Gast)


Lesenswert?

dann gehen die auch auf low. wie gesagt hardware ist in ordnung

von Martin S. (drunkenmunky)


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!

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.