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 06-04-2006, 09.29.10   #1
Registered User
 

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

Stò tentando di far funzicare un semaforo rallentatraffico.
Ho bisogno di gestire due radar, uno rileva i veicoli sopra una certa velocita e chiude un relè, l'altro rileva tutti i veicoli a qualsiasi velocità e anche questo chiude un relè.
Ho gestito i due eventi in questo modo:
Codice:
;**********************************************************************
; Gestione Interupt
;**********************************************************************				

				btfsc   INTCON,INTF	;controlla ingresso1 linea RB0 --> Velocità elevata
        		goto    Setta_alto_ingr1
        		btfsc  	INTCON,RBIF     ;controlla ingresso2 linea RB7 --> Presenza, velocità regolare
        		goto    Setta_alto_ingr2

Fine_Interupt								
				bcf     INTCON,INTF 	;riabilitazione interupt su RB0
        		bcf     INTCON,RBIF	;riabilitazione interupt su RB7 
				retfie

Setta_alto_ingr1
				movlw	00000001B
				movwf	ingresso1		;ingresso1 linea RB0 --> Velocità elevata
				goto	Fine_Interupt

Setta_alto_ingr2
				movlw	00000001B
				movwf	ingresso2	;ingresso2 linea RB7 --> Presenza, velocità regolare
				goto	Fine_Interupt
Poi gestisco le due variabili ingresso1 e ingresso2, tutto sembra funzionare.
Ora il problema stà nel fatto che devo gestire un terzo evento cioè un timer, un orologio che eventualmente metta a lampeggio il semaforo in determinati orari. Per far questo avevo previsto un interruttore su RB6.
La domanda: Durante l'iterupt su RBIF posso capire in qualche modo da quale linea questo bit è stato alzato? Cioè RBIF potrebbe essere alzato, nel mio caso, da RB7 (dove è collegato un radar oppure da RB6 dove è collegato l'iterruttore di lampeggio. Se riesco a sapere quale dei 2 eventi mi causa l'interupt potrei utilizzare ad esempio una terza variabile es ingresso3 per gestire il lampeggio. Premetto che uso un 16F870 e non ho altre porte libere, o meglio l'unica libera è RB4.
Come posso fare?
superciuck Non in Linea   Rispondi Citando
Vecchio 06-04-2006, 16.50.24   #2
Registered User
 
L'avatar di  Camillo
 

Iscritto da: 31-01-2006
Locazione: Genova
Messaggi: 947
Feedback: (0)
Mi è abbastanza chiaro quello che vuoi fare, ma come lo fai non lo è per niente.
Da quello che vedo del codice non capisco come ti possa funzionare! Ergo alla prima aggiunta di qualcosa ti trovi nei casini.

Nella routine di interrupt (in ORG 4) salvi W e STATUS?

Enuncio il primo postulato del Camillo:
Se non è strettamente necessario non usare gli interrupt.
E di conseguenza:
Se sei costretto ad usare gli interrupt usa solo quelli indispensabili.

Da questo; è proprio necessario mettere l'interrupt sul port B non è sufficiente leggere i vari BIT in ingresso con un polling mentre giri nel loop infinito?

Perché utilizzi 2 byte (ingresso1 e ingresso2) non è sufficiente utilizzare 2 BIT di un byte, te ne avanzano 6 per altri ingressi.
__________________
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 06-04-2006, 17.52.15   #3
Registered User
 

Iscritto da: 28-02-2006
Locazione: Ancona
Messaggi: 323
Feedback: (0)
Tutto il codice ..... 1Km

Ecco tutto il codice mi manca la routine per inserire i tempi del dissuasore in verde.
Provo a spiegare come funzica un semaforo del genere.
Il primo caso quello del dissuasore in verde è semplice.
Il dispositivo apetta sul verde, se arriva l'impulso dal radar, (in questo caso si usa un solo radar che manda l'impulso se rileva un veicolo sopra la soglia di velocità), può o aspettare alcuni secondi ancora in verde e poi passare al giallo e poi al rosso, oppure far venire subito il giallo.
Secondo caso dissuasore in rosso.
Il dispositivo aspetta sul rosso. Se rileva un veicolo sopra la soglia di velocità aspetta tot tempo prima di dargli il verde, se rileva un veicolo sotto la soglia aspetta meno del tot tempo sopracitato.
Per cui devo per forza adoperare due radar uno con la soglia di velocità da controllare es 70 Km/h e uno che rileva qualsiasi veicolo (solitamente 0.5 Km/h), essendo sul rosso devo per forza dare il verde ai veicoli che arrivano sotto la soglia dei 70 Km/h.
A questo punto in fase di verde deve contrallare se arrivano altri veicoli per allungare il verde.
Aggiungo che i radar inviano un impulso di 1 sec, io deve vedere se c'è l'impulso e gestirlo succesivamernte. Per questo ho usato l'interupt.
Il problema del lampeggio l'ho risolto usando RB2 che serve solo in fase di inserimento tempi.
Solitamente i tempi che si adoperano sono.
Per il dissuasore in rosso
-Il tempo di intervento su radar 1 (radar settato es a 70 Km\h) cioè il tempo che deve attendere prima di dare il verde ai veicoli veloci.
-Il tempo di intervento su radar 2 (radar settato es a 0.5 Km\h) cioè il tempo che deve attendere prima di dare il verde ai veicoli sotto la soglia dei 70 Km\h
-Il tempo di verde
Il giallo per il c.d.s. 4 sec
Per il dissuasore in verde
-Il tempo di intervento su radar 1 (radar settato es a 70 Km\h) cioè il tempo che deve attendere prima di dare il giallo e poi dopo 4 sec. il rosso ai veicoli veloci.
-Il tempo di rosso
Qui sotto tutta la routine, è lunghissima ma sembra funzicare, e il mio primo programmino per cui................... mi va già bene così
.....ma se ce da migliorare................
http://www.pctuner.net/forum/attachm...1&d=1144338659

P.S. Quasi dimenticavo grazie a tutti senza di voi non ce l'avrei fatta.

Ultima Modifica di superciuck : 30-10-2006 13.00.13.
superciuck Non in Linea   Rispondi Citando
Vecchio 06-04-2006, 22.39.42   #4
Registered User
 
L'avatar di  Camillo
 

Iscritto da: 31-01-2006
Locazione: Genova
Messaggi: 947
Feedback: (0)
Quote:
Originariamente inviato da suprciuck
Aggiungo che i radar inviano un impulso di 1 sec, io deve vedere se c'è l'impulso e gestirlo succesivamernte. Per questo ho usato l'interupt.
Purtroppo non riesco a vedere il programma allegato, mi da degli errori come se non fossi loggato.
Continuo a pensare che l'uso dell'interrupt non sia 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 07-04-2006, 08.59.41   #5
Registered User
 

Iscritto da: 28-02-2006
Locazione: Ancona
Messaggi: 323
Feedback: (0)
Probabilmente hai ragione....
poi riguardandolo come ho già detto forse si poteva raggiungere lo stesso risultato con la metà di codice.
Se aavessi ad esempio gestito gli ingressi come dicevi tu (alzando per ingresso1 il primo bit di un registro, per ingresso2 il secondo bit etc.) sarebbe bastata l'istruzione btfsz mentre io controllando tutto un registro prima lo muovo su se stesso e poi controllo il flag Z di status per vedere se vale 0.
Ci saranno altre mille cose da rivedere.............
E' il mio primo programmino pago l'inesperienza.
Vorrei cmq ringraziarti ancora una volta, primo senza il tuo, vostro aiuto non serei riuscito, secondo, grazie a te ho imparato ancora qualcosa.
Ho 39 anni ma credo ci siano ancora, nel mio cervello, locazioni vuote che possono essere riempite.
Tnx again
superciuck Non in Linea   Rispondi Citando
Vecchio 07-04-2006, 10.09.19   #6
Super Moderator
 
L'avatar di  FluidGuitar
 

Iscritto da: 04-01-2001
Locazione: Torino
Messaggi: 4,016
Feedback: (0)
Se quello è il tuo primo programma devo farti i complimenti, sei partito alla grande!

Cmq visto che ti rendi conto tu stesso che il programma potrebbe essere ottimizzato in vari modi, io ti consiglio di riscriverlo alla luce della esperienza acquisita. Rattoppare un codice all'infinito non porta da nessuna parte.

Non pensare che ci voglia tanto tempo a riscrivere un codice quando hai le idee chiare sulla direzione da seguire.

In particolare il consiglio di Camillo è ottimo. Cioè abbandona la gestione ad interrupt, che nel tuo caso non è l'ideale, in favore di una gestione in polling delle porte.
Per gestire le temporizzazioni ti consiglio di prendere spunto dal metodo proposto dallo stesso Camillo in questo topic:

fari luminosi

Saluti
FluidGuitar
__________________

Tu non sai niente, Jon Snow!
FluidGuitar 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 06.20.07.


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