Problema grave in interrupt
Moderatore:
Paolino
47 messaggi
• Pagina 2 di 5 • 1, 2, 3, 4, 5
1
voti
Con quale versione di XC8 stai lavorando?
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong
-------------------------------------------------------------
PIC Experience - http://www.picexperience.it
-------------------------------------------------------------
PIC Experience - http://www.picexperience.it
-

Paolino
32,6k 8 12 13 - G.Master EY

- Messaggi: 4226
- Iscritto il: 20 gen 2006, 11:42
- Località: Vigevano (PV)
0
voti
Ho provato a compilare con tutte le ultime versioni 1.30, 1.31, 1.32 e 1.33 ma niente.
-

ivanpascolo
20 3 - New entry

- Messaggi: 71
- Iscritto il: 29 set 2014, 20:44
2
voti
Un altro paio di considerazioni:
1. hai provato senza WDT a vedere cosa accade?
2. stai usando il simulatore o sei diretto sulla scheda?
3. ai fini della gestione dell'interrupt, quando si scatena a causa di TMR0IF == 1, non è necessario specificare la condizione di verifica se TMR0IE == 1. Il codce funziona anche così:
Se proprio vuoi metterla, però, userei le parentesi in questo modo:
Ciao.
Paolo.
1. hai provato senza WDT a vedere cosa accade?
2. stai usando il simulatore o sei diretto sulla scheda?
3. ai fini della gestione dell'interrupt, quando si scatena a causa di TMR0IF == 1, non è necessario specificare la condizione di verifica se TMR0IE == 1. Il codce funziona anche così:
- Codice: Seleziona tutto
void interrupt ISR (void){
if(INTCONbits.TMR0IF == 1)
{
INTCONbits.TMR0IF = 0;
sys_tick ++;
}
}
Se proprio vuoi metterla, però, userei le parentesi in questo modo:
- Codice: Seleziona tutto
void interrupt ISR (void){
if((INTCONbits.TMR0IE == 1) && (INTCONbits.TMR0IF == 1))
{
INTCONbits.TMR0IF = 0;
sys_tick ++;
}
}
Ciao.
Paolo.
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong
-------------------------------------------------------------
PIC Experience - http://www.picexperience.it
-------------------------------------------------------------
PIC Experience - http://www.picexperience.it
-

Paolino
32,6k 8 12 13 - G.Master EY

- Messaggi: 4226
- Iscritto il: 20 gen 2006, 11:42
- Località: Vigevano (PV)
0
voti
Adesso provo a disabilitare il WDT, per il reso sto provando direttamente sulla scheda.
Per quanto riguarda l'impostazione dei registri è quello che genera il code generator di Microchip e nella mia applicazione utilizzo anche altri interrupt che via via ho eliminato per stringere il firmware.
Comunque le tempistiche del interrupt sono perfette.
Adesso provo la questione del WDT.
Per quanto riguarda l'impostazione dei registri è quello che genera il code generator di Microchip e nella mia applicazione utilizzo anche altri interrupt che via via ho eliminato per stringere il firmware.
Comunque le tempistiche del interrupt sono perfette.
Adesso provo la questione del WDT.
-

ivanpascolo
20 3 - New entry

- Messaggi: 71
- Iscritto il: 29 set 2014, 20:44
1
voti
Intanto, per vedere se ho capito bene, prova a fare così: lasci l'interrupt a 1ms, e ne conti 100. Quando sono passati 100 interrupt, sono trascorsi anche 100ms. Usi un flag per settare l'evento:
Così mi sembra più pulito.
Ciao.
Paolo.
- Codice: Seleziona tutto
unsigned char flag 100ms;
void interrupt ISR (void){
if(INTCONbits.TMR0IF == 1)
{
INTCONbits.TMR0IF = 0;
sys_tick ++;
if (sys_tick >100)
{
sys_tick = 0;
flag100ms = 1;
}
}
}
void main (void)
{
....................
....................
....................
flag100ms = 0;
while (1)
{
if (flag100ms == 1)
{
flag100ms = 0;
FaccioQualcosa();
}
}
}
Così mi sembra più pulito.
Ciao.
Paolo.
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong
-------------------------------------------------------------
PIC Experience - http://www.picexperience.it
-------------------------------------------------------------
PIC Experience - http://www.picexperience.it
-

Paolino
32,6k 8 12 13 - G.Master EY

- Messaggi: 4226
- Iscritto il: 20 gen 2006, 11:42
- Località: Vigevano (PV)
0
voti
La soluzione che mi proponi è comunque quella di bypassare il problema, cosa che farò se non ne vengo a capo.
In pratica ho una base tempi di 1ms e la uso in questo modo:
carico sys_tick in una variabile timer
Timer = sys_tick;
Poi ad un certo punto verifico se è passato il tempo che mi interessa:
if ((sys_tick - Timer)>100){
......
}
Quindi al trascorrere del tempo sys_tick e Timer hanno valori via via crescendo
In pratica ho una base tempi di 1ms e la uso in questo modo:
carico sys_tick in una variabile timer
Timer = sys_tick;
Poi ad un certo punto verifico se è passato il tempo che mi interessa:
if ((sys_tick - Timer)>100){
......
}
Quindi al trascorrere del tempo sys_tick e Timer hanno valori via via crescendo
-

ivanpascolo
20 3 - New entry

- Messaggi: 71
- Iscritto il: 29 set 2014, 20:44
1
voti
Devo caricare il progetto nel simulatore e vedere cosa succede.
Vorrei capire per bene cosa fa questo compilatore.
Mi sembra però che la mia soluzione sia non tanto una scorciatoia, quanto quella notoriamente impiegata per contare il tempo mediante interrupt.
Ciao.
Paolo.
Vorrei capire per bene cosa fa questo compilatore.
Mi sembra però che la mia soluzione sia non tanto una scorciatoia, quanto quella notoriamente impiegata per contare il tempo mediante interrupt.
Ciao.
Paolo.
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong
-------------------------------------------------------------
PIC Experience - http://www.picexperience.it
-------------------------------------------------------------
PIC Experience - http://www.picexperience.it
-

Paolino
32,6k 8 12 13 - G.Master EY

- Messaggi: 4226
- Iscritto il: 20 gen 2006, 11:42
- Località: Vigevano (PV)
2
voti
Hai ragione, quello che ho utilizzato è un sistema poco in uso e lo utilizzava un ex collaboratore dell'azienda presso cui lavoro.
Ho importato alcune parti dei sui programmi e ho mantenuto pertanto questo sistema, lui però utilizzava un ARM dove tutto è a 32 bit... e forse per questo motivo è filato sempre tutto liscio.
Attenzione però, non so se l'interrupt funziona con il simulatore.
Scusami tanto ma adesso devo andare... la famiglia si è alzata e sai...
Tra una pausa e l'altra continuerò a provare e ti terrò aggiornato.
Grazie mille della tua disponibilità.
Ho importato alcune parti dei sui programmi e ho mantenuto pertanto questo sistema, lui però utilizzava un ARM dove tutto è a 32 bit... e forse per questo motivo è filato sempre tutto liscio.
Attenzione però, non so se l'interrupt funziona con il simulatore.
Scusami tanto ma adesso devo andare... la famiglia si è alzata e sai...
Tra una pausa e l'altra continuerò a provare e ti terrò aggiornato.
Grazie mille della tua disponibilità.
-

ivanpascolo
20 3 - New entry

- Messaggi: 71
- Iscritto il: 29 set 2014, 20:44
1
voti
Di nulla
Ciao.
Paolo.
P.S. Sì, l'interrupt funziona con il simulatore
Ciao.
Paolo.
P.S. Sì, l'interrupt funziona con il simulatore
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong
-------------------------------------------------------------
PIC Experience - http://www.picexperience.it
-------------------------------------------------------------
PIC Experience - http://www.picexperience.it
-

Paolino
32,6k 8 12 13 - G.Master EY

- Messaggi: 4226
- Iscritto il: 20 gen 2006, 11:42
- Località: Vigevano (PV)
47 messaggi
• Pagina 2 di 5 • 1, 2, 3, 4, 5
Torna a Firmware e programmazione
Chi c’è in linea
Visitano il forum: Nessuno e 13 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)