Forum: Mikrocontroller und Digitale Elektronik I2C Probleme am PIC18F26K42


von Brom B. (schrori)


Lesenswert?

Hallo zusammen,

ich komme hier leider allein nicht weiter.
Mein PIC Sendet und empfängt daten via I2C2 von einem Temperatur sensor.
Funktioniert alles tippitoppi

Nun möchte ich via I2C1 einen 12 bit DAC Ansteuern der in abhängigkeit 
der Temperatur seine Spannung ändert.
Soweit so gut.

Nun das "problem" wenn ich wie bei I2C2 auch die MCC generierten 
Funktionen nutze (die dort ja wunderbar funktionieren) sendet er mir 
genau 2 byte aber nichts aus den daten.

Daraufhin habe ich eine eigene funktion gebaut die so aussieht:
1
void writeADC(  uint8_t adress, uint8_t adress2, 
2
                uint8_t byte1, uint8_t byte2) {
3
        if(!I2C1CON0bits.EN)
4
        {
5
            //CNTIF 0; ACKTIF 0; WRIF 0; ADRIF 0; PCIF 0; RSCIF 0; SCIF 0; 
6
            I2C1PIR = 0x00;
7
            //CNTIE disabled; ACKTIE disabled; WRIE disabled; ADRIE disabled; PCIE disabled; RSCIE disabled; SCIE disabled; 
8
            I2C1PIE = 0x00;
9
            //BTOIF No bus timout; BCLIF No bus collision detected; NACKIF No NACK/Error detected; BTOIE disabled; BCLIE disabled; NACKIE disabled; 
10
            I2C1ERR = 0x00;
11
            //Count register 
12
            I2C1CNT = 0xFF;
13
            //Enable I2C1
14
            I2C1CON0bits.EN = 1;
15
        }
16
        
17
        I2C1TXB  = adress;
18
        __delay_us(100);
19
        
20
        I2C1TXB  = adress2;
21
       __delay_us(100);
22
        I2C1TXB  = byte1;
23
       __delay_us(100);
24
        I2C1TXB  = byte2;
25
        __delay_us(86);
26
27
         //Disable I2C1
28
        I2C1CON0bits.EN = 0;
29
        //CNTIF 0; ACKTIF 0; WRIF 0; ADRIF 0; PCIF 0; RSCIF 0; SCIF 0; 
30
        I2C1PIR = 0x00;
31
        //Set Clear Buffer Flag
32
        I2C1STAT1bits.CLRBF = 1;
33
}

nun kommen (gemessen mit dem Oszi) alle signale an, aber es tut sich 
nichts... hat jemand eie idee?

Vielen Dank euch.
der Konverter ist ein MCP4725

PS:
Habe ich möglicherweise die Daten falsch übergeben das die MCC funktion 
sie nicht gesendet hat??
1
//dataDAC ist ein uint16_t
2
//ADC und DAC habe ich bei der bennenung mal verwechselt, stimmt jedoch
3
I2C1_Write2ByteRegister(I2C1_ADC_ADRESS, I2C1_ADC_BIT1, dataDAC);
4
5
void I2C1_Write2ByteRegister(i2c1_address_t address, uint8_t reg, uint16_t data)
6
{
7
    while(!I2C1_Open(address)); // sit here until we get the bus..
8
    I2C1_SetDataCompleteCallback(wr2RegCompleteHandler,&data);
9
    I2C1_SetBuffer(&reg,1);
10
    I2C1_SetAddressNackCallback(NULL,NULL); //NACK polling?
11
    I2C1_MasterWrite();
12
    while(I2C1_BUSY == I2C1_Close()); // sit here until finished.
13
}

: Bearbeitet durch User
von Andras H. (kyrk)


Lesenswert?

Was ist das?
       __delay_us(100);
Delay?
Das muss weg, und du must gucken wie der I2C baustein arbeitet. Bits 
gucken, nicht abwarten.

von Brom B. (schrori)


Lesenswert?

Hallo Andreas,

danke für deine Antwort.
Aus dem I2C Baustein habe ich im grunde extrahiert das er die Register 
füllt und dann in einem Polling interrupt darauf wartet das wieder frei 
wird. nur sendet er wie gesagt die Daten nicht. das mit dem delay kommt 
mir ebenfalls irgendwie sehr merkwürdig vor, aber laut dem Datenströmen 
die am oszi rauskommen funktioniert es. start bit, adresse1, adresse, 2 
datenbytes und stopbit dazwischen mit den ack bits alles wie es soll...

Die MCC funktionen sind leider so verschachtelt das ich irgendwann 
ausgestiegen bi :(

von Brom B. (schrori)


Lesenswert?

Also ich bin ein gutes Stück weiter,
ich habe rausgefunden warum die MCC nicht ging, ich habe als adresse 
stehts das komplette byte inkl. RW bit agegeben intern jedoch shiftet er 
um 1 und setzt das rw bit selbst.
Nun sendet er alle daten, ausser!! das letzte byte, hier sedet er nur 4 
bit dann ist sense... jemand eine idee??

: Bearbeitet durch User
von Brom B. (schrori)


Lesenswert?

Okay also falls jemand ein ähnliches Problem haben sollte, hier die 
Lösung, scheibar gibt es einen fehler in der while schleife. in Fakt 
schliest sich der i2c bus mit der mcc stadard funktion BEVOR alle daten 
übertragen werden konnten, ein kleines delay ach dem Masterwrite und vor 
dem close löst das problem. und erzeugt auch im oszi keine überflüssigen 
takte oä.

VG :)

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.