Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Problema grave in interrupt

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[41] Re: Problema grave in interrupt

Messaggioda Foto Utenteivanpascolo » 9 nov 2014, 21:44

Ora ho modificato il software come aveva suggerito posta10100

Codice: Seleziona tutto
while (1){
        INTCONbits.TMR0IE = 0;
        LATAbits.LATA5 = ~ LATAbits.LATA5 ;
        t1 = sys_tick - t0;
        LATAbits.LATA5 = ~ LATAbits.LATA5 ;
        INTCONbits.TMR0IE = 1;
        if ((t1) > 100) {
            if ((t1<100)||(t1>101)){               
                CLRWDT;
            }
            else t0=sys_tick;
        }
       
    }


disabilitando gli interrupt prima di "t1 = sys_tick - t0;" e riabilitandoli subito dopo... e sembra funzionare.
A questo punto è chiaro che mentre il micro fa i calcoli per la sottrazione arriva un interrupt, modifica sys_tick, e continua con un mix di quello che c'era prima e quello che c'è dopo.
Però la soluzione di disabilitare gli interrupt non mi piace anche se il calcolo impiega solo 10us (guardando l'oscilloscopio).
Avatar utente
Foto Utenteivanpascolo
20 3
New entry
New entry
 
Messaggi: 71
Iscritto il: 29 set 2014, 20:44

1
voti

[42] Re: Problema grave in interrupt

Messaggioda Foto UtenteWALTERmwp » 9 nov 2014, 22:38

Ho letto l'allegato del Post [40].
Una implicazione da non dimenticare, grazie per averlo riportato; è certamente una possibile causa, e non è poco, ma non mi spiegherebbe, almeno per quel che vedo, la ripetitività con la quale si presenta un valore multiplo.
Comunque, considerandolo quale eventualità, i tempi non giocano per nulla a favore; se, paradossalmente, il programma fosse molto "lungo", ci sarebbero meno probabilità di incappare nell'inconveniente.
Con il codice ridotto all'indispensabile, come hai fatto, le probabilità in un singolo loop sarebbero quasi 1/100 (già è molto solo il fatto che si possa scrivere di probabilità) ma con la perpetua ripetizione del loop stesso e quindi sostanzialmente della sottrazione, queste probabilità aumentano drasticamente.
Anch'io non considero una buona cosa la disabilitazione del GIE ma è poi quello che in quel documento viene fatto ricorrendo alla "get_tick_count ()".
Insomma, la spiegazione è plausibile ma non mi convince, di per sé, per spiegare il tuo caso.

Saluti
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
30,2k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 8986
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

0
voti

[43] Re: Problema grave in interrupt

Messaggioda Foto Utenteivanpascolo » 9 nov 2014, 22:46

Magari, anziché disabilitare tutti gli interrupt, basta disabilitare solo quello del timer0 ma è una soluzione ... poco elegante e non mi piace.
Se scopro altro vi terrò informati.

Grazie per la pazienza e la disponibilità.
Avatar utente
Foto Utenteivanpascolo
20 3
New entry
New entry
 
Messaggi: 71
Iscritto il: 29 set 2014, 20:44

1
voti

[44] Re: Problema grave in interrupt

Messaggioda Foto UtenteWALTERmwp » 9 nov 2014, 23:05

Rimanendo nell'ambito di quella ipotesi ci sarebbe una possibilità per limitare i tempi della disabilitazione dell'interrupt e consisterebbe più semplicemente nell'appoggiare "sys_tick" su un'altra variabile prima di eseguire la sottrazione; rispetto a questa l'operazione, il "move", seppure esteso ad un long, impegna solo qualche ciclo macchina quindi forse due o tre microsecondi se si immagina di passare 4 byte verso il W register e da questo alla destinazione:
Codice: Seleziona tutto
(...)
INTCONbits.TMR0IE = 0;
tmp_sys_tick = sys_tick;
INTCONbits.TMR0IE = 1;
t1 = tmp_sys_tick - t0;
(...)
Saluti
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
30,2k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 8986
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

0
voti

[45] Re: Problema grave in interrupt

Messaggioda Foto Utenteivanpascolo » 10 nov 2014, 10:09

E' un'ottima soluzione e sicuramente piu' veloce, verificherò i tempi con l'oscilloscopio.
Avatar utente
Foto Utenteivanpascolo
20 3
New entry
New entry
 
Messaggi: 71
Iscritto il: 29 set 2014, 20:44

0
voti

[46] Re: Problema grave in interrupt

Messaggioda Foto UtenteWALTERmwp » 10 nov 2014, 12:12

Per il riscontro dei multipli non trovo una causa che fornisca una spiegazione convincente ma, in pratica, è come se si verificasse l'azzeramento del byte meno significativo come manifestazione dell'alterazione del contenuto della variabile long.

Saluti
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
30,2k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 8986
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

0
voti

[47] Re: Problema grave in interrupt

Messaggioda Foto Utenteivanpascolo » 10 nov 2014, 12:32

Nel frattempo posto la parte di codice in assembler (che non mi è di facile comprensione)
Codice: Seleziona tutto
16:                   
17:                   
18:                    t1 = sys_tick - t0;                             
002A  0870     MOVF sys_tick, W
002B  0020     MOVLB 0x0
002C  00A8     MOVWF __pcstackBANK0
002D  0871     MOVF 0x71, W
002E  00A9     MOVWF 0x29
002F  0872     MOVF 0x72, W
0030  00AA     MOVWF 0x2A
0031  0873     MOVF 0x73, W
0032  00AB     MOVWF 0x2B
0033  0924     COMF t0, W
0034  00AC     MOVWF 0x2C
0035  0925     COMF 0x25, W
0036  00AD     MOVWF 0x2D
0037  0926     COMF 0x26, W
0038  00AE     MOVWF 0x2E
0039  0927     COMF 0x27, W
003A  00AF     MOVWF 0x2F
003B  0AAC     INCF 0x2C, F
003C  1903     BTFSC STATUS, 0x2
003D  0AAD     INCF 0x2D, F
003E  1903     BTFSC STATUS, 0x2
003F  0AAE     INCF 0x2E, F
0040  1903     BTFSC STATUS, 0x2
0041  0AAF     INCF 0x2F, F
0042  082C     MOVF 0x2C, W
0043  07A8     ADDWF __pcstackBANK0, F
0044  082D     MOVF 0x2D, W
0045  3DA9     ADDWFC 0x29, F
0046  082E     MOVF 0x2E, W
0047  3DAA     ADDWFC 0x2A, F
0048  082F     MOVF 0x2F, W
0049  3DAB     ADDWFC 0x2B, F
004A  082B     MOVF 0x2B, W
004B  00B3     MOVWF 0x33
004C  082A     MOVF 0x2A, W
004D  00B2     MOVWF 0x32
004E  0829     MOVF 0x29, W
004F  00B1     MOVWF 0x31
0050  0828     MOVF __pcstackBANK0, W
0051  00B0     MOVWF t1
Avatar utente
Foto Utenteivanpascolo
20 3
New entry
New entry
 
Messaggi: 71
Iscritto il: 29 set 2014, 20:44

Precedente

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 4 ospiti