|
|
|
|
#1 |
|
Registered User
|
chiarimenti USART
stò iniziando un progetto che prevede uno scambio dati tra un F886 (master) e un F88 (slave). leggendo i DS e qualche tutorial di Microchip mi sono fatto ancora + confusione.
la mia richiesta è se potete indicarmi quale configurazione usare (SYnch o Async Half o Full Duplex) e come posso inviare + byte (7) da Master a Slave. grazie |
|
|
|
|
|
#2 | |
|
Credendo Vites
|
Quote:
Se è lo slave che deve trasmettere qualcosa al master, lo stesso slave dovrà, prima di ogni altra cosa aspettare che il master lo "interroghi", ovvero che gli passi temporaneamente il controllo del canale, fintanto che lo slave non ha compiuto una singola trasmissione (ovvero non ha trasferito solo i canonici otto bit), allo scadere di questa comunicazione, il bus torna sotto il controllo esclusivo del master, e se lo slave deve trasmettere nuovi dati, dovrà attendere una nuova "interrogazione" da parte dell'unico master. Se invece vuoi impiegare una comunicazione asincrona, tutti i nodi appartenenti alla rete sono uguali, tutti possono parimenti trasmettere e ricevere simultaneamente, e, attraverso opportuni sistemi di controllo del bus chi deve trasmettere in un certo momento, se il canale è libero, ne prende il controllo solo momentaneamente rilasciandolo immediatamente dopo. In pratica, se specifichi un pò meglio cosa devi fare troviamo sicuramente la soluzione d'ottimo.
Il tempo è il miglior maestro, purtroppo uccide tutti i suoi allievi.
|
|
|
|
|
|
|
#3 | |
|
Registered User
|
Quote:
F88, su richiesta master invia al F886 1 byte. La distanza tra i due è di circa 50 metri e in futuro, se riesco a fare il codice, gli slave saranno tre. E' per questo che vorrei già da subito sviluppare il codice adatto ed è qui che non riesco ad orientarmi sul tipo di USART da usare.leggendo i DS mi stò orientando verso un Async Full Duplex. Ciò che vi chiedo è voi che tipo di usart avete usato per far questo e magari anche qualche consiglio. Il codice va implementato su un progetto già funzionante, a 8Mhz, oscillatore interno, ADC e I2C funzionante con altre periferiche. |
|
|
|
|
|
|
#4 |
|
Credendo Vites
|
In questo caso allora consiglio una comunicazione sincrona full duplex, nella quale il master detiene sempre il controllo della comunicazione.
__________________La comunicazione sincrona la puoi comunque ottenere con il medesimo modulo USART del tuo PIC è sufficiente che programmi opportunamente i registri TXSTA e RCSTA.
Il tempo è il miglior maestro, purtroppo uccide tutti i suoi allievi.
|
|
|
|
|
|
#5 |
|
Registered User
|
Per provare posso collegare direttamente i pin RX TX dei micro o mi conviene inserire un buffer tipo HC125, HC244 (già in casa)?
|
|
|
|
|
|
#6 | |
|
Registered User
|
Quote:
Il protocollo SW te lo puoi inventare tu con il master che polla gli slave a rotazione. Le UART sono già contenute nei PIC.
Camillo
Internet ti fa vedere tutto ma non ti fa toccare niente. (Camillo Ferrari) |
|
|
|
|
|
|
#7 | |
|
Registered User
|
Quote:
Chiedo se posso collegare direttamente gli I\O TX RX dei pic senza pericoli. Programmo in ASM ma non dovrei aver problemi per configurare il modulo USART. pensavo di fare già un "sincrono full duplex" con un unico indirizzo valido per lo slave F88. Qualche spassionato consiglio? ![]() |
|
|
|
|
|
|
#8 | |
|
Registered User
|
Quote:
Sincrono significa che devi portare un terzo filo col clock; non ne vedo la convenienza.
Camillo
Internet ti fa vedere tutto ma non ti fa toccare niente. (Camillo Ferrari) |
|
|
|
|
|
|
#9 | |
|
Registered User
|
Quote:
Ho ancora fatto confusione? |
|
|
|
|
|
|
#10 |
|
Registered User
|
Vi sono un mucchio di metodi per far transitare dei dati attraverso un'interfaccia hardware le più tipiche sono RS232 che è punto/punto ma anche RS485 su cui puoi collegare più unità.
__________________Le interfacce software più comuni sono: Asincrona i dati che transitano abbisognano di un collegamento (half) o 2 collegamenti (full) e devono avere una velocità comune (baudrate). Sincrona oltre ai dati occorre anche la linea del clock che serve per sincronizzarle. Se vuoi usare la RS485 il collegamento fisico può essere fatto di un paio di fili twistati, è la maniera più comoda ed è half duplex asincrona. All'interno della scheda invece i collegamenti sono 3 (lo scrivi anche tu) il terzo blocca il driver di trasmissione e serve anche al master quando riceve dei dati dopo averli chiesti.
Camillo
Internet ti fa vedere tutto ma non ti fa toccare niente. (Camillo Ferrari) |
|
|
|
|
|
#11 | |
|
Registered User
|
Quote:
![]() Chiedo un consiglio su chi ha già fatto lavori simili su come si è orientato. |
|
|
|
|
|
|
#13 | |
|
Registered User
|
Quote:
quindi hai realizzato un master, alcuni slave con "asincrona half duplex", come dovrei fare io.scusate se insisto ma quale metodo mi consigliate la prossima week inizio a provare e vorrei già orientarmi sulla configurazione finale in quanto uso il mio tempo libero per dedicarmi a questo hobby e non ne ho molto ![]() |
|
|
|
|
|
|
#14 |
|
Registered User
|
La configurazione che ho usato l'ho scelta perchè mi sembrava abbastanza semplice. Ho collegato tutti i componenti della rete tramite un normale cavo cat5 FTP (schermato). Gli slaves sono sempre in ascolto e non impegnano mai il bus in trasmissione se non espressamente indirizzati dal master. Del cavo FTP ho usato, oltre alla coppia per i dati, una seconda linea per l'alimentazione degli slaves.
|
|
|
|
|
|
#15 | |
|
Registered User
|
Quote:
![]() ai usato i pic 16.... o altri micro? nel tuo caso gli slave ricevono dati e inviano dati al master? |
|
|
|
|
|
|
#16 |
|
Registered User
|
Per il master ho usato il 16F877A e per gli slaves il 16F628A.
Il 16F628A, disponendo già di un suo oscillatore interno a 4 MHz non necessita di quarzo esterno, riducendo ulteriormente lo spazio richiesto per il PCB. Gli slaves ricevono comandi dal master ed ovviamente gli rispondono con il loro stato. |
|
|
|
|
|
#18 |
|
Registered User
|
come volevasi dimostrare mi sono impiantato
![]() il codice mi invia solo due word in sequenza ma io ne devo inviare 7. Il DS del F886 mostra come esempio di trasmissione fig. 12-10 invio di sole due word. Come si fa ad inviare + dati? allego il codice e se potete indicarmi dove modificare .Codice:
bcf INTCON,5 ;disabilita interrupt del timer movlw 25 ;baud rate 2400 ?? movwf SPBRG banksel TXSTA bsf TXSTA,CSRC ;bit 7 master mode in sincrono bsf TXSTA,SYNC ;bit 4 modo sincrono btfsc prog,0 ;vedi se leggere pulsanti o scrivere sul display ;goto Out_puls goto OutString_fi ;RIGA DI PROVA PER SALTARE I PULSANTI bsf led1 ;led spia usart in funzione banksel RCSTA bsf RCSTA,SPEN ;bit 7 configura le porte RX\DT e TX\CK per USART bcf RCSTA,SREN ;bit 5 disabilita ricezione singola, master in trasmissione bcf RCSTA,CREN ;bit 4 disabilita ricezione multipla, master in trasmissione banksel TXSTA bsf TXSTA,TXEN ;bit 5 abilita trasmissione OutString6 ;bit a "0" quindi scrivi sul display OutString3 banksel PIR1 ;e il banco dove ci sono PIR1 e TXREG movf progSLAVE,w ;carica byte generica principale movwf TXREG ;carica in registro di trasmissione btfss PIR1,TXIF ;bit 4 verifica se registro TXREG vuoto goto $-1 ;attendi sino allo svuotamento del registro TXREG movf minuti,w ;carica byte da visualizzare in prima riga lCD movwf TXREG ;carica in registro di trasmissione btfss PIR1,TXIF ;bit 4 verifica se registro TXREG vuoto goto $-1 ;attendi sino allo svuotamento del registro TXREG movf ore,w ;carica byte da visualizzare in seconda riga lCD movwf TXREG ;carica in registro di trasmissione btfss PIR1,TXIF ;verifica se registro TXREG vuoto goto $-1 ;attendi sino allo svuotamento del registro TXREG movf progDUE,w ;carica byte da variabile generica movwf TXREG ;carica in registro di trasmissione btfss PIR1,TXIF ;verifica se registro TXREG vuoto goto $-1 ;attendi sino allo svuotamento del registro TXREG movf stringa2,w ;carica byte da variabile generica movwf TXREG ;carica in registro di trasmissione btfss PIR1,TXIF ;verifica se registro TXREG vuoto goto $-1 ;attendi sino allo svuotamento del registro TXREG movf stringa,w ;carica byte da variabile ingresso movwf TXREG ;carica in registro di trasmissione btfss PIR1,TXIF ;verifica se registro TXREG vuoto goto $-1 ;attendi sino allo svuotamento del registro TXREG movf control,w ;carica byte da variabile controllo e indirizzamento movwf TXREG ;carica in registro di trasmissione btfss PIR1,TXIF ;verifica se registro TXREG vuoto goto $-1 ;attendi sino allo svuotamento del registro TXREG banksel TXSTA bcf TXSTA,TXEN ;disabilita trasmissione goto OutString_fi ; OutString_fi bcf led1 ;termina led spia bcf prog,0 ;resetta per lettura pulsanti bcf INTCON,2 ;resetta avvenuto interrupt timer bsf INTCON,5 ;riabilita interrupt timer Return |
|
|
|
|
|
#19 | |
|
Registered User
|
Quote:
Il problema è un'altro: testi TXIF ma quando lo azzeri? da solo non lo fa. Un'altra cosa: invii dei byte non delle word.
Camillo
Internet ti fa vedere tutto ma non ti fa toccare niente. (Camillo Ferrari) |
|
|
|
|
|
|
#20 | ||
|
Registered User
|
Quote:
Quote:
![]() lapsus ![]() ![]() mi sono accorto che c'erano dei banchi sbagliati ma ancora niente |
||
|
|
|
![]() |
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 | |
|
|