Newsgroup: it.hobby.elettronica.digitale
Titolo: Interrupt

Salve!
Nei micro della microchip ho visto che quando c'e' un interrupt (possono 
essere generati in diversi modi timer ingressi ecc..) il programma viene 
dirottato alla routine di interrupt che ovviamente viene eseguita, noto che 
alla fine dell' interrupt il programma prosegue dalla riga succesiva alla 
richiesta di interrupt, questo e' l'unico modo? cioe' volendo si puo' fare 
che alla fine dell'interrupt il programma possa procedere da routine chenon 
sia necessariamente il prseguo prima dell'interrupt?
Mi spiego con un esempio se abbiamo una centralina per cancelli con le 
fotocellule di sicurezza che pilotano un ingresso abilitato all'interrupt, 
cosa succede in caso di chiusura del cancello ed uno osatacolo interrompe il 
fascio infrrarosso delle fotocellule? parte l'interrupt che ferma il 
cancello e lo riapre completamente a fine interrupt il programam torna dove 
era priam dell'interrupt ed ovviamente richiude il cancello, se invece dopo 
l' interrupt il cancello dovesse riamanere fermo come si puo' fare? 

 l' interrupt il cancello dovesse riamanere fermo come si puo' fare? 
Nella routine di interrupt - che si genera quando la fotocellula viene 
interrotta - puoi impostare un flag che dice che c'è un ostacolo. Una 
riga di codice... ed esci subito di lì :)
Poi nel ciclo principale del programma gestirai le varie condizioni. 
Avrai un altro flag per sapere se il cancello è apreto, chiuso o in 
movimento. A seconda delle esigenze farai fare le operazioni necessarie 
valutando la variabile "ostacolo" gestita dall'interrupt.
Spero di essermi capito :P
Ciao!
Marco / iw2nzm

 ha scritto nel messaggio 
news:4730d547$0$16033$5fc...@news.tiscali.it...

Certo che si può, con l'istruzione RETFIE, se vuoi imparare le basi ti posso 
passare un bel manuale di assembly per pic16f84 (la base di tutto)

 ha scritto nel messaggio 
news:47318041$0$17952$4faf...@reader1.news.tin.it...

Scusa, non avevo capito bene la domanda, il ritorno da Interrupt è 
"OBBLIGATORIO", per funzionare correttamente deve esserci,
quello che intendi tu si può fare in molti modi, dipende da come è fatto il 
codice, se hai il sorgente dovrebbe essere facile modificarlo....

 ha scritto nel messaggio 
news:4730d547$0$16033$5fc...@news.tiscali.it...

Devi cercarre di utilizzare ogni risorsa del micro, nel modo opportuno.
Tieni innanzitutto presente che le routines di interrupt, 'interrompono' il 
ciclo principale del programma.
Essendo il ciclo appunto 'principale' deve compiere tutte le operazioni + 
importanti e avere sempre sotto controllo lo stato generale 
dell'applicazione.
Le routines di interrupt devono perciò essere fini solo al proprio compito 
ed essere le più brevi possibili (come durata temporale).
Al loro interno in genere si evita quindi di effettuare comandi su uscite, 
letture di ingressi, cicli di attesa.
Un ingresso digitale che deve contare impulsi o rapide variazioni ha senso 
che sia associato ad un interrupt.
In genere un ingresso che deve solo essere monitorato come stato ed 
eventualemente essere ulteriormente filtrado digitalmente per evitare 
'rimbalzi' o disturbi, può essere benissimo letto in polling.
Il ciclo principale del programma se scritto come si deve e basato su una 
macchina a stati, dura solo poche centinaia di istruzioni, già a 4MHz questo 
consente di leggere gli ingressi ad una frequenza notevole potendoli poi 
gestire di coneguenza.
Il tuo esempio potrebbe essere ricondotto a:
void stop_chiusura(void){
  chiusura=0;
  ...comando stop motore chiusura
}
void start_chiusura(void){
  chiusura=1;
  ...comando start motore chiusura
}
void stop_apertura(void){
  apertura=0;
  ...comando stop motore apertura
}
void start_apertura(void){
  apertura=1;
  ...comando start motore apertura
}
void main(void) {
  apertura=0;
  chiusura=0;
  while (1) {
    leggi_e_filtra_ingressi();
    ...
    if (chiusura) {
      if (ingresso_fotocellula_esterna) {
        stop_chiusura();
        ...ritardo...
        start_apertura();
      }else if (ingresso_micro_chiusura) stop_chiusura();
    }
    if (apertura) {
      if (ingresso_fotocellula_interna) {
        stop_apertura();
        ...ritardo...
        start_chiusura();
      }else if (ingresso_micro_chiusura) stop_apertura();
    }
  }
}
Come vedi con una struttura simile, in qualsisi condizione puoi sempre 
decidere tu cosa fare.
Con la possibilità di filtrare digitalmente gli input per togliere per 
esempio disturbi dei 50Hz o picchi dovuti all'azionamento motori.
Roberto P. 


Non c'entra con l'interrupt, pero' tieni presente che le sicurezze di una
automazione non dovrebbero fare affidamento solo sul software.
Non so se esistono delle norme di legge in proposito, ma io in questi
casi farei in modo che la fotocellula agisse direttamente sull'alimentazione
del motore.
 
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/