DavidOne71 Inserito: 13 settembre 2008 Segnala Share Inserito: 13 settembre 2008 Buongiorno a tutti, spero riesca a farmi capire perchè la cosa è abbastanza complicata, almeno credo.Ho due schede e comunicano tra di loro in modo seriale usando 2 pic.La scheda A invia una sequenza di byte 1 volta ogni 1/2 secondo circa, la scheda B è pronta a riceverli in qualsiasi momento usando l'interrupt sull'ingresso.Appena ricevuti i byte la scheda B esegue una routine che impiega circa 3 secondi ovviamente questa verrà interrotta dalla trasmissione dati almeno qualche volta.Per gestire errori di comunicazione e vari interruttori sulla scheda B, avrei bisogno che il programma principale (scorra) cioè eseguire istruzioni nei 3 secondi di cui sopra senza dover perdere la comunicazione seriale.Qualcuno avrebbe qualche idea per implementare il codice?Grazie milleSaluti Link al commento Condividi su altri siti More sharing options...
Simons Inserita: 13 settembre 2008 Segnala Share Inserita: 13 settembre 2008 cosa gli fai fare in 3 secondi? magari riesci a farlo diversamente.. che deve fare la seconda scheda? Link al commento Condividi su altri siti More sharing options...
DavidOne71 Inserita: 14 settembre 2008 Autore Segnala Share Inserita: 14 settembre 2008 Attivo un buzzer: 80ms on 80 ms off e questo si ripete x 20 volte più una pausa di 2 sec.In effetti avevo detto circa 3 sec ma facendo i conti sono 5,2 sIl buzzer viene attivato dalla seriale e in + accende anche un led.Il led viene acceso per la durata effettiva del segnale proveniente dalla scheda A (può variare da 0 s a infinito) invece il buzzer viene attivato dal segnale della scheda A ma viene spento dalla scheda B nei tempi di cui sopra.Intendi la B?Fa quello che ho detto sopra e gestirà: degli interruttori, anomalie di trasmissione e ricezione ecc.. Link al commento Condividi su altri siti More sharing options...
Simons Inserita: 14 settembre 2008 Segnala Share Inserita: 14 settembre 2008 cosa usi come compilatore?in che modo fai suonare il buzzer? con un interrupt o routine di delay? sarebbe meglio gestirlo con gli interrupt perlomeno il programma continua a girare e non dorme in quei ms del delay Link al commento Condividi su altri siti More sharing options...
DavidOne71 Inserita: 15 settembre 2008 Autore Segnala Share Inserita: 15 settembre 2008 MPASM penso Comunque l'assembler dentro MPLAB IDE 8.14Una routine di delaySarei anche d'accordo, ma se l'interupt lo uso già per sentire l'ingresso seriale come fa a gestire anche il buzzer?Ho appena finito ieri il codice per gestire il ritardo senza che dormi.Un pò complicato direi, comunque rimango sempre in attesa di qualche idea.. Link al commento Condividi su altri siti More sharing options...
Simons Inserita: 15 settembre 2008 Segnala Share Inserita: 15 settembre 2008 ci sono diversi interrupt in un pic.. puoi usare anche il timer1 o 2 Link al commento Condividi su altri siti More sharing options...
DavidOne71 Inserita: 16 settembre 2008 Autore Segnala Share Inserita: 16 settembre 2008 Come faresti? non dico di stendermi il progr.. ma almeno i passi.. Link al commento Condividi su altri siti More sharing options...
Simons Inserita: 16 settembre 2008 Segnala Share Inserita: 16 settembre 2008 esempio il timer0 gestisce il buzzer, l'interrupt sulla seriale gestisce i dati in arrivo, e poi hai il resto del programma che gestisce interruttori e il resto Link al commento Condividi su altri siti More sharing options...
Livio Orsini Inserita: 16 settembre 2008 Segnala Share Inserita: 16 settembre 2008 #int_extvoid Timer10ms() { set_timer1(0xB1DF); // Caricato 15535 ==> // 20.000 * 4 * 125nsec = 10msec // 65535 - 20000 = 45535(0xB1DF) rd_ad (); if ( time_data >0) { time_data--; } else { time_data = 5; } }#INT_RDARx_232(){ ibuff_Rx[iRxpnt] = getc(); iRxpnt++; enable_interrupts (INT_RDA); if (iRxpnt>=16){ iRxpnt = 0; }}Sono due funzioni scritte in "C", io scrivo praticamente solo in "C" e, al limite, ottimizzo pezzi in asm, però la filosofia degli interrupts non cambia Link al commento Condividi su altri siti More sharing options...
DavidOne71 Inserita: 16 settembre 2008 Autore Segnala Share Inserita: 16 settembre 2008 non conosco il C! L'utimo pezzo penso che sia l'interrupt per la seriale giusto?Il primo non l'ho capito. Un interr ad ogni 10mS? Link al commento Condividi su altri siti More sharing options...
Livio Orsini Inserita: 16 settembre 2008 Segnala Share Inserita: 16 settembre 2008 Si il primo è l'interrupt ogni 10ms, con quarzo da 8 MHz.In pratica abiliti l'interrupt di TMR1 e, quando scade TMR1, nella routine di servizio lo ricarichi con il complemento a FFFFhIl secondo è l'interrupt di ricezione della seriale. Link al commento Condividi su altri siti More sharing options...
DavidOne71 Inserita: 17 settembre 2008 Autore Segnala Share Inserita: 17 settembre 2008 la domanda mi sorge spontanea!Ma se si attiva l'interrupt dei 10ms e faccio suonare il buzzer, riesce a sentire anche l'interrupt della seriale? o deve prima finire l'interrupt di cui sopra Link al commento Condividi su altri siti More sharing options...
Livio Orsini Inserita: 17 settembre 2008 Segnala Share Inserita: 17 settembre 2008 In caso di concomitanza viene servito per primo l'interrupt con maggior priorità, l'altro (o gli altri) rimangono pendenti sino quando, terminata la routine di servizio, si riabilitano gli interrupts.Puoi sceglere se riabilitare subito gli interrupt dopo la prima riga della routine di servizio, o immediatamente prima del ritorno, o in qualsiasi altro punto.L'unico problema che può nascere con l'uso di interrupts multipli è che la coda di interruots pendenti si allunghi troppo. Per evitare uesto bisogna valutare bene l'impegno del tempo di CPU per ogni servizio all'interruot e la sua frequenza.Da come descrivi il tuo problema non credo che tu possa incorrere in questa disavventura, a meno di errori di programamzione. Link al commento Condividi su altri siti More sharing options...
DavidOne71 Inserita: 17 settembre 2008 Autore Segnala Share Inserita: 17 settembre 2008 Questa cosa della priorità mi interessa, avevo letto qualcosa ma pensavo solo per certi pic, io uso il 16F690 e il 12F629.Cavolo domani parto per le ferie e torno fra due settimane, mi documenterò e se c'è qualcosa farò qualche prova ma penso che ci sentiremo ancora..Per il momento 1000 grazieUn saluto a tutti Link al commento Condividi su altri siti More sharing options...
DavidOne71 Inserita: 16 ottobre 2008 Autore Segnala Share Inserita: 16 ottobre 2008 Ciao a tutti, eccomi ancora quà alle prese con questi maledetti interrupts.. ho fatto delle prove ed ho attivato l'interrupt del timer insieme all'interrupt della porta GP2 ext.Se c'è una richiesta di interrupt da parte del tmr ed eseguo il codice e mettiamo il caso che impieghi una 50ina di us, in questo lasso di tempo arriva il segnale per la comunicazione seriale, l'interrupt della seriale non parte fino a quando non ha finito quella del timer, perdendo così la comunicazione Sbaglio qualcosa? 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