walterword Inserito: 31 marzo 2014 Segnala Share Inserito: 31 marzo 2014 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 More sharing options...
Livio Orsini Inserita: 31 marzo 2014 Segnala Share Inserita: 31 marzo 2014 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 More sharing options...
walterword Inserita: 2 aprile 2014 Autore Segnala Share Inserita: 2 aprile 2014 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 Qualche giorno di questi ti chiamo ciao Walter Link al commento Condividi su altri siti More sharing options...
Livio Orsini Inserita: 2 aprile 2014 Segnala Share Inserita: 2 aprile 2014 Ma a me sembra un UCAS. 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 More sharing options...
walterword Inserita: 2 aprile 2014 Autore Segnala Share Inserita: 2 aprile 2014 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 More sharing options...
drugo66 Inserita: 2 aprile 2014 Segnala Share Inserita: 2 aprile 2014 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: Link al commento Condividi su altri siti More sharing options...
walterword Inserita: 2 aprile 2014 Autore Segnala Share Inserita: 2 aprile 2014 (modificato) e' da 22 che mi muovo per lavoro ....si si ne ho trovatie ne trovo di UCAS 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: 2 aprile 2014 da walterword Link al commento Condividi su altri siti More sharing options...
Livio Orsini Inserita: 2 aprile 2014 Segnala Share Inserita: 2 aprile 2014 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 More sharing options...
walterword Inserita: 3 aprile 2014 Autore Segnala Share Inserita: 3 aprile 2014 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 More sharing options...
Livio Orsini Inserita: 3 aprile 2014 Segnala Share Inserita: 3 aprile 2014 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 More sharing options...
walterword Inserita: 3 aprile 2014 Autore Segnala Share Inserita: 3 aprile 2014 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 More sharing options...
Livio Orsini Inserita: 3 aprile 2014 Segnala Share Inserita: 3 aprile 2014 (modificato) La precisione puo anche essere di +/- 200mS ...figurati Se fosse veramente così bastaerebbe contare i cicli di main. Ma questi non sono temporizzatori, questi sono ritardi spannometrici. Modificato: 3 aprile 2014 da Livio Orsini Link al commento Condividi su altri siti More sharing options...
walterword Inserita: 3 aprile 2014 Autore Segnala Share Inserita: 3 aprile 2014 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 More sharing options...
walterword Inserita: 8 aprile 2014 Autore Segnala Share Inserita: 8 aprile 2014 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 More sharing options...
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora