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




Spedizione carattere RS232 - pic 16f876A


Messaggi consigliati

Inserito:

Salve a tutti o voi illuminati laugh.gif

è qualche giorno che sto sbattendo letteralmente la testa su una demoboard dove è montato un display con il classico controller hitachi e un pic 16f876A completo di max232...

mi sono scritto la routine di gestione del display in quanto non è mappato su una porta ma su pin sparsi...

il problema è:

spedisco un carattere dal pc alla board .. il carattere viene comparato, e se corrisponde allora si accende un led..

fin qui niente di complicato direste.. bene ... allora... il carattere viene correttamente ricevuto e riconosciuto.. (il led si accende) .. però quando vado a visualizzare il carattere ricevuto e/o vado a rispedirlo in rs232 per una verifica, non viene visualizzato correttamente ma vengono visualizzati altri caratteri strani come punti o lineette o altri geroglifici..

vi allego la routine che uso:

            
char check='r';
if(interrupt==1)
            {
               
               if(ricezione==check)
               {

               output_low(PIN_C3);
               printf("\nCOMANDO RICEVUTO\n\r");
               printf(send_char,"\cCOMANDO RICEVUTO: %C",ricezione);
               output_low(PIN_B4);
               interrupt=1;
               ricezione=' ';
               }
               else
               {
               output_low(PIN_C3);
               printf("\nCOMANDO ERRATO: %C\n\r",ricezione);
               printf(send_char,"\cCOMANDO ERRATO: %C",ricezione);
               output_high(PIN_B4);
               ricezione=' ';
               interrupt=1;
               }

chiedo lumi... ho provato a swappare i bit little-endian/big-endian ma il risultato non cambia.. e non capisco come mai.. il %C è il classico char della printf.. ho provato con %S ma non cambia nulla...

grazie a tutti worthy.gif


Inserita:

Premetto che di C mastico molto poco...

Non ho capito se i caratteri strani compaiono sul display o sul ritorno al pc.

Se e' la seconda quelle volte che mi e' capitato era dovuto al baudrate impostato male (o il formato della parola: parita',ecc.) oppure al fatto che mancavano i caratteri di controllo ("CR" e "LF") che servono al terminale.

Se e' invece la prima e' probabile che non arrivino al display i caratteri di controllo.

Ad es. in pic basic devono essere specificati prima di spedire la stringa da visualizzare:

$FE, 1 Clear display

$FE, 2 Return home (beginning of first line)

$FE, $0C Cursor off

$FE, $0E Underline cursor on

$FE, $0F Blinking cursor on

$FE, $10 Move cursor left one position

$FE, $14 Move cursor right one position

$FE, $C0 Move cursor to beginning of second line

$FE, $94 Move cursor to beginning of third line

$FE, $D4 Move cursor to beginning of fourth line

P.S. Scusami se ho cannato l' argomento.wink.gif

Inserita:

ho ricontrollato tutti i comandi e le temporizzazioni e vanno tutti bene...

il carattere strano appare sia sul display che sul pc come ritorno..

e l'unica cosa strana che ho notato è che se tengo premuto il tasto sulla tastiera del pc, allora la lettera compare correttamente sul display per tutto il tempo che la tengo premuta..

boh

Inserita:

Che siano quei due "\n" (LF) in testa alle stringhe ?

Provato a toglierli o ad aggiungerci anche un "\r" (CR) ?

Inserita:

ho provato ma non cambia niente... adesso si comporta in modo strano anche la ricezione del pic... a volte non prende il carattere..

Inserita: (modificato)

Stai utlilizzando la usart (spi) del pic o la comunicazione la gestisci con altri pin?

Del programma mi fido, in quanto come detto il C riesco solo a leggerlo un po' ma non ad utilizzarlo seriamente.

Per quanto riguarda l' hardware sei sicuro che sia ok, hai gia' utilizzato quella circuiteria altre volte ?

Recentemente ho perso un bel po' di tempo con un max232 che andava ad intermittenza e i problemi sono risultati 2:

In base alla sigla (lettera finale) vanno usati dei condensatori per il circuito a pompa di capacita' diversa.

Solitamente usavo 1uF (max232) e invece quello che avevo voleva 0.1uF (max232a).

Ho inserito un diodo (basta un comune 1N4148) sull' alimentazione che va al pin 16 del convertitore perche' c'erano dei ritorni "strani" dalla seriale o dal circuito.

Non mi era mai capitato e mi sono accorto dal led dell' alimentatore che si affievoliva un po'.

Forse l' hai gia' fatto ma io proverei con un programma semplice che lavori solo con la seriale.

Una sorta di : invio un carattere "x" e il pic mi risponde con un carattere "y".

Cosi' almeno sei sicuro che la parte seriale funziona correttamente.

Un' ultima considerazione: che programma usi come terminale ?

L' hyperterminal standard di windows non e' malaccio ma mi e' successo spesso che vada un po' per i fatti suoi, specie con le operazioni "insistenti".

Modificato: da mf2hd
Inserita:

si si ma la seriale funziona correttamente..

ho provato a mandare solo dei caratteri tipo printf("a") e quelli li manda correttaemnte ho provato anche a fare così:

printf("%C",'a') e il carattere viene inviato correttamente... no capisco dove sia l'errore

Inserita:

Simons una domanda: nel tuo codice c'è

if (interrupt == 1)

poi nell'if interno in entrambi i casi hai l'istruzione

interrupt = 1

non è che ricevi un carattere entri nel primo if poi ricezione == check e fai l'if interno

ma dopo interrupt rimane sempre 1 e cadi continuamente nell'else dell'if interno sovrapponendo le risposte sulla seriale

(forse...)

Inserita:

ciao accacca si mi ero accorto di quella cosa e l'ho corretta subito dopo aver postato ma non ho corretto il codice..

in pratica ho la routine di interrupt che al suo interno ha:

ricezione = getc();

interrupt = 1;

enable_interrupts(INT_RDA);

e poi nella main al posto di interrupt=1 c'è interrupt=0.

Però la cosa strana che ho notato è che se tengo premuto un tasto sull'hyperterminal, sul display della board viene visualizzato correttamente..(ripetutamente) poi se lo lascio allora ritornano i caratteri strani...

sad.gif

Inserita:

cioe' sembra che sino a che riceve qualcosa e' ok e appena manca trasmissione va per i fatti suoi...

Quella "send_char" e' una funzione o una variabile (stringa)?

Forse il buffer o la stringa di trasmissione/ricezione si "svuota" o cambia quando cessa la trasmissione/ricezione.

Potresti provare dichiarando una stringa vera e propria e usare sprintf (nome_stringa,...) al posto del printf.

Ammetto di portare poco contributo al thread, ma pur conoscendo poco di C, il discorso mi interessa per un progettino che ho in mente e vorrei conoscere gli sviluppi dell' inghippo. smile.gif

Inserita:

infatti penso che il problema sia proprio nel buffer...

la send_char è una funzione che scrive sull'lcd.. tramite la printf gli passo l'argomento (cioè il testo da visualizzare) però il carattere ricevuto non lo visualizza bene nè la printf per il display nè la printf che scrive in seriale...

Inserita:

allora ho notato una cosa.... togliendo la ritrasmissione in seriale e visualizzando solo sul display il carattere viene scritto correttamente...

sembra quasi che ogni volta che lancio la printf o comunque lancio una comm seriale, si scateni l'interrupt sulla ricezione! ho provato a disabilitarlo e riabilitarlo ma niente di niente!!

uff sad.gif

Inserita:

ho finalmente risolto il problema!!

la funzione set_tris_c(0b00000000) settava tutti i pin come uscite, anche quello di ricezione.. eliminando quella riga ogni carattere viene stampato correttamente!!!!

Inserita:

Bravo Simons!!

Bravo due volte perchè hai risolto e perchè hai inserito la soluzione per tutti

Inserita: (modificato)

lieto d'essere stato d'aiuto per tutti smile.gif

Adesso che mi sono arrivati anche i sensori Dallas 18B20 OneWire, ho già sfruttato la test board per fare un piccolo termometro che spedisce in rs232 e funziona alla grande!!

ecco un paio di foto:

user posted image user posted image

smile.gif

Modificato: da Simons
Inserita:

Simons hai colto in pieno lo spirito del forum.

Piccola curiosità: hai avuto problemi con lo 1Wire protocol?

Inserita:

per ora, essendo ancora in fase di test, non ho riscontrato particolari problemi... devo ancora provare il sensore sulle "lunghe" distanze .. diciamo non più di 2 metri.. dovrei fare il collegamento con cavo tripolare (+5v,GND,segnale) + schermo... siccome prevedo l'utilizzo in macchina può darsi ci siano interferenze.. questo lo dovrò provare sul campo...

avete consigli in merito?

Inserita:

ciao a tutti.. ho avuto modo di testare la sonda 1-wire con un cavo non schermato (era un vecchio cavo del telefono di quelli della alcatel) di un paio di metri di lunghezza e la lettura della temperatura non ne ha risentito... l'ambiente non è rumoroso anche perchè mi trovo in casa.. può darsi che in macchina ci sia più rumore e interferenze...

volevo intanto condividere con voi questo video della mia test board:

il display visualizza RUNNING...[READ][ ] quando riconosce una 'r' inviata dalla seriale. scrive UNKNOWN COMMAND se il carattere digitato dopo la 'r' non viene riconosciuto.

scrive RUNNING... [uNKNOWN] per 500ms se il comando iniziale non è una 'r'

nella seconda riga ci viene scritto sempre WAITING FOR COMMAND , eccetto quando si vuole visualizzare il valore.

't' per la temperatura

'v' per la tensione

'c' per i custom chars settati nella CG-RAM del display nella fase iniziale del programma

il led rosso si accende quando uno dei 3 comandi è riconosciuto

smile.gif se avete domande posso anche postare un pezzo del codice

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