Vai al contenuto
PLC Forum


Temporizzazioni Con I Microp


walterword

Messaggi consigliati

Vorrei sapere da voi se conoscete alcune tecniche interessanti sull aimplementazione dei timer con i microcontrollori a prescindere dai timer di sitema .

Faccio un esempio : Nelle comuni lavatrici i vari programmi sono gestiti anche da temporizzazioni , per esempio

1)Riscaldamento acqua per un certo tempo

2)Inserimento acqua

3)Miscelazione detersivo per un certo tempo

4) Centrifuga per un certo tempo

5) Ect ect .........

In poche parole creare dei timer da usare nelle applicazioni a microcontrollore .

Ciao

Walter

Link al commento
Condividi su altri siti


Ci sono due modi: o conti il clock del processore, con interrupt a fine conta, o fai un loop di n istruzioni. Con questo metodo il prcessore esegue solo quel ciclo sino al termine. COntando il clock, invece, il processore elabora il programma sino a quando il termine conta fa interrompere il programma.

Link al commento
Condividi su altri siti

io pensavo di fare qualcosa di piu figo ....

nel interrupt , per esempio 100 ms , tiro fuori un fronte e poi lo uso per incrementare i timer .

Ogni timer ha come input lo start e un accumulatore personale,oltre al clock .

Meglio la seconda ipotesi perche fare una cosa bloccante considerando che il processore deve gestire molte altre cose ...

Sto mettendo giu delle macro in C per un progetto che vorrei fare , un plc praticamente.

Per quanto riguarda la parte software di programmazione aspetto di dare esame in java e architettura del software .

Per la parte hw dovrei fare elettronica a breve ma ho gia delle idee .

Partirei con un plc basato su microcontrollore PIC 16F877 o affini o ATmel

Le macro intanto permettono di programmare in lista istruzioni plc invece che assembly per cui da MPLab volendo si puo' gia utilizzare solo che per ora le istruzioni che ho creato sono pochissime .

Per quanto riguarda timer e contatori li srivero' in assembly piu avanti ora e' solo per provare con un DSPic alcune cose .

A livello Pc sto vedendo bene le strutture dati in java , grafi orientati , liste .....ogni elemento è un oggetto ladder che puo' essere un contatto piuttosto che un comparatore ...solo che c'e' da lavorare troppo e non ho tempo

Per un sito che si chiama PLcForum potrebbe essere interessante progettare un plc modesto .L'importante e' che sia ben strutturato da poterlo estendere

Solo che siete dei lazzaroni e so gia come andra' finire :D

Qualche giorno di questi ti chiamo

ciao

Walter

Link al commento
Condividi su altri siti

Ma a me sembra un UCAS. :smile:

Ti descrivo quello che faccio io da anni.

Programmo il contatore (Timer 1 di solito per i PIC) per avere un interrupt ogni 10 ms.

Ad ogni eventuale timer associo un flag, se il timer è scaduto il flag è alto.

Nella routine di interrupt verifico se il flag è alto lascio immutato il timer, altrimenti lo decremento per sino a zero; una volta azzerato alzo il flag.

nella funzione in cui è richiesto l'uso del timer verifico se il flag è alto, se è alto e devo riusare il timer azzero il flag e ricarico il timer, altrimenti non ricarico il timer e lascio alto il flag.

Per brivi ritardi come, ad esempio nella gestione dei display o nelle comunicazini dei bus 1wire, uso la funzione delay del compilatore "C"

Link al commento
Condividi su altri siti

ok pero se hai piu timer , gli accumulatori li incrementi nel interrupt , giusto ?

Se invece nell'interrupt tiri fuori solo il trigger e l'incremento degli accumulatori lo fai fuori , cioe nel programma , rimane piu snello l'interrupt

Certo in questo modo i timer sono asincroni , il 'done' dipende da quanto tempo serve per processare tutto il programma .

Dipende dalla precisione richiesta , in effetti a me va bene anche una risoluzione asincrona di 100 mS

Cosa sarebbe un UCAS? :(

Link al commento
Condividi su altri siti

ok pero se hai piu timer , gli accumulatori li incrementi nel interrupt , giusto ?

Ovviamente, e sempre nell'interrupt selezioni alto il flag di fine conteggio.

Se invece nell'interrupt tiri fuori solo il trigger e l'incremento degli accumulatori lo fai fuori , cioe nel programma , rimane piu snello l'interrupt

Certo in questo modo i timer sono asincroni , il 'done' dipende da quanto tempo serve per processare tutto il programma .

Non so proprio come potrebbe funzionare bene: questo è un affare da UCAS.

Dipende dalla precisione richiesta , in effetti a me va bene anche una risoluzione asincrona di 100 mS

Il concetto è proprio questo: dimensionare microprocessore ed il suo clock in base a quanti timer dovrai usare nel tuo codice, in modo che il timer hardware sia moooolto più veloce dei timer software che crei tu.

E' un modo di programmare abbastanza standard, ormai.

Cosa sarebbe un UCAS?

Ufficio Complicazione Affari Semplici.

Se ti muovi un po' per lavoro (ma anche non) ne troverai parecchi :superlol: :superlol:

Link al commento
Condividi su altri siti

e' da 22 che mi muovo per lavoro ....si si ne ho trovatie ne trovo di UCAS :smile:

Drugo potresti darmi qualche dettaglio in piu sui timer nel modo in cui lo descrivete tu e livio ?

Io ho fatto una cosa :

nel interrupt , per esempio 10ms, del timer hardware , incremento una word che tramite una union (linguaggio C) è unita ad una struttura di 16 bit

In questo modo , ovunque nel programma , ho dei bit di clock per esempio per far lampeggiare dei led ect.

Il bit di clock , con opportuna memoria ,viene filtrato e preso soloil fronte si salita per incrementare i timer che sono software .

ciao e grazie

Walter

Modificato: da walterword
Link al commento
Condividi su altri siti

Walter azzarola non ne haim mai visti di questi temporizzatorei fatti da me o da Claudio? Eppure mi sembrava di avertene parlato ancora ai tempi del Rabbit.

La faccenda è più semplice di quanto possa sembrare.

Se devi fare tempi precisi come ad esempio richiamare un PID allora dedichi un timere Hw appositamente a questi processi.

per i temporizzatori simili a quelli di un PLC, quelli che non tichiedono tempi precisissimi, metti nella routine di interrupt tutti i contatori e poi, in funzione di quelli attivi o meno, li decrementi o incrementi secondo la logica che preferisci. Ad ogni termine conta alzi il flag che segnala al processo tempo scaduto. Il processo ricarica il contatore e abbassa il flag ed al primi interrupt riparte il conteggio.

Fai conto che un vechhio 877, con quarzo da 20 MHz, se fai la funzione in asm impiega meno di 1µs per temporizzatore.

Link al commento
Condividi su altri siti

ok per i pid , nell'interrupt , ho anche scritto dei pid senza problemi

Bene ho capito , l'incremento dei contatori viene fatto nell'interrupt in base ai flag di strart che abilitano il contaggio di ogni rispettivo timer .

Pero' se i timer sono per esempio 30 ..... se mi dici che il tempo di esecuzione di ogni logica per timer e' di un microS ok

Questo lo avevo capito , io intendevo dire che si poteva fare il lavoro fuori dall'interrupt

Anni fa , quando i timer nel plc erano un po di meno , quando avevi bisogno di timer lo si faceva nel programma via software tramite un clock dul fronte

E' questo quello che intendevo dire .

Link al commento
Condividi su altri siti

io intendevo dire che si poteva fare il lavoro fuori dall'interrupt

Devi comunque avere un richiamo generato dal timer ad interrupt.

Ammetti di limitarto al solo settaggio di un flag alla scadenza dei fatidici 10 ms, questo nella routine di interrupt. Poi avrai una funzione, che viene abilitata dal flag alto, che curerà il conteggio dei timer. Ebbene la cosa è fattibile e lo anche usata in passato, c'è solo il problema che questa funzione non sai quando capita perchè dipende da come evolve il resto del programma. Se i tempi di esecuzione dle programma sono abbastanza costanti anche il richiamo della funzione è abbastanza costante ed i 10 ms di esempio non hanno grandi allungamenti. altrimenti puoi anche rischiare di saltare un ciclo .

Link al commento
Condividi su altri siti

be saltare un ciclo non e' importante in questo caso .

La precisione puo anche essere di +/- 200mS ...figurati

Hai trovato qualcosa per la gestione delle termocoppie con OP ?

Link al commento
Condividi su altri siti

La precisione puo anche essere di +/- 200mS ...figurati

Se fosse veramente così bastaerebbe contare i cicli di main. :lol:

Ma questi non sono temporizzatori, questi sono ritardi spannometrici.

Modificato: da Livio Orsini
Link al commento
Condividi su altri siti

be tempo fa usavo fare timer software , quando finivano quelli hw, con il OB_CycleTime da OB1

Lo usavo per incrementare i timer , per cui .....essendo il ciclo cpu dei programmi sui 20.30 mS (ai tempi ) potevo realizzare timer con precisione spannometrica di +/- 30 ms * 2

Link al commento
Condividi su altri siti

per cui la struttura dati del timer potrebbe essere qualcosa del genere

struct Timer {

bool Start ;

Int Preset; //in mS

Int* Counter;

bool Done;

};

// per dichiarare un 15^na di timers

Timer timers[15];

// nel main

timers[0].Preset=2000;

timers[1].Preset=3000;

.....

//nell' interrupt

int i ;

for(i=0;i<15;i++)

{

if (timers.Start ==1 && timers.Counter > timers.Preset )

{

timers.Counter++;

}

timers.Done=timers.Start && timers.Counter <= timers.Preset; // ex. timer TON

}

...............

o no cosa dici maestro boss Livio?

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...