Vai al contenuto
PLC Forum


Spedizione carattere RS232 - pic 16f876A


Simons

Messaggi consigliati

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

Link al commento
Condividi su altri siti


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

Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

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
Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

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
Link al commento
Condividi su altri siti

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?

Link al commento
Condividi su altri siti

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

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