|
|
#1 |
|
Registered User
|
doppio contatore
Mi chiedevo se è possibile che un pic possa gestire 2 contatori.
Mi spiego meglio. E' possibile che un pic possa ad esempio controllare un uscita che fa lampeggiare un led con una frequenza, sempre a caso, di 1 sec; e invece un altra uscita fa lampeggiare un led con una frequenza diversa? Vedo ad esempio sul data sheet del pic 16F870 i paragrafi 5-6-7 sono dedicati al timer0-timer1-timer2. Sono tutti dei moduli contatori indipendenti l'uno dall'altro? tnx+++++ Ultima Modifica di superciuck : 12-05-2006 15.16.41. |
|
|
|
|
|
#2 |
|
B&M Coasterman
|
Certo, sono moduli indipendenti.
__________________Comunque se la frequenza dev'essere fissa, volendo potresti cavartela con un solo timer tramite qualche trucchetto software ![]() |
|
|
|
|
|
#3 |
|
Super Moderator
|
E nella fattispecie in questo topic:
__________________fari luminosi trovi qualche dritta su come realizzare temporizzazioni multiple via sw seguendo metodi alternativi proposti da Matro e Camillo. ![]() ![]() ![]() Tu non sai niente, Jon Snow! |
|
|
|
|
|
#4 |
|
Registered User
|
Il mio intento non è esattamente quello di far lampeggiare 2 led.
Dovrei in parole povere gestire delle sequenze di accensione ad esempio rb0 alto x 5 sec, poi rb0 basso e rb1 alt per 10 sec, poi rb2 alto per 4 sec.Questa sequenza parte se arriva un alto un ingresso. Durante questa sequenza se ne può innescare un altra, in qualsiasi momento, che accende o spegne delle altre uscite. (ehm ehm alza o abbassa delle altre uscite). Mi chiedevo appunto se adopero il tmr0 per contare il tempi della prima sequenza, come posso contare i tempi della seconda se tmr0 è impegnato dalla prima. Siccome la seconda sequenza potrebbe innescarsi in qualsiasi momento (non parte ad un determinato momento della prima, ma può variare) trovo difficoltà a sincronizzarle (anche se credo, facendo fare dei calcoli al pic si potrebbe, ripeto credo, riuscire). Ma se potessi gestire due timer sarebbe + semplice. Per il momento è un idea, butto giù due disegnini, così ci capiamo meglio. X ora grazie 1000 |
|
|
|
|
|
#5 | |
|
Registered User
|
Quote:
I temporizzatori è comodo farli lavorare all'indietro per cui Codice:
; Di qui passa ogni tot tempo (ad es. ogni 100ms). tstf tmrpor ;E' l'opportuno temporizattore. bz nonfanulla ; Se è 0 non fa nulla. decfsz tmrpor,F goto nonfanulla ; Se NON è 0. ; La prima volta che va a 0 passa di qui. ;E' scatuto il tempo agisce sull'uscita opportuna. ;Disattivo l'uscita del caso. bcf PORTx,BITy nonfanulla: ecc. ; Da qualche altra parte il temporizzatore va caricato con un valore opportuno. ; E' successo un certo avvenimento. movlw TEMPOOPPORTUNO movwf tmrpor ;Attivo l'uscita del caso. bsf PORTx,BITy ecc. A) domanda A B) domanda B ecc.
Camillo
Il VeroProgrammatore può contare fino a 1024 con le dita delle mani. Grazie a .mau. Le donne e i gatti fanno quello che vogliono, gli uomini e i cani dovrebbero rilassarsi e abituarsi all'idea. R.A.Heinlein |
|
|
|
|
|
|
#6 |
|
Registered User
|
Coiminciamo dall'inizio
Un pò di tempo fa grazie al vs aiuto sono riuscito a realizzare un semaforo rallentatraffico. Quelli con i radar che diventa rosso se superi una certa velocità.
Qui sotto metto il "diagramma di fasatura". Quando è verde a quadretti è la parte in cui dove attende l'ingresso (è acceso il verde), nel programma non è altro che un loop. Quando arriva l'ingresso (il radar rileva un veicolo sopra la vecolità limite) attende ancora alcuni secondi di verde, (devono essere impostabili da 0 a pochi secondi). Poi passa al giallo (tempo fisso 4sec). poi al rosso (anche questo tempo deve essere impostabile). Bene ora tutto questo vale nel caso voglio controllare solo una dei due sensi di marcia della strada. Il problema arriva quando voglio controllarli entrambe. Voglio dire che l'impulso del secondo radar (quello che controlla il secondo senso di marcia) può arrivare in qualsiasi momento. Diciamo che, per capirci, la parte verde a quadretti varia continuamente Infine giusto per complicare un pò l'apparecchiatura deve essere anche in grado di gestire un pedonale; Se viene premuto il pulsante di richiesta pedonale entrambi i sensi di marcia devono posizionarsi sul rosso, poi viene eseguito il pedonale e poi si torna a "regime". Forse quest'ultima parte è la più gestibile. Una mezza idea per gestire il tutto è quella di far fare dei calcoli al processore prendendo come unità base 1 secondo e calcolare inizialmente il tempo totale di un ciclo, muovermi poi di conseguenza con delle addizioni o sottrazioni. Regolare insomma il funzionamento su dei "passi" da 1 secondo ciascuno. E' solo un idea e sinceramente anche poco chiara...... Se qualcuno a dei suggerimenti........ Ultima Modifica di superciuck : 30-10-2006 13.00.13. |
|
|
|
|
|
#8 |
|
Registered User
|
A me sembra una banalità. Addizioni e sottrazioni non servono a niente.
__________________Studiati il mio post precedente che con una decina di contatori o anche meno te la cavi. Io di consiglierei un tick da 1/4 di secondo e non da un secondo per migliorare la granularità dell'evento.
Camillo
Il VeroProgrammatore può contare fino a 1024 con le dita delle mani. Grazie a .mau. Le donne e i gatti fanno quello che vogliono, gli uomini e i cani dovrebbero rilassarsi e abituarsi all'idea. R.A.Heinlein |
|
|
|
|
|
#9 |
|
Registered User
|
???
Ho letto...... ma....
non riesco a entrare nell'ordine di idee....... mi dai un altro input...... un esempio.... Credo anche io che poi la soluzione sarà semplice ma sicuramente ragiono la faccenda con l'approccio sbagliato.... tnx++++++ |
|
|
|
|
|
#10 |
|
Registered User
|
.........
Mi sono riletto tutto il topic dei fari.......
Probabilmente non sono riuscito a farmi capire bene. La differenza sostanziale tra il mio problema e quello dei fari è che con i fari posso considerare un punto (tempo) di inzio che vale per tutti. Nel mio caso è come se partisse un faro: acceso, spento lampeggio etc etc, poi parte un secondo, ma questo secondo non partirebbe sempre ad uno stesso momento rispetto al primo ma potrebbe accendersi dopo un sec, due ,tre o 100, o 110 insomma in un momento che varia di volta in volta. Camillo... please dammi ulteriori delucidazioni sul "tick di sistema"....plaeease..... Tnx tnx+++++++++ |
|
|
|
|
|
#11 | |
|
Registered User
|
Quote:
![]() Mi sa che sei partito con lapproccio sbagliato, purtroppo ogni tanto bisogna avere il coraggio di "buttare tutto a mare" e ricominciare. Lo so dispiace, si è fatto del lavoro ... ma tutto fa esperienza. Comincia col pensare di lavorare con un solo semaforo. Sto semaforo è normalmente verde ma ogni tanto per una causa esterna diventa giallo per un certo periodo, scaduto questo diventa rosso per un'altro periodo, e alla sua scadenza diventa di nuovo verde. Analizzando questo semplice algoritmo scopriamo che: a) Ci occorre un'ingresso che farà partire la sequenza colorata. b) Ci occorrono 3 uscite che piloteranno 3 servorelè per le 3 lampadine. c) Un flag per il verde, in considerazione del fatto che potrebbe restare anche eternamente acceso. d) Due variabili che faranno da temporizzatori per il giallo e il rosso. e) Due variabili che conterranno i tempi per le 2 precedenti, potranno anche essere 2 costanti. f) Una variabile di temporizzazione per il macrotick da 250ms. Codice:
;;Nella sezione di definizione delle costanti avremo: ;;La definizione di quanto ci serve. #define PORTSTARTER PORTB #define BITSTARTERA 7 #define PORTSEMAFORI PORTA #define BITSEMVERDE 7 #define BITSEMGIALLO 6 #define BITSEMROSSO 5 ;;Vi saranno anche tutte le altre definizioni indispensabili. ;;Nella sezione dedicata alle macro avremo: #define VERDEON bsf PORTSEMAFORI,BITSEMVERDE #define VERDEOFF bcf PORTSEMAFORI,BITSEMVERDE #define GIALLOON bsf PORTSEMAFORI,BITSEMGIALLO #define GIALLOOFF bcf PORTSEMAFORI,BITSEMGIALLO #define ROSSOON bsf PORTSEMAFORI,BITSEMROSSO #define ROSSOOFF bcf PORTSEMAFORI,BITSEMROSSO ;;Nella sezione di definizione delle variabili avremo: flags RES 1 ; Banco di flag per vari usi. #define VERDE_A 7 ; Vero quando il verde è acceso. tmr_gialloA RES 1 ; Temporizzatore per il giallo A. tmr_rossoA RES 1 ; Temporizzatore per il rosso A. tempogiallo RES 1 temporosso RES 1 tmr_macrotick RES 1 Presumo che vi sia un tick che io farei di un millisecondo che è una misura che va bene anche per gli eventuali antirimbalzo dagli ingressi, anche se in questa applicazione non ne vedo l'utilità (gli antirimbalzo, intendo). Inoltre tutte le variabili devono essere azzerate all'accensione come usualmente si dovrebbe fare. Codice:
; Qui inizia il loop infinito. loopinfinito: btfsc PORTSTARTER,BITSTARTERA goto ingressoAtranquillo ; L'ingresso A si è attivato se posso do il via alla sequenza. tstf tmr_gialloA bnz ingressoAtranquillo ; Il colore è già acceso non faccio niente. tstf tmr_rossoA bnz ingressoAtranquillo ; Il colore è già acceso non faccio niente. ; Deve dare il via alla sequenza bcf flags,VERDE_A ; Fa spegnere. movfw tempogiallo ; Parte il giallo. movwf tmr_gialloA ingressoAtranquillo: ; Controllo della scadenza del macrotick da 250ms. tstf tmr_macrotick bnz saltalascadenza ; Sono passati 250ms. movlw 250 movwf tmr_macrotick ; Ricarica il tempo. Il suo decremento è fatto altrove (dal tick da un us). ; Decremento dei vari timer fino a 0. tstf tmr_gialloA bz gialloAfermo decfsz tmr_gialloA,F goto gialloAfermo ; Non è ancora giunto a 0. ; Il tempo è scaduto. movfw temporosso movwf tmr_rossoA gialloAfermo: tstf tmr_rossoA bz rossoAfermo decfsz tmr_rossoA,F goto rossoAfermo ; Non è ancora giunto a 0. ; Il tempo è scaduto. bsf flags,VERDE_A rossoAfermo: saltalascadenza: ; Gestione dei colori. ; Con questo metodo le uscite potrebbero dare delle alee della durata di 2 o 3 microsecondi. VERDEOFF btfsc flags,VERDE_A VERDEON GIALLOOFF tstf tmr_gialloA skpz GIALLOON ROSSOOFF tstf tmr_rossoA skpz ROSSOON goto loopinfinito ; Qui finisce il loop infinito. E' chiaro che se vuoi un tempo prima di dare il via alla sequenza per fermare "il velocista" devi aggiungere un'altro contatore. Dopo aver provato per bene il funzionamento di un semaforo dovrai fare una duplicazione dei timer ecc. per l'altro semaforo. Avrai notato che molte cose si chiamano 'A'. A seguire dovrai integrare il semaforo pedonale (4 timer direi).
Camillo
Il VeroProgrammatore può contare fino a 1024 con le dita delle mani. Grazie a .mau. Le donne e i gatti fanno quello che vogliono, gli uomini e i cani dovrebbero rilassarsi e abituarsi all'idea. R.A.Heinlein |
|
|
|
|
|
|
#13 |
|
Registered User
|
hummm hummm
Sto guardando, ho preso pure carta e penna per cercare di buttre giu una specie di diagramma di flusso... ma...
Ho ancora dubbi sul tick, macrotick etc etc..... Se hai voglia, e tempo, e pazienza,.... mi spieghi con due parole. Tnx++++ |
|
|
|
|
|
#14 | |
|
Registered User
|
Quote:
In ogni mio progetto c'è una temporizzazione principale che chiamo "tick" da questa derivano tutte le altre. Normalmente io uso un tick di 104 microsecondi che è molto veloce e va usato con attenzione. Questo perché in molti progetti mi occorrono 2 seriali e i PIC più normali ne hanno una. La seconda seriale la devo fare via FW e per fortuna viaggia lenta (1200BAUD), il tick è 1/8 di un BIT a questa velocità. Il mio consiglio è stato di creare un tick da un ms per cui, io, utilizzerei TMR1 usando gli accorgimenti del caso. Come visto più sopra questo agirà su un macrotick da 250ms che per i tuoi usi va più che bene. Codice:
; Quando TMR1 scatta in polling o in interrupt agisco sul macrotick. tstf tmr_macrotick skpz ; Se è già 0 non faccio niente aspettando che nel loop infinito lo si ricarichi. decf tmr_macrotick,F ; Decremento per portarlo a 0.
Camillo
Il VeroProgrammatore può contare fino a 1024 con le dita delle mani. Grazie a .mau. Le donne e i gatti fanno quello che vogliono, gli uomini e i cani dovrebbero rilassarsi e abituarsi all'idea. R.A.Heinlein |
|
|
|
|
|
|
#15 |
|
Registered User
|
no no non l'ho abbandonato.... anzi..
Allora come al solito un grande grazie a Camillo.
Rispondo tardi.... ma rispondo. Ho avuto degli imprevisti d altra natura. Ho cominciat se,mo a buttere giù un pò di codice e fino ad ora sembra andare. In effetti guardando quello che avrei dovuto fare da fuori sembrava molto molto complicato, poi da quando ho cominciato a scrivere il codice, tutto sembra scorrere regolare. Tnx again cmq tanto, prima o poi troverò qualche intoppo.... e farò un fischio. ![]() |
|
|
|
![]() |
Per le vostre immagini su questo forum potete usare PcTunerUp! Iscriviti gratuitamente alla nostra newsletter. |
| Utenti attualmente attivi che stanno leggendo questa discussione: 1 (0 utenti e 1 visitatori) | |
| Strumenti Discussione | |
| Modalità Visualizzazione | |
|
|