Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Interupt su TMR0 & RBIF con gestirli in contemporanea

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] Interupt su TMR0 & RBIF con gestirli in contemporanea

Messaggioda Foto Utentefloppinoo » 28 mar 2012, 0:22

Ho un piccolo mistero da capire sugli interup e specialmente il modo con cui interagire se devo gestire due tipi diversi di interup nel mio caso particolare l'interup su TMR0 e il classico RBIF
in pratica ho creato un orologio tramite interput tmr0 e fin qui ci siamo
Codice: Seleziona tutto
  ORG 04H   
      btfsc INTCON,TOIF
      call gestioneTOIF               
      btfsc INTCON, RBIF
      call gestioneRBIF 
      retfie


Codice: Seleziona tutto
gestioneRBIF
      bcf INTCON, RBIF
      btfss PORTB, AVVIO
      call avvio
      return

gestioneTOIF
                bcf INTCON, TOIF
      call timer
                return


il mio dubbio è questo,

Nel mio programma l'interput su TMR0 avviene ogni 8 millisecondi, quindi ogni 8 millisecondi viene richiamata la funzione timer, invece se premo il pulsante su PORTB AVVIO (7), mi parte una procedura di nome avvio....
Il mio dubbio è questo, se supponiamo che inizialmente schiaccio il pulsante per attivare la procedura avvio e questa procedura per completarsi necessita di un tempo superiore agli 8 millisecondi .... quando scattera il prossimo interput su TMR0, il mio programma ritorna sull' lultima istruzione che gestiva l'interput generato dal tasto avvio, oppure ritorna al main principale .....
In pratica se ho una procedura sul tasto avvio che supera gli 8 millisecondi il programma non sara mai terminato ????

o sono io che gestisco male la logica degli interput, nel mio progetto in pratica con il tmr0
ho creato una specie di orologio interno con ore minuti e secondi, invece se schiaccio il tasto invio
eseguo un delay di 2 minuti alla fine di questi 2 minuti si accende un led ....
ho provato a eseguire il codice ma il led non si accende mai invece l'orologio e l'interupt tmr0 funzionano
chi mi svela l'arcano

il problema che non posso fermare l'interupt su TMR0 perche capite bene che in questo caso avrei ogni volta che premo il tasto invio un ritardo sull'orologio di due minuti ..... qualcuno ha un idea di come poter gestire la cosa
Avatar utente
Foto Utentefloppinoo
205 1 3 7
Sostenitore
Sostenitore
 
Messaggi: 508
Iscritto il: 24 lug 2010, 9:26

0
voti

[2] Re: Interupt su TMR0 & RBIF con gestirli in contemporanea

Messaggioda Foto UtenteRobert8 » 28 mar 2012, 0:59

Vista l'ora ho dato solo una rapida occhiata al tuo problema e, andando a memoria, potrei prendere una cantonata. Premesso ciò:
1) Se stai usando il PIC16, gli interrupt non hanno priorità: il secondo deve aspettare che finisca il primo.
2) Se il tasto avvio ti imposta PORTB,AVVIO = 1 magari il programma entra nell'interrupt ma poi col BTFSS salta e non fa nulla.
Avatar utente
Foto UtenteRobert8
3.449 2 8 13
Master EY
Master EY
 
Messaggi: 373
Iscritto il: 15 giu 2011, 16:30

0
voti

[3] Re: Interupt su TMR0 & RBIF con gestirli in contemporanea

Messaggioda Foto Utentesimo85 » 28 mar 2012, 1:20

Quando viene eseguita una interruzione automaticamente viene disabilitato il GIE per evitare che vengano attese altre interruzioni allo stesso tempo, per poi essere riabilitato ad esecuzione terminata, come appunto si può leggere qui.
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

0
voti

[4] Re: Interupt su TMR0 & RBIF con gestirli in contemporanea

Messaggioda Foto Utentefloppinoo » 28 mar 2012, 1:22

1) Se stai usando il PIC16, gli interrupt non hanno priorità: il secondo deve aspettare che finisca il primo.

cioè vuoi dire che se faccio partire la procedura legata all'interupt avvio (dove ho un delay di 2 minuti) , l'interupt del TMR0 risulterà bloccato per due minuti ?? quindi avrei sempre 2 minuti di ritardo perche il timer gestito da TMR0 deve aspettare i comodi di RBIF ........... ???

ops perche se è cosi ho capito il motivo del led mi sa che ho creato uno stallo ... perche io in pratica
creavo il delay di 2 minuti leggendo le variabili aggiornate dalla procedura timer collegato all'interupt TMR0
il che significa che se ora sono alle ore 14:00 e con il tasto invio faccio un controllo sui minuti aspettando che arrivi alle 14:02 ho creato uno stallo perche TMR0 non portera mai la variabile minuti a 02 visto che è bloccata dall'interput avvio e la procedura avvio non leggera mai le 14:02 ..... ma ho creato il famigerato Deadlock in pratica ghghghgghh

Ora l'unica soluzione e crearmi un delay con un ciclo di 2 minuto e poi magari al richiamo del nuovo tmr0 ripostare l'ora ogni volta di 2 minuti in avanti, nel caso in cui sia stato eseguito l'interput sul tasto invio ... la vedo lunica soluzione anche se non elegante per mantenere preciso il contegio dell'ora

voi cosa mi consigliate ... ??? :?:
Avatar utente
Foto Utentefloppinoo
205 1 3 7
Sostenitore
Sostenitore
 
Messaggi: 508
Iscritto il: 24 lug 2010, 9:26

0
voti

[5] Re: Interupt su TMR0 & RBIF con gestirli in contemporanea

Messaggioda Foto Utentesimo85 » 28 mar 2012, 1:27

Non implementare una interrupt da 2 minuti. Quello che puoi fare è contare le interrupt, quando il contatore raggiunge un determinato valore eseguirai una parte di codice. Se non basta un valore ad 8 bit per il contatore, ne usi più di uno.
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

0
voti

[6] Re: Interupt su TMR0 & RBIF con gestirli in contemporanea

Messaggioda Foto Utentefloppinoo » 28 mar 2012, 1:33

capito grazie sia dei consigli che della risposte :ok: siete superrrrrr


quindi mi confermate che gli interupt non possono mai essere eseguiti simultaneamente, cioè lla fine vengono eseguiti sempre in maniera sequenziale giusto ??? .Questo avviene su ogni PIC o ci sono dei PIC che permettono anche la gestione simultanea di due interup ....
Avatar utente
Foto Utentefloppinoo
205 1 3 7
Sostenitore
Sostenitore
 
Messaggi: 508
Iscritto il: 24 lug 2010, 9:26

0
voti

[7] Re: Interupt su TMR0 & RBIF con gestirli in contemporanea

Messaggioda Foto Utentesimo85 » 28 mar 2012, 1:47

Diciamo che normalmente un dispositivo può fare una cosa alla volta, a quale velocità è un altro discorso. :-)
A questo PDF si può leggere qualcosa di più sulla gestione delle interrupt per i PIC32, dove appunto tratta la priorità di esecuzione, ma non si fa riferimento all'esecuzione simultanea di più interrupt.
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

0
voti

[8] Re: Interupt su TMR0 & RBIF con gestirli in contemporanea

Messaggioda Foto UtenteRobert8 » 28 mar 2012, 12:14

Anche nei PIC18 c'è la gestione della priorità degli Interrupt. Per esempio nel PIC18F4550 puoi assegnare un Interrupt con priorità alta che riuscirà ad interrompere un altro interrupt a priorità bassa. Naturalmente il tutto è sequenziale:

pgm normale --> Int Low--> Int High che interrompe il precedente --> Int Low che riprende dove era stato fermato --> pgm normale.
Avatar utente
Foto UtenteRobert8
3.449 2 8 13
Master EY
Master EY
 
Messaggi: 373
Iscritto il: 15 giu 2011, 16:30

3
voti

[9] Re: Interupt su TMR0 & RBIF con gestirli in contemporanea

Messaggioda Foto Utentefloppinoo » 28 mar 2012, 13:02

Grazie raga delle dritte ^_^

comunque ho risoto praticamente in questo modo

ho creato una procedura di polling che mi creia un ritardo di 1 secondo deleySecondo (senza tmr0) e questa procedura la richiamo 120 volte per crearmi i 2 minuti

ora riesco facilmente a mantenere esatta l'ora con il timer di TMR0 in questo modo:

ogni volta che chiamo la procedura di deleySecondo chiamo anche timerSecondo di TMR0

GRAZIE comunque DELLE DRITTE ^_^
Avatar utente
Foto Utentefloppinoo
205 1 3 7
Sostenitore
Sostenitore
 
Messaggi: 508
Iscritto il: 24 lug 2010, 9:26

0
voti

[10] Re: Interupt su TMR0 & RBIF con gestirli in contemporanea

Messaggioda Foto Utentesimo85 » 28 mar 2012, 13:14

Bravissimo Foto Utentefloppinoo, fa piaciere vedere qualcuno che si impegna e risolve a partire dai consigli che gli sono stati dati. :ok:

Buon divertimento con i microcontrollori. :mrgreen:
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59


Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 8 ospiti