Hai verificato che la procedura dell'interrupt sia conclusa prima che arrivi l'interrupt successivo?
Prova a disattivare l'interrupt all'inizio e a riattivarlo alla fine della <>_ISR, in questo modo sei sicuro di non avere interrupt sovrapposti con i relativi problemi.
Problema grave in interrupt
Moderatore:
Paolino
47 messaggi
• Pagina 4 di 5 • 1, 2, 3, 4, 5
0
voti
http://millefori.altervista.org
Tool gratuito per chi sviluppa su millefori.
Tutti sanno che una cosa è impossibile da realizzare, finché arriva uno sprovveduto che non lo sa e la inventa. (A. Einstein)
Se non c'e` un 555 non e` un buon progetto (IsidoroKZ)
Strumento per formule
Tool gratuito per chi sviluppa su millefori.
Tutti sanno che una cosa è impossibile da realizzare, finché arriva uno sprovveduto che non lo sa e la inventa. (A. Einstein)
Se non c'e` un 555 non e` un buon progetto (IsidoroKZ)
Strumento per formule
-

posta10100
5.550 4 10 13 - Master EY

- Messaggi: 4832
- Iscritto il: 5 nov 2006, 0:09
0
voti
Adesso ho fatto così e sbaglia ancora, all'ingresso ho disabilitato tutti gli interrupt, incremento la mia variabile e prima di uscire ricarica le variabili dell'interrupt e riabilito gli interrupt.
- Codice: Seleziona tutto
void TMR0_ISR(void)
{
INTCONbits.GIE = 0;
sys_tick++;
static volatile unsigned int CountCallBack = 0;
// clear the TMR0 interrupt flag
INTCONbits.TMR0IF = 0;
TMR0 += timer0ReloadVal;
// callback function - called every 1000th pass
if (++CountCallBack >= TMR0_INTERRUPT_TICKER_FACTOR)
{
// ticker function call
TMR0_CallBack();
// reset ticker counter
CountCallBack = 0;
}
// add your TMR0 interrupt custom code
INTCONbits.GIE = 1;
//LATAbits.LATA5 = ~ LATAbits.LATA5 ; // toggle FOUT = 500Hz
}
-

ivanpascolo
20 3 - New entry

- Messaggi: 71
- Iscritto il: 29 set 2014, 20:44
0
voti
Se qualcuno vuole, potrei inviargli l'intero progetto (l'ho ridotto all'osso per comprenderlo meglio) dato che sbaglia anche in simulazione.Magari dopo continuiamo la discussione nel forum.
Ho anche verificato il listato in assembler e i RETURN li mette in automatico.
Ho anche verificato il listato in assembler e i RETURN li mette in automatico.
-

ivanpascolo
20 3 - New entry

- Messaggi: 71
- Iscritto il: 29 set 2014, 20:44
0
voti
... il GIE viene cancellato automaticamente quando insorge un interrupt, quindi credo non sia questo che in un modo o nell'altro falsi i risultati.posta10100 ha scritto:Prova a disattivare l'interrupt all'inizio e a riattivarlo alla fine della <>_ISR, in questo modo sei sicuro di non avere interrupt sovrapposti
Forse potrei essermi perso qualcosa ma se l'anomalia che riscontri consiste "solo" nei valori incongruenti che ti restituisce il debug, escludendo altri comportamenti strani, continuando sulla falsa riga della mia precedente ipotesi, per quanto strana, ti suggerirei, piuttosto, di inserire l'istruzione per disabilitare il GIE e di riabilitare il GIE, rispettivamente, prima e dopo il punto (la istruzione) in corrispondenza del quale vuoi controllare i valori delle variabili.
E' solo una prova in più.
Saluti
W - U.H.F.
-

WALTERmwp
30,2k 4 8 13 - G.Master EY

- Messaggi: 8986
- Iscritto il: 17 lug 2010, 18:42
- Località: le 4 del mattino
0
voti
Intendi così:
Ma non funziona, si ferma con questi valori:
sys_tick = 2816
t0 = 2727
t1 = 344
sys_tick è sempre multiplo di 256, in qualunque punto si fermi.
- Codice: Seleziona tutto
#define _XTAL_FREQ 32000000 //Used by the XC8 delay_ms(x) macro
#include "mcc_generated_files/mcc.h"
unsigned long sys_tick = 0, t0 = 0, t1 = 0;
void main(void)
{
SYSTEM_Initialize();
INTERRUPT_GlobalInterruptEnable();
INTERRUPT_PeripheralInterruptEnable();
/**********************************************************
* PROGRAMMA PRINCIPALE *
*********************************************************/
while (1){
t1 = sys_tick - t0;
INTCONbits.GIE = 0;
if ((t1) > 100) {
if ((t1<100)||(t1>101)){
LATAbits.LATA5 = ~ LATAbits.LATA5 ;
}
else t0=sys_tick;
}
INTCONbits.GIE = 1;
}
}
Ma non funziona, si ferma con questi valori:
sys_tick = 2816
t0 = 2727
t1 = 344
sys_tick è sempre multiplo di 256, in qualunque punto si fermi.
-

ivanpascolo
20 3 - New entry

- Messaggi: 71
- Iscritto il: 29 set 2014, 20:44
0
voti
Da "qui" non è proprio semplice trovare una soluzione però se mi limito a considerare i valori che hai riportato noto che la differenza (sys_tick - t0) dovrebbe essere pari a:
Post [1] -> 20
Post [2] -> 59
Post [35] -> 89
... al contrario rispetto a quanto hai visualizzato.
Questa differenza è sempre inferiore a 101 e sys_tick è sempre maggiore di t0; quindi in coerenza con quanto ci si dovrebbe attendere.
Curioso il riscontro quale multiplo di [256], cosa che però nel Post [1] non vale.
Non sono per la "caccia" agli ectoplasmi ma io non so ancora dirti cosa non va.
Ho immaginato, per esempio, che la variabile t1, da te visualizzata nel debug, non sia quella utilizzata nella esecuzione della sottrazione; scriverai che non è possibile ma, è una delle cose che posso pensare.
Le variabili coinvolte sono generali, non sono sullo stack e sono tutte dello stesso tipo; non è che da qualche parte c'è un'altra t1 ?
Quando fai il debug, l'output come lo ottieni ?
Potresti inserire in un Post lo screenshot ?
Hai fatto una verifica dei valori delle tre variabili posizionando il breakpoint sulla istruzione che esegue la sottrazione ?
Le domande potrebbero apparire fuori luogo però vale quanto scritto nella prima riga.
Saluti
Post [1] -> 20
Post [2] -> 59
Post [35] -> 89
... al contrario rispetto a quanto hai visualizzato.
Questa differenza è sempre inferiore a 101 e sys_tick è sempre maggiore di t0; quindi in coerenza con quanto ci si dovrebbe attendere.
Curioso il riscontro quale multiplo di [256], cosa che però nel Post [1] non vale.
Non sono per la "caccia" agli ectoplasmi ma io non so ancora dirti cosa non va.
Ho immaginato, per esempio, che la variabile t1, da te visualizzata nel debug, non sia quella utilizzata nella esecuzione della sottrazione; scriverai che non è possibile ma, è una delle cose che posso pensare.
Le variabili coinvolte sono generali, non sono sullo stack e sono tutte dello stesso tipo; non è che da qualche parte c'è un'altra t1 ?
Quando fai il debug, l'output come lo ottieni ?
Potresti inserire in un Post lo screenshot ?
Hai fatto una verifica dei valori delle tre variabili posizionando il breakpoint sulla istruzione che esegue la sottrazione ?
Le domande potrebbero apparire fuori luogo però vale quanto scritto nella prima riga.
Saluti
W - U.H.F.
-

WALTERmwp
30,2k 4 8 13 - G.Master EY

- Messaggi: 8986
- Iscritto il: 17 lug 2010, 18:42
- Località: le 4 del mattino
0
voti
Ha ragione, al post1 sys_tick non è multiplo di 256 (su una ventina di numeri che mi sono trascritto è l'unico), spero di non aver sbagliato a trascriverlo.
Ho verificato (anche utilizzando la funzione find del MPLAB), t0 e t1 sono dichiarate solo nel main.c mentre sys_tick è dichiarato come "extern" anche nel timer0.c.
Per il debug ho messo un breakpoint sull'istruzione LATAbits.LATA5 = ~ LATAbits.LATA5.
Si seguito uno screenshot fatto e lo sto al breakèpoint, il tutto fatto con il simulatore.
[img]screenshot[/img]
Ho verificato (anche utilizzando la funzione find del MPLAB), t0 e t1 sono dichiarate solo nel main.c mentre sys_tick è dichiarato come "extern" anche nel timer0.c.
Per il debug ho messo un breakpoint sull'istruzione LATAbits.LATA5 = ~ LATAbits.LATA5.
Si seguito uno screenshot fatto e lo sto al breakèpoint, il tutto fatto con il simulatore.
[img]screenshot[/img]
-

ivanpascolo
20 3 - New entry

- Messaggi: 71
- Iscritto il: 29 set 2014, 20:44
0
voti
... a questo punto mi viene il dubbio che potesse essere 23040 e non 23048 ( ... forse hai ripetuto l'otto che invece è presente nell'altro valore).ivanpascolo ha scritto:Ha ragione, al post1 sys_tick non è multiplo di 256 (su una ventina di numeri che mi sono trascritto è l'unico), spero di non aver sbagliato a trascriverlo.
Quindi, se anche gli altri osservati e non riportati nei Post(s) erano multipli è, con buona probabilità, fatto indicativo di qualche cosa che ancora "sfugge" all'intenzione.
Come ti avevo scritto, posiziona il breakpoint sulla linea [14], dove esegui la sottrazione.
... ma non stavi provando sull'hardware ?ivanpascolo ha scritto:il tutto fatto con il simulatore.
Saluti
W - U.H.F.
-

WALTERmwp
30,2k 4 8 13 - G.Master EY

- Messaggi: 8986
- Iscritto il: 17 lug 2010, 18:42
- Località: le 4 del mattino
0
voti
Si, stavo provando con l' hardware ma poi Paolino mi ha consigliato di provare con il simulatore.
Se metto il breakpoint alla linea 14 il programma in pratica rimane sempre piantato ma proverò anche questo. Sulla scheda ho anche una seriale, proverò a leggere i valori di sys_tick, t0 e t1 mentre il programma gira.
Se metto il breakpoint alla linea 14 il programma in pratica rimane sempre piantato ma proverò anche questo. Sulla scheda ho anche una seriale, proverò a leggere i valori di sys_tick, t0 e t1 mentre il programma gira.
-

ivanpascolo
20 3 - New entry

- Messaggi: 71
- Iscritto il: 29 set 2014, 20:44
0
voti
In rete ho trovato questo, cercherò di capire se è l'origine dei miei problemi.
- Allegati
-
Beyond_volatile.pdf- (51.01 KiB) Scaricato 173 volte
-

ivanpascolo
20 3 - New entry

- Messaggi: 71
- Iscritto il: 29 set 2014, 20:44
47 messaggi
• Pagina 4 di 5 • 1, 2, 3, 4, 5
Torna a Firmware e programmazione
Chi c’è in linea
Visitano il forum: Nessuno e 12 ospiti

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)