home | area personale         schemi | tutorial | robotica | pic micro | recensioni         forum | chat irc         faq | contatti         store | Ordina PCB
username
password
cerca

 
FORUM: Pic Micro
Tutto quanto riguarda questi microprocessori... progetti, suggerimenti, aiuti, discussioni...ecc


RS232 in bit banging con interrupt, non va.
     
Autore Messaggio opzioni
picmicro675




una ogni 10 livelli


postato il:
13.06.2018, alle ore 12:18
Oggi ho fatto le prove con il nuovo 12F675 (si potrebbe usare anche un 12F629) e devo dire che funzionicchia.
C'è un errore per una stringa di caratteri. Solo il primo carattere viene reinviato alla seriale corretto, se la trasmissione continua allora i caratteri seguenti non sono interpretati correttamente.
Mentre per un carattere alla volta non ci sono problemi. Forse c'è un problema nel distinguere il bit di start.



Anno nuovo, forum nuovo.
Mi sa che lascio.
picmicro675




una ogni 10 livelli


postato il:
14.06.2018, alle ore 08:13
Ho bisogno di simulare la seriale. Come è possibile con MP SIM ?


Anno nuovo, forum nuovo.
Mi sa che lascio.
marsram




una ogni 100 livelli
una ogni 10 livelli


postato il:
14.06.2018, alle ore 16:10
L'uso dei file stimulus non è immediato, ma neanche impossibile




http://www.microchip.com/forums/m786814-p2.aspx
https://www.microchip.com/forums/m109149.aspx

Ma potrebbe non servire.
- metti un breakpoint al momento del check del pin RX
- cambia manualmente il valore del bit come vuoi
- segui step-by-step le istruzioni di riconoscimento del bit
e se ci sono problemi di struttura logica si dovrebbe vedere subito al primo bit.
Poi c'è solo da controllare che il contatore di bit faccia il suo lavoro: se funziona per un bit, funziona per tutti gli altri


Io ho detto che Timer0 non si può spegnere, non che non si può fermare.
So benissimo che se si sospende il clock non conta.
Ma cosa servirebbe?

- se non si desidera l'interrupt, basta cancellare il flag IE
- se serve il conteggio ad un istante particolare, si legge il contatore
- se serve fermare il conteggio e riprenderlo dopo, si copia il contatore e lo si ricarica quando si riprende
In nessuno di questi casi serve fermare il timer col sospendere il clock. Anzi, non vedo proprio una applicazione pratica per questo evento che richiede T0CKI in condizioni che magari non si possono avere.

Timer0 è un free running ed è fatto per questo scopo. Se si vuole un timer non free running e controllabile c'è Timer1 che ha anche un control gate proprio per il contatore.
picmicro675




una ogni 10 livelli


postato il:
14.06.2018, alle ore 18:47
[quote]L'uso dei file stimulus non è immediato, ma neanche impossibile[/code]
Ma neanche documentato

Mi sono informato per SCL.
https://www.microchip.com/forums/m111255.aspx
Leggermente vicino al primo link.

Analizzando con MPLAB SIM, comincio a vedere che una volta scritto il primo carattere, la lettura continua ad aumentare il puntatore al successivo byte in RD_PTR. Credo che ho fatto un ragionamento diverso.

Ho messo uno stimolo di Pulse->Low su GP2 (20 o 200 cicli), poi un breakpoint dopo il rilevamento di INTE, ma non avviene il risultato, Sebbene INTCON è impostato a ricevere INTE, visto che corrisponde a 0xDC = 0b11011100.

Quindi se in hardware ho il primo effetto di vedere il primo carattere e gli altri no, mi diventa difficile capire se il simulatore fa le cose giuste. Quando al simulatore non si presenta neanche al primo segnale di interrupt.

Sempre molto ostico poter iniettare un carattere e poterlo valutare.



Anno nuovo, forum nuovo.
Mi sa che lascio.
marsram




una ogni 100 livelli
una ogni 10 livelli


postato il:
14.06.2018, alle ore 19:35
Certamente alcuni aspetti, come quello citato, non sono per nulla documentati in modo soddisfacente (il che è molto male). Peraltro, si tratta di cose che, come il più "normale" ICD non sono diffusi troppo al di fuori dell'ambiante professional.

Comunque, la faccenda di verificare se una serie di istruzioni fa quello che deve di fronte ad un segnale dinamico, come il caso della ricezione, NON è per niente semplice e va affrontato in modo diverso.

Una ricezione seriale nel modo più semplice esegue le seguenti azioni:
- attesa del fronte della comunicazione
- temporizzare 1/2 bit di tempo e campionare
- il primo bit che è lo start viene scartato
- si ricampiona a 1 bit di tempo e si shifta il valore in un buffer
- si ripete 8 volte
- si scarta il bit di stop
Penso che anche questa funga così.

Per prima cosa occorre verificare che il flusso logico delle istruzioni faccia quello che deve - un programma deve funzionare per primo nella mente del programmatore. Questo NON è per nulla secondario.

NON serve un segnale esterno , che sarebbe impossibile da seguire
A meno di impostare il tracking delle istruzioni e poi verificare punto per punto la lista. Non molto pratico, da limitare a casi di segnali dinamici complessi.

Meglio affrontare il loop come se fosse solamente un loop logico, inserendo a mano l'input.

Il segnale da "iniettare" è solo una variazione di livello ad un pin. Peraltro potrebbero anche essere tutti uguali: quello che dobbiamo verificare è il fatto che vengano shiftati correttamente a formare il byte.

Non serve avere l'interrupt del timer, anzi, è meglio sospenderlo.

In effetti la cosa è composta da due parti ben distinte:
- l'interruzione del timer, col cambio di tempo di campionamento
Questo può benissimo non esserci. Basta verificare che faccia quello che ci si aspetta, cosa che si può fare anche solo leggendo le istruzioni.

- il check del bit RX, che a sua volta contiene lo shift di n bit con un contatore

Operativo:
- escludere la trasmissione
- avviare per inizializzare il tutto, ma senza interrupt
- fermare sull' attesa del fronte
- inserire il fronte a mano
- steppare sui passi successivi e vedere che ci si prepara a ricampioare a 1 bit
- si ritorna all'attesa del fronte
- ora il bit viene salvato mentre il contatore relativo si riduce
- dopo 8 ricezioni, si deve scartare lo stop

Se il byte è corretto e non ci appaiono problemi logici nella gestione del timer, si riavvia il tutto, sempre senza TX e con la ricezione reale e non ci dovrebbero essere problemi.

Mi spiace di non avere tempo per seguire meglio la cosa, ma un debug di roba scritta da altri non è per niente immediato, sopratutto se manca un flowchart da cui individuare rapidamente il percorso logico ed i punti critici.

Domanda: hai provato l'originale senza modifiche? Funziona? perchè se gà questo non va.....
Se funziona, vuol dire che la logica è corretta e il problema dipende dalle modifiche fatte.
Verifica le modifiche inserendole solo un poco alla volta.

picmicro675




una ogni 10 livelli


postato il:
14.06.2018, alle ore 21:37
La logica della seriale è come l' hai descritta. Ho pensato anche altre varianti per poter assecondare le necessità.

L' originale non ha una utilità per sé. Fa solo il suo lavoro, dimostra una trasmissione in seriale a 9600 baud, ma ben difficile si alloca in un contesto più ampio. Inoltre usa L' IOC e non INTE.

Ho altri ingressi con IOC, quindi smistare tali segnali aggraverebbe la situazione.

Ho scritto anche il flowchart. Non essendo bene a conoscenza dei simboli,, spero solo che sia leggibile.
http://www.grix.it/UserFiles/picmicro675/File/TransitFiles/F…



Anno nuovo, forum nuovo.
Mi sa che lascio.
picmicro675




una ogni 10 livelli


postato il:
14.06.2018, alle ore 21:44
Ah!. La ricezione avviene già come il programma sta lavorando. Solo che succede solo per il primo carattere.
Non riesco a trovare la causa per il quale tutto si blocca dopo il primo carattere.

Ho anche una diversa versione, che non da importanza ad avere un buffer ciclico, ma solo che raggiunge il riempimento. Questa sarebbe quella che alla fine dovrei innestare nel resto del programma.

Vedo anche questa variante... Se magari non ha il problema come questo sorgente.



Anno nuovo, forum nuovo.
Mi sa che lascio.
marsram




una ogni 100 livelli
una ogni 10 livelli


postato il:
15.06.2018, alle ore 10:56
A spanne l'unica cosa che ferma la ricezione di caratteri successivi al primo è che, ricevuto questo, l'interrupt di RX non è riabilitato per il successivo start bit.

marsram




una ogni 100 livelli
una ogni 10 livelli


postato il:
15.06.2018, alle ore 13:37
Se la cosa riguarda la Get232, c'è da dire che questa movimenta il buffer, ma riceve un solo carattere per volta.
picmicro675




una ogni 10 livelli


postato il:
15.06.2018, alle ore 13:44
Direi che ho trovato quello che funziona.
http://www.grix.it/UserFiles/picmicro675/File/TransitFiles/s…
Per lo scopo dove inserirlo, va bene. Devo solo vedere che non ci siano discrepanze.
Ringrazio tanto per il supporto, ho appreso qualche altra esperienza.

Una cosa che continuo a faticare ad utilizzare è il simulatore della Microchip. Penso che sia molto potente, ma senza documentazione diventa inutile.



Anno nuovo, forum nuovo.
Mi sa che lascio.
segui questo thread con grixFC, per questa funzione devi aver installato il software grixFC

torna su
     

Come utente anonimo puoi leggere il contenuto di questo forum ma per aprire una discussione
o per partecipare ad una discussione esistente devi essere registrato ed accedere al sito




 







 
 
indietro | homepage | torna su copyright © 2004/2024 GRIX.IT - La community dell'elettronica Amatoriale