Vai al contenuto
PLC Forum

Partecipa anche tu alla Live su Youtube martedì 28/01/2025 per festeggiare i 24 anni di PLC Forum

Per ulteriori informazioni leggi questa discussione: https://www.plcforum.it/f/topic/326513-28012025




16F84 e RS232 - Consiglio di gestione della ricezione


Messaggi consigliati

Inserito: (modificato)

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:.

Inserita:

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

Inserita:

Ora non ricordo precisamente la serie 16 , ma nella serie 18 è possibile avere l'interrupt alla recezione di un carattere.

Ciaooooooo

Inserita:

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.

Inserita:

Pardon!

Infatti io lavoro con serie 18 ... sono solo vantaggi! biggrin.gif

Inserita:

Anche i uC della serie 16f hanno quasi tutti l'USART integrato, ed anche un paio a volte.

  • 3 weeks later...
Inserita:

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.

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...