Vai al contenuto
PLC Forum


16F84 e RS232 - Consiglio di gestione della ricezione


.:Matrix:.

Messaggi consigliati

Un saluto a tutti i frequentatori del forum.

Sto mettendo a punto un circuito che usa un 16F84 ed un MAX232 per ricevere dei dati in formato RS232.

Vorrei da voi un consiglio su come "attivare" la lettura dei byte da parte del pic all'arrivo del segnale seriale.

Io avevo pensato di utilizzare l'interrupt del cambiamento di stato su uno dei pin 4-7 della porta B oppure usare l'interrupt esterno su port B pin 0.

Nella routine di interrupt, richiamavo la routine di lettura dei dati RS232 e li andavo a "parcheggiare" in un buffer.

Secondo voi, potrebbe essere la soluzione migliore?

Avrei anche bisogno di un suggerimento di come implementare un buffer a 10 byte per la ricezione dei dati.

Grazie.

Luigi

Modificato: da .:Matrix:.
Link al commento
Condividi su altri siti


ma l'interrupt non puoi farlo attivare direttamente dai dati seriali, altrimenti perdi dei bit.. potresti usare i segnali aggiuntivi della rs232 tipo (butto là) CTS, RTS o insomma quelli per attivare l'interrupt e poi lanciare la routine di lettura

Link al commento
Condividi su altri siti

Il 16F84 è un vecchio uController senza USART, quindi non ha l'interrupt di Rx sul carattere.

Si può ovviare scegliendo di attivare un interrupt esterno sul bit di Start, ovviamnete si sceglierà un protocollo che preveda il bit di start. RIcevuto il bit di start, che scatena l'interrupt eseterno su B0, la rutine testerà l'ingresso Rx a tempo di clock per verificare lo stato dei bit ricevuti.

Per fare un buffer di 10 byte se lavori in "C" dichiari un array di 10 e crei un untatore che incrementi ad ogni byte scritto. In pratica devi farti uno Stack o catasta lungo 10 byte.

Se invece usi asm, la tecnica è identica anche se un po' più macchinosa

Riservi un'area di RAM di 10 byte per il tuo buffer, usando l'allocazione assoluta (cfr le direttive di allocazione sul manuale asm), poi crei un registro contatore che, all'inizio della scrittura, carichi con l'indirizzo del primo byte, ad ogni scrittura incrementi il registro.

Link al commento
Condividi su altri siti

  • 3 weeks later...

Grazie Livio per l'esauriente risposta.

In effetti avevo implementato la stessa tipologia di listato facendo attivare l'INT0 del PIC sulla variazione del bit di start, e poi successivamente campionavo ad intervalli lunghi la durata di un BIT di un frame RS232 a 9600 bps infilando i vari bit con uno shift a destra in una variabile temporanea che successivamente veniva "spostata" nel buffer da 10 byte precedentemente allocato utilizzando il registro "puntatore" del PIC 'FSR' che veviva incrementato di byte in byte in modo da avere in ram i dieci byte del frame RS232.

Link al commento
Condividi su altri siti

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 account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...