Vai Indietro   PcTuner Forum > Sezione Hardware > Programmazione PIC
Arcade Registrazione Blogs Regolamento Feedback FAQ Lista Utenti Calendario Segna come Letti

Ultimi 5 blog pubblicati su PcTuner Blog
Data Titolo

Rispondi
 
Strumenti Discussione Modalità Visualizzazione
Vecchio 12-05-2006, 15.12.12   #1
Registered User
 

Iscritto da: 28-02-2006
Locazione: Ancona
Messaggi: 323
Feedback: (0)
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.
superciuck Non in Linea   Rispondi Citando
Vecchio 12-05-2006, 15.18.18   #2
B&M Coasterman
 
L'avatar di  Matro
 

Iscritto da: 06-12-2003
Locazione: Padova
Messaggi: 8,294
Feedback: (0)
Certo, sono moduli indipendenti.
Comunque se la frequenza dev'essere fissa, volendo potresti cavartela con un solo timer tramite qualche trucchetto software
__________________
Matro Non in Linea   Rispondi Citando
Vecchio 12-05-2006, 15.33.04   #3
Super Moderator
 
L'avatar di  FluidGuitar
 

Iscritto da: 04-01-2001
Locazione: Torino
Messaggi: 4,023
Feedback: (0)
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!
FluidGuitar Non in Linea   Rispondi Citando
Vecchio 12-05-2006, 15.36.11   #4
Registered User
 

Iscritto da: 28-02-2006
Locazione: Ancona
Messaggi: 323
Feedback: (0)
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
superciuck Non in Linea   Rispondi Citando
Vecchio 12-05-2006, 17.40.08   #5
Registered User
 
L'avatar di  Camillo
 

Iscritto da: 31-01-2006
Locazione: Genova
Messaggi: 967
Feedback: (0)
Quote:
Originariamente inviato da suprciuck
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
Ti passo una dritta:
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.
Ti consiglio quando fai domande a raffica di dagli un'identità così faciliti il compito a che ti deve rispondere:
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
Camillo Non in Linea   Rispondi Citando
Vecchio 15-05-2006, 13.28.15   #6
Registered User
 

Iscritto da: 28-02-2006
Locazione: Ancona
Messaggi: 323
Feedback: (0)
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.
superciuck Non in Linea   Rispondi Citando
Vecchio 15-05-2006, 14.42.15   #7
Registered User
 

Iscritto da: 28-02-2006
Locazione: Ancona
Messaggi: 323
Feedback: (0)
oooopss!!

Volevo continuare la discussione ma erroneamente ho inserito un nuovo topic

[EDIT]
Ho provveduto ad unire le due discussioni

Ultima Modifica di FluidGuitar : 15-05-2006 14.55.06.
superciuck Non in Linea   Rispondi Citando
Vecchio 17-05-2006, 17.34.39   #8
Registered User
 
L'avatar di  Camillo
 

Iscritto da: 31-01-2006
Locazione: Genova
Messaggi: 967
Feedback: (0)
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
Camillo Non in Linea   Rispondi Citando
Vecchio 18-05-2006, 17.14.07   #9
Registered User
 

Iscritto da: 28-02-2006
Locazione: Ancona
Messaggi: 323
Feedback: (0)
???

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++++++
superciuck Non in Linea   Rispondi Citando
Vecchio 19-05-2006, 15.25.38   #10
Registered User
 

Iscritto da: 28-02-2006
Locazione: Ancona
Messaggi: 323
Feedback: (0)
.........

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+++++++++
superciuck Non in Linea   Rispondi Citando
Vecchio 20-05-2006, 21.40.32   #11
Registered User
 
L'avatar di  Camillo
 

Iscritto da: 31-01-2006
Locazione: Genova
Messaggi: 967
Feedback: (0)
Quote:
Originariamente inviato da suprciuck
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++++++
Oggi (anzi ieri, quando ho scritto quasi tutto quello che segue) mi sento generoso e gentile
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
Assumo che la frequenza dell'oscillatore sia di 4MHz.
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.
Chiaro che tutto questo non è stato provato per cui vale il beneficio di inventario.
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
Camillo Non in Linea   Rispondi Citando
Vecchio 22-05-2006, 09.23.18   #12
Registered User
 

Iscritto da: 28-02-2006
Locazione: Ancona
Messaggi: 323
Feedback: (0)
leggo solo ora...

Leggo solo ora la risposta.....
Stamattina h un sacco di cose da fare....
Oggi pomeriggio cercherò di capire....
Per ora tnx+++++++++
superciuck Non in Linea   Rispondi Citando
Vecchio 26-05-2006, 09.11.02   #13
Registered User
 

Iscritto da: 28-02-2006
Locazione: Ancona
Messaggi: 323
Feedback: (0)
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++++
superciuck Non in Linea   Rispondi Citando
Vecchio 26-05-2006, 15.36.53   #14
Registered User
 
L'avatar di  Camillo
 

Iscritto da: 31-01-2006
Locazione: Genova
Messaggi: 967
Feedback: (0)
Quote:
Originariamente inviato da suprciuck
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++++
I nomi da me utilizzati sono delle mie convenzioni per cui il resto del mondo potrebbe non capirle, questo non mi tange. Anche se la traduzione di "tick" è significativa.
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.
In un'altro post ho spiegato gli accorgimenti da utilizzare con i timer se si vogliono dei tempi precisi, nel tuo caso non è strettamente necessario.
__________________
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
Camillo Non in Linea   Rispondi Citando
Vecchio 03-06-2006, 21.44.48   #15
Registered User
 

Iscritto da: 28-02-2006
Locazione: Ancona
Messaggi: 323
Feedback: (0)
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.
superciuck Non in Linea   Rispondi Citando
Rispondi 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

Regole di scrittura
non Puoi inserire messaggi
non Puoi rispondere ai messaggi
non Puoi inviare allegati
non Puoi modificare i tuoi messaggi

codice vB è Attivo
Smilies è Attivo
[IMG] il codice è Attivo
Il codice HTML è Disattivato
Trackbacks are Disattivato
Pingbacks are Disattivato
Refbacks are Disattivato
Vai al Forum


Tutti gli Orari sono GMT +1. Attualmente sono le 09.00.01.


Powered by vBulletin Versione 3.6.12
Copyright ©2000 - 2009, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.2.0