Forum: Mikrocontroller und Digitale Elektronik Slave verliert Daten wenn in Interrupt springt


von Lukas D. (lukas_d)


Lesenswert?

Hallo Leute,

ich habe einen Master (PIC16F886) und einen Slave (PIC18F44K22). Das 
Senden sowie das Empfangen von Master funktioniert. Empfangen wird aber 
nur etwas wenn ich die Variable direkt im Slave MSSP Interrupt setze 
bevor sie in den Buffer gelesen wird. Wenn ich die Variable in der 
main-loop setzt geht der Wert verloren. Das Problem hatte ich mit 
anderen Prozessoren bisher noch nicht. Weis jemand woran das liegt?

MfG Lukas
1
void interrupt ISR(void)
2
{
3
    if(SSP1IF)
4
    {
5
        SSP1IF = 0;
6
        if(SSP1STATbits.S == 1 && RW1 == 0 && DA1 == 0 && BF1 == 1)                //STATE 1: Master write, last byte was an adress
7
        {
8
            dLED1 = 1;
9
            vCLEAR = SSP1BUF;
10
            CKP1 = 1;
11
        }
12
13
        if(SSP1STATbits.S == 1 && RW1 == 0 && DA1 == 1 && BF1 == 1)              //STATE 2: Master write, last byte was data
14
        {
15
            dLED2 = 1;
16
            vWRITEDATA = SSP1BUF;
17
            CKP1 = 1;
18
            vCLEAR = SSP1BUF;
19
        }
20
21
        if(SSP1STATbits.S == 1 && RW1 == 1 && DA1 == 0)                          //STATE 3: Master read, last byte was an adress
22
        {            
23
            dLED3 = 1;
24
            CKP1 = 0;
25
//            vREADDATA[0] = 0x41;  <- setzen der Variable, dann läuft!
26
            SSP1BUF = vREADDATA[0];                                                   //Rücksetzen wenn Daten in Buffer eingelesen
27
            CKP1 = 1;
28
        }
29
30
        if(SSP1STATbits.S == 1 && DA1 == 1 && BF1 == 0 && CKP1 == 1)                //STATE 5: Master NACK
31
        {
32
            dLED5 = 1;
33
            CKP1 = 1;
34
            vCLEAR = SSP1BUF;
35
        }        
36
    }
37
}
38
39
void main(void)
40
{
41
    Init();
42
43
    fSTARTUP();
44
    fSELBSTTEST();
45
46
    while(1)
47
    {
48
49
        if(vWRITEDATA == 0x66)
50
        {
51
            dLED8 = 1;
52
        }
53
        
54
        vREADDATA[0] == 0x41;
55
    }
56
}

von Karl H. (kbuchegg)


Lesenswert?

Klingt für mich nach einem volatile Problem.
Leider zeigst du die Variablendefinitionen nicht.

FAQ
"Was hat es mit volatile auf sich"

: Bearbeitet durch User
von Lukas D. (lukas_d)


Lesenswert?

/*I2C BUS*/
char vCLEAR                         = 0x00;
unsigned char vWRITEDATA            = 0;
unsigned char vREADDATA[2];

Hab schon mit volatile unsigned char vREADDATA[2]; probiert aber selbes 
problem bleibt.

von Karl H. (kbuchegg)


Lesenswert?

Da gehört auf jeden Fall ein volatile rein.

Kann natürlich sein, dass es ein oder mehrere weitere Probleme gibt. 
Aber das fehlende volatile ist auf jeden Fall eines.

von Lukas D. (lukas_d)


Lesenswert?

Ach übrigens ist oben ein = zu viel. vREADDATA[0] = 0x41;

: Bearbeitet durch User
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.