|
|
#1 |
|
Registered User
|
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
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? |
|
|
|
|
|
#2 |
|
Registered User
|
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 |
|
|
|
|
|
#3 |
|
Registered User
|
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. |
|
|
|
|
|
#4 | |
|
Registered User
|
Quote:
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 |
|
|
|
|
|
|
#5 |
|
Registered User
|
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 |
|
|
|
|
|
#6 |
|
Super Moderator
|
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! |
|
|
|
![]() |
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 | |
|
|