Vai al contenuto
PLC Forum


Qunate Cose Può Fare Un Pic Contemporaneamente ? - '' Multitasking '' su microController


tatonilo

Messaggi consigliati

Gentili Sigg.ri,

mi sto affacciando da poco sul mondo dei Ucontrollori e avrei alcuni dubbi da eporVi nel caso qualcouno abbia già incontrato i miei problemi.

Ho deciso di "buttarmi" sui chip della Microchip (che fantasia .....!!!!! ???!!!!) vista la varietà di letteratura e di applicazioni facilmente rintracciabilei ad oggi.

Premetto che da più di 15 anni programmo PLC, dai remoti Melsec, facendo un capatina sui Siemens ecc.ecc. . E so, ovvero ho visto, come io posso dire ad un PLC di fare una certa operazione (attiva OUT Y) dopo un tempo X dall'evento Z.

Ok come posso dirgli di fare che so di contare un numero di pezzi che passano sul nastro e nello stesso tempo di gestirmi le elettrovalvole di espulsione pezzi a fine nastro e di entrata pezzo a inizio del suddetto nastro .... tanto per fare un esempio di una semplicità indegna....

Se, nel primo caso, l'evento cessa, la temporizzazione si ferma, e l'out Y resta a zero..... Ma tutto questo il PLC lo fa in automatico, senza che io gli dica di verificare ogni "n" msec se l'input X è ancora alto oppure è sceso a livello 0 .

Ma sono perplesso, per esempio, sulla stessa applicazione su un PIC.

Ovvero:

. verifico l'ingresso (BTFSC port_a,0)

.. se alto salto alla label interessata (GOTO COUNT)

... se basso, salta l'istruzione GOTO ed avzzera l'uscita, resetta il contatore, ecc. ecc.. torna a verificare l'ingresso PORT_A,0

E fino quì non fa una piega! (o perlomeno se girare in tondo aspettando PORT_A,0 è "non fare una piega" ? se nel frattempo che attendo l'input 0, dovvessio "andare al ga...." :blink: ovvero il micro deve, che so !?!, far lampeggiare una spia di avviso ? )

Nel frattempo che l'input è alto vado alla label COUNT che avrà la classica sub label annidata COUNT2 (che fantasia !.... II° parte) e, se nel frattempo, che le due COUNT si "passano la palla" l'input ritorna a zero !?!?!?!?! cosa accade ?. che il timer resta attivo e termina il suo ciclo, senza accorgersi di nulla. E' vero questo ?

La mia soluzione, attualmente, è quella di far ripassare dalla BTFSC il sistema ad ogni COUNT2, ma non so cosa farò quando mi si chederanno routine diverse o con necessità di temporizzazioni più precise, o sistemi +complessi.

Perciògradirei mi diceste, per favore, se esiste un modo di far lavorare il uC in modalità "multitasking" ovvero verificando le variazioni degli input e nello stesso tempo gestendo altre operatività.

Premetto che conosco già l'uso degli interrupt nei PIC , ma dal mondo PLC da cui provengo, non si "spreca" un interrupt per un tasto o un interruttore d'ingresso. Si preferisce tenerlo per una fotocellula di conteggio veloce, un segnale di cattura posizione al volo o quant'altro. :huh:

-------------------------------

Altro dubbio, proprio sugli interrupt. Alla fine della routine attivata da un IPT mi viene detto di riattivare gli interrupt poichè gli stesso sono stati disattivati "di default" dal uC per "non essere disturbato" mentre esegue le operazioni dell'IPT in questione. Anche questo su un PLC è improponibile . Cosa ci sta a fare il puntatore dello STACK allora ?

Per fare questo è sufficiente utilizzare l'istruzione RETFIE oppure devo compiere qualche altro settaggio (vedi registro GIE ) ? :unsure:

Grazie a tutti in anticipo per l'aiuto !

Ciao! ;)

Danilo

Modificato: da tatonilo
Link al commento
Condividi su altri siti


Federico Milan

Ciao,

Credo che se desideri realizzare qualcosa di serio, dovresti implementare un sistema a più task, con un solo processore (... in breve ...) devi utilizzare il Time sharing, ossia assegni x tempo per ogni processo attivo, in questo modo hai un pseudo parallelismo ... grazie alla velcoità del processore ad eseguire i comandi.

Se il processo è semplice potresti semplificare parecchio, ossia, prendi esempio dai plc:

con un interrupt temporale gestisci le operazioni di temporizzazione e i timer che dovrai implementare.

Nel ciclo generale, come fai con i PLC esegui le operazioni di rito...

Non so se mi son spiegato ...

Esempio:

Immagina di gestire un timer ...

il timer lo puoi creare (emulando un timer di PLC) utilizzando un interrupt temporale che controlla un determinato bit. Se il bit è a 1 incrementa una variabile ad ogni tik. Se il valore della variabile corrisponde con il valore di set point, allora setta un bit di avviso.

Come faresti con i PLC a questo punto nel main principale controlli le tue condizioni, e attivi o meno il bit di start timer. Andrai ad utilizzare il bit di avviso per realizzare le tue funzioni.

Ovviamente puoi gestire più timer in base alle capacità di memoria e velocità del tuo micro.

In questo modo ovviamente puoi gestire anche altre operazioni, certo è che questo sistema di programmare crea parecchia confuzione e possibili errori.

quindi credo che sia meglio affidarsi a SO multitasking appositamente realizzati anche per micro di scarsa memoria ...

ciao

Modificato: da Federico Milan
Link al commento
Condividi su altri siti

Io, per ragioni anagrafiche, ho usato prima i micro processori dei PLC (non esistevano ancora in Italia) per controllare impianti industriali.

Per far gestire più eventi quasi contemporaneamente ad un unico micro si può usare la tecnica del multitasking in real time oppure, nei casi più semplici, farsi un semplice schedulatore di lavoro, tecnica che può essere sufficiente per la quasi totalità delle applicazioni di medio livello.

Il sistema si basa sull'assunto che i processi che andremo a controllare sono di gran lunga più lenti del tempo che impiegerà il ns. sistema di controllo per elaborare i processi.

Per esempio se hai un sistema con una decina di ingressi, e ad ogni ingresso è accoppiata una fimzione che farà variare una o più uscite, il metodo più semplice è leggere gli ingressi ad un tempo fisso. L'intervallo di tempo di lettura deve essere minore della più veloce doppia variazione di stato di un ingresso. Per esempio se leggi gli ingressi ogni 10 ms potrai riconoscere una variazione da 0 a 1 e di nuvo a 0 se lo stato di 1 permane per più di 10 ms.

Per le uscite devitenere conto anche del tempo di elaborazione del tuo task. Esempio: leggo ogni 10ms, l'elaborazione del task impieghrà comunque meno di 10ms, le uscite saranno aggiornate 10 ms dopo la lettura degli ingressi.

Guarda caso si sta ricreando l'architettura del ciclo del PLC. Infatti il PLC legge gli ingressi e li copia in una tabella, il programma utente elabora gli ingressi e scrive lo stato delle uscite in un'altra tabella. Il sistema operativo del PLC, al termine del ciclo, copia la tabella delle uscite sulle uscite fisiche, legge gli ingressi fisici e li copia in una tabella. Il ciclo continua fino a che non interviene uno stop, un reset o si toglie alimentazione.

Link al commento
Condividi su altri siti

Salve a tutti.

Ringrazio per le esaurienti e assolutamente coerenti risposte (e poi, con che velocità !?!)

Grazie ancora ad entrambi.

Un'ultima cortesia: In calce al mio post avevo proposto un secondo quesito riguardante gli Interrupt ed la funzione RETFIE... non ho visto alcun riferimento a tale funzione nelle Vs risposte.

Posso approfittare ulteriormente della Vs competenza chiedendoVi lumi in merito.

Grazie Infinite, ancora una volta. :rolleyes:

Saluti

Danilo

Modificato: da tatonilo
Link al commento
Condividi su altri siti

Nei pic a 14 bit, ogni periferica che genera un'interruzione ha associato un bit di flag, vedi registro INTCON, che viene messo a 1 dal pic quando essa genera l'interruzione. L'ISR all'inizio deve testare questi flags per sapere quale periferica ha generato l'interruzione. E' compito del programmatore, rimettere il bit di flag a zero prima dell'istruzione RETFIE.

Ciao.

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...