Jump to content
PLC Forum


Sign in to follow this  
sorecaro

Pic E Stringa Rs232

Recommended Posts

sorecaro

Buonasera a tutti, avrei la necessita di inviare una stringa ben definita ad un display rs232. Sto usando mikroc pro ed un pic16f877a, questo è il codice che sto usando

[code] void main() {




  UART1_Init(9600);             //abilita uart
  Delay_ms(200);

  while (1) {

        


       UART1_Write(0x02);       //start
        UART1_Write(0x01);         //indirizzo 1
        UART1_Write(0x1F);      //no g. elettronico
        UART1_Write(0x04);      //no g. elettonico
        UART1_Write(0x18);      //tabella 7x5
         UART1_Write(0x7F);     //carattere pieno
         UART1_Write(0x7F);     //carattere pieno
         UART1_Write(0x7F);     //carattere pieno
         UART1_Write(0x7F);     //carattere pieno
         UART1_Write(0x7F);     //carattere pieno
         UART1_Write(0x7F);     //carattere pieno
         UART1_Write(0x7F);     //carattere pieno
         UART1_Write(0x7F);     //carattere pieno
          UART1_Write(0x7F);     //carattere pieno
         UART1_Write(0x7F);     //carattere pieno
          UART1_Write(0x7F);     //carattere pieno
         UART1_Write(0x7F);     //carattere pieno
          UART1_Write(0x7F);     //carattere pieno
         UART1_Write(0x7F);     //carattere pieno
         UART1_Write(0x7F);     //carattere pieno
         UART1_Write(0x7F);     //carattere pieno
        UART1_Write(0x02);      //start
        UART1_Write(0x00);      //end

             
             delay_ms(1000);






                            }
    } [/code]


Per testare la stringa ho usato uno sniffer seriale, la stringa che invia il pic è ESATTA!!!! ma il display nulla.

Avete qualche consiglio???

Share this post


Link to post
Share on other sites

Livio Orsini

Se è così allora il problema sta nel misterioso display di cui nulla sappaimo.

Share this post


Link to post
Share on other sites
sorecaro

Livio purtroppo non so molto del display. Ho solo un manuale dove spiega la comunicazione. Prima era collegato in rs485, ma anche in quel modo nulla da fare. Allora ho provato ad usare rs232 inviando una stringa di esempio ( trovata nel manuale) ma nulla. Ho controllato il segnale che manda il Pic con oscilloscopio, tutto ok, entra nel micro del display.

Non vorrei che sto sbagliando io ad inviare la stringa. Forse il tempo di attesa tra 2 stringhe, non so più cosa fare.

Share this post


Link to post
Share on other sites
walterword

se invece di inviare i dati al displaymisterioso li invii ad hyperterminal o programma simile e li visualizzi vuol dire che non il PIC

Se non hai informazioni sul display fine del gioco ,se non hai un protocollo da seguire puoi sempre provare empiricamente con degli esperimenti , magari risolvi dopo 10 minuti o magari dopo 30 anni

Prova a pulire la seriale prima di spedire dati ed aspettare a rimandarne altri , verifica se c'e' una soglia di buffer o altro

Share this post


Link to post
Share on other sites
sorecaro

queste sono le sole informazioni che ho:

Il protocollo di comunicazione è monodirezionale, la comunicazione avviene solo dal
terminale al display.
I parametri seriali devono essere impostati nel seguente modo: 9600,N,8,1
La stringa da utilizzare, per la comunicazione, è composta da:
<STX> + <ID> + <caratteri di controllo> + <dati> + <STX> + <CRC> +
<NULL>
STX = codice ascii 0x02 che equivale allo start del messaggio.
ID = indirizzo del display che, nel caso di collegamento RS422 o RS485
può assumere un valore da 1 a 254, mentre nel caso di un display
collegato in RS232 è 1.
dati = dovrà contenere il blocco dati da visualizzare compresi gli attributi
degli stessi.
NULL = codice ascii 0x00 che equivale alla chiusura della stringa.
CRC = il crc è il carattere di controllo della stringa, è attivato solo su
richiesta del cliente, serve per verificarne la corretta ricezione e consiste in
un byte che è la somma a 255 senza riporto di tutti i bytes della stringa
trasmessa. Un esempio si può trovare alla fine del documento.
Il dysplay è in grado di memorizzare fino a 640
blocchi di dati (10240 bytes), per blocco si intende una riga da 16 caratteri.
Il numero di blocchi è influenzato dagli effetti introdotti in quanto per ogni effetto è
utilizzato un byte di controllo.
Se per esempio si cambiasse l’attributo o l’effetto ad ogni singolo carattere il numero di
blocchi si dimezzerebbe.
Il tempo necessario per la visualizzazione di 640 blocchi su una singola riga è di circa 25
minuti.
Considerando il fatto che non vi è nessun vincolo relativo al numero di caratteri
memorizzabili su ciascuna riga è quindi possibile memorizzare un blocco per 3 righe e
637 per la quarta, oppure 160 blocchi per ciascuna riga, in quest’ultimo caso avremmo a
disposizione 160 pagine da 4 righe di 16 caratteri che impiegherebbero poco piu’ di 6
minuti per essere visualizzate tutte.
Caratteri di controllo riconosciuti nel blocco messaggi :
Tabella 1
Stop 0x10 Attributo di STOP
Blink 0x11 Attributo di BLINK
SetTable0 0x18 Tabella ASCII 7x5
SetTable1 0x19 Tabella ASCII 14x10a
SetTable2 0x1B Tabella GRAFICA 7x5
SetTable3 0x1C Tabella GRAFICA 14x10a
StopInfinito 0x1E Attributo di STOP INFINITO
ShiftCmdTable 0x1F Utilizzato per selezionare
la modalità comandi estesa
(vedi Tabella2)
Tabella 2
StartFlash 0x03 Attiva la modalità giornale elettronico
StopFlash 0x04 Disattiva la modalità giornale elettronico
StartShiftUp 0x05 Attiva la modalità shift-up (ingresso dall’alto)
StopShiftUp 0x06 Disattiva la modalità shift-up (ingresso dall’alto)
StartShiftDown 0x07 Attiva la modalità shift-down (ingresso dal basso)
StopShiftDown 0x08 Disattiva la modalità shift-down (ingresso dal basso)
Comandi a 3 bytes dove il 3° è il parametro
SetFlashTime 0x17 Il valore che segue imposta il tempo di flash in unita’ di
Stop (circa 2 secondi).
Questo comando serve per impostare il tempo di permanenza della pagina inserita.
- Esempio di invio del messaggio "12345ABCDE" in modalita’ giornale elettronico con
ingresso messaggio dall’ alto:
STX ID CARATTERI DI CONTROLLO DATI STX NULL
------ ----------- ------------------------------------------ ------------------- ------ --------
0x02 0x01 0x1F 0x03 0x18 0x1F 0x05 "12345ABCDEF" 0x02 0x00
START INDIRIZZO 1 G. ELETTRONICO TABELLA 7X5 INGRESSO ALTO MESSAGGIO START END
- Esempio di invio del messaggio "12345ABCDE" scorrevole :
STX ID CARATTERI DI CONTROLLO DATI STX NULL
------ ----------- ------------------------------------------ ------------------- ------ --------
0x02 0x01 0x1F 0x04 0x18 "12345ABCDEF" 0x02 0x00
START INDIRIZZO 1 NO G. ELETTRONICO TABELLA 7X5 MESSAGGIO START END

Share this post


Link to post
Share on other sites
walterword

il CRC lo calcoli ? ....lo devi inviare perche il display poi farà un test

Share this post


Link to post
Share on other sites
sorecaro

Fino ad ora ho provato senza CRC. Nel manuale c'è questo esempio:

Esempio di invio del messaggio "12345ABCDE" in modalita’ giornale elettronico con
ingresso messaggio dall’ alto e crc attivo:
STX ID CARATTERI DI CONTROLLO DATI STX CRC
------ ----------- ------------------------------------------ ------------------- ------ --------
0x02 0x01 0x1F 0x03 0x18 0x1F 0x05 "12345ABCDEF" 0x02 0xF7
START INDIRIZZO 1 G. ELETTRONICO TABELLA 7X5 INGRESSO ALTO MESSAGGIO START CRC
NULL
--------
0x00
END

Più tardi provo con questa stringa.

Una volta inviata la stringa al display mi metto in ricezione con il pic, se la stringa è stata inviata correttamente il display dovrebbe inviarmi il valore 0xF7 giusto????

Non sono molto esperto di comunicazioni seriali :-)

Edited by sorecaro

Share this post


Link to post
Share on other sites
Livio Orsini

Il consiglio di Walter è esemplare.

Bisogna sempre partire da qualche cosa di noto e funzionante, quindi verifica di trasmissione tramite hyper terminal o altro apaprato simile.

Una volta che hai la certezza del funzionamentto della trasmisisone ti dedichi al ricevitore.

Prima cosa l'indirizzo è corretto?

Poi è meglio inviare un solo carattere per fare le prove. Trasmetti un carattere ed il visualizzatore deve visualizzarlo se non lo fa s'indaga sul perchè.

Share this post


Link to post
Share on other sites
sorecaro

Livio ho usato uno sniffer seriale, la stringa è giusta. Ora provo con il CRC come esempio da manuale

Share this post


Link to post
Share on other sites
sorecaro
void main() {

   trisb=0x00;
   portb=0x00;


  UART1_Init(9600);             //abilita uart
  Delay_ms(200);

  while (1) {

            UART1_Write(0x02);       //start
        UART1_Write(0x01);         //indirizzo 1
        UART1_Write(0x1F);      //no g. elettronico
        UART1_Write(0x03);      //no g. elettonico
        UART1_Write(0x18);      //tabella 7x5
         UART1_Write(0x1f);     //ingresso alto
         UART1_Write(0x05);     //ingresso alto
         UART1_Write(0X7F);     //carattere pieno
         UART1_Write(0X7F);     //carattere pieno
         UART1_Write(0X7F);     //carattere pieno
         UART1_Write(0X7F);     //carattere pieno
         UART1_Write(0X7F);     //carattere pieno
         UART1_Write(0X7F);     //carattere pieno
          UART1_Write(0X7F);     //carattere pieno
         UART1_Write(0X7F);     //carattere pieno
          UART1_Write(0X7F);     //carattere pieno
         UART1_Write(0X7F);     //carattere pieno
          UART1_Write(0X7F);     //carattere pieno
         UART1_Write(0x02);     //start
         UART1_Write(0xf7);     //crc
         UART1_Write(0x00);     //end

                         delay_ms(1000);

                            }
    }

Questo è il codice che sto provando ora per vedere se il display mi risponde, ma nulla.

Per controllare ho collegato l'oscilloscopio all'uscita del max232n ( pin 11 / pin 10), ma nessun segnale.

Il bello è che se controllo con uno sniffer la stringa che mando è giusta

71f1f743fb144ef04f70ce330e33d50d.png

Sempre con l'oscilloscopio ho controllato il segnale sia all'uscita del PIC (RC6), che all'ingresso del micro del display (IP2022/PQ80-120U), è OK

Edited by sorecaro

Share this post


Link to post
Share on other sites
Livio Orsini

Se dal pic la stringa è corretta secondo il tuo sniffer (però è sempre meglio verificare con hyperterminal), non c'è remissione. O conosci esattamente il protocollo oppure puoi andare solo per tentativi.

Se tu pubblicassi esattamente marca e modello del tuo visualizzatore, magari qaulche utente lo conosce e potrebbe aiutarti.

Share this post


Link to post
Share on other sites
sorecaro

Buongiorno. Ho provato anche con hyperterminal, la stringa è ok. Il protocollo di comunicazione l'ho già postato, post 5.

Share this post


Link to post
Share on other sites
pomat

Aaaah, l'advanced serial port monitor, una vecchia conoscenza! ;)

Magari non è questo il problema, ma se l'ultimo programma che hai postato è esattamente quello che stai usando, il CRC è sbagliato, f7 è il crc corretto per l'esempio del manuale, cioè calcolato sulla sequenza

02 01 1f 03 18 1f 05 31 32 33 34 35 41 42 43 44 45 46 02

invece tu devi calcolarlo sulla sequenza

02 01 1f 03 18 1f 05 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 02

e risulta d8.

Share this post


Link to post
Share on other sites
walterword

infatti ho scritto sopra , hai fatto il calcolo del CRC , solo che non lo ha preso nessuno in considerazione

Poi chiedono aiuto .S eil dispositivo che riceve vuole il CRC lo devi dare

Edited by walterword

Share this post


Link to post
Share on other sites
pomat

@walterword ...e glielo devi dare corretto! ^_^

Poi, il manuale dice tra l'altro che il crc "è attivato solo su richiesta del cliente"... Cos'avrà voluto dire? :blink: mai sentita una cosa del genere

Share this post


Link to post
Share on other sites
sorecaro

Poi, il manuale dice tra l'altro che il crc "è attivato solo su richiesta del cliente"... Cos'avrà voluto dire? :blink: mai sentita una cosa del genere

E' quello che c'è scritto. Tutto il materiale che ho è stato postato, ma non da segni di vita :wallbash::wallbash:

Share this post


Link to post
Share on other sites
sorecaro

infatti ho scritto sopra , hai fatto il calcolo del CRC , solo che non lo ha preso nessuno in considerazione

Poi chiedono aiuto .S eil dispositivo che riceve vuole il CRC lo devi dare

Walterworl fino ad ora non ho preso in considerazione il CRC solo perchè nel manuale ci sono esempi di stringa senza il CRC.

Quando hai consigliato di calcolarlo l'ho fatto, e chiedo aiuto perchè non sono un esperto.

Anche con l'esempio del manuale il display non accende nessun led

 UART1_Init(9600);             //abilita uart
  Delay_ms(200);

  while (1) {



          Delay_ms(500);
       UART1_Write(0x02);       //start
        UART1_Write(0x01);       //indirizzo 1
        UART1_Write(0x1F);      //no g. elettronico
        UART1_Write(0x04);      //no g. elettonico
        UART1_Write(0x18);      //tabella 7x5
         UART1_Write(0x1f);     // ingresso alto
         UART1_Write(0x05);     // ingresso alto
         UART1_Write(0X31);     //1
         UART1_Write(0X32);     //2
         UART1_Write(0X33);     //3
         UART1_Write(0X34);     //4
         UART1_Write(0X35);     //5
         UART1_Write(0X41);     //A
          UART1_Write(0X42);     //B
         UART1_Write(0X43);     //C
          UART1_Write(0X44);     //D
         UART1_Write(0X45);     //E
          UART1_Write(0X46);     //F
         UART1_Write(0x02);     //START
         UART1_Write(0xF7);     //CRC
         UART1_Write(0x00);     //END

 delay_ms(500);

                            }
    }

Share this post


Link to post
Share on other sites
pomat

Ciao, continui ad usare incondizionatamente F7 come crc, nonostante tu stia cambiando dei byte rispetto all'esempio del manuale. Ad esempio, nel programma dell'ultimo tuo post hai messo il codice per disattivare il giornale elettronico (04), mentre nell'esempio c'era il codice per attivarlo (03). Quindi nell'ultimo tuo post il crc doveva essere F8, non F7.

Pare che tu non abbia letto con attenzione il mio e finora non hai postato nessun programma con crc corretto. A questo punto come possiamo fidarci che tu abbia azzeccato almeno una volta il crc? È necessario per poter escludere definitivamente problemi nei messaggi inviati.

Share this post


Link to post
Share on other sites
sorecaro

Pomat hai ragione e vi chiedo scusa, la fretta è una brutta bestia. Prima di ripostare il codice controllerò bene il CRC. Scusate ancora

Share this post


Link to post
Share on other sites
sorecaro

Buonasera, oggi ho fatto una prova mandando la stringa direttamente con il pc usando il software DOKLIGHT. La stringa che ho mandato è quella dell'esempio del manuale.

0x02 0x01 0x1F 0x03 0x18 0x1F 0x05 "12345ABCDEF" 0x02 0xF7 0x00. Ho controllato anche il segnale che arriva al micro del display, è ok. (controllato con oscilloscopio).
Display sempre spento, non capisco dove sto sbagliando.
Ho controllato e ricontrollato i cablaggi, alimentazioni, stringhe, CRC, ma nulla

Share this post


Link to post
Share on other sites
Livio Orsini
Display sempre spento, non capisco dove sto sbagliando.

A questo punto il sospetto che il display abbia dei problemi diventa reale.

Share this post


Link to post
Share on other sites
sorecaro

Livio comincio a pensarlo anche io. Comunque continuerò a fare delle prove per averne la certezza

Share this post


Link to post
Share on other sites
Livio Orsini

Sempre per non sovrapporre problema a problema usa un Hyperterminal su PC, o altro programma di cui sei assolutamente sicuro, e trasmetti alcune stringhe, le più semplici possibili.

Share this post


Link to post
Share on other sites
accacca

Nelle info che hai pubblicato non ho tovato riferimenti a parametri di inizializzazione del display ecc..

Quindi presumo che il compito sia delegato al micro che c'è sul display con il quale comunichi in seriale.

Se l'inizializzazione la fa il micro lato display quando lo alimenti devi vedere qualcosa.

Purtroppo non sappiamo cosa sia:

sui moduli a carattere con un trimmer puoi regolare il contrasto e te ne accorgi se il display è acceso

anche sui moduli grafici lo schermo rimmarra "nero" ma c'è qualche piccoal variazione in fase id accensiione

se hanno una retroilluminazione probabilmente quando lo alimenti si accende anche quella.

Io prima di impazzire sulla seriale verificherei "in qualche modo" se il display funziona

Non ci sono pin in output di nessun tipo ? QUali altri pin ha il display oltre alla seriale?

Se tu mettessi qualche foto ci aiuteresti a chiarire Guarda se ci sono sigle o un logo tutto quello che può essere utile

Edited by accacca

Share this post


Link to post
Share on other sites
pomat

Se tu mettessi qualche foto ci aiuteresti a chiarire Guarda se ci sono sigle o un logo tutto quello che può essere utile

Sottoscrivo in pieno!

Guarda anche eventuali jumper che magari settano la modalità di funzionamento

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...