Vai al contenuto
PLC Forum


Pic E Stringa Rs232


sorecaro

Messaggi consigliati

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

Link al commento
Condividi su altri siti


  • Risposte 55
  • Created
  • Ultima risposta

Top Posters In This Topic

  • sorecaro

    30

  • Livio Orsini

    9

  • accacca

    7

  • pomat

    7

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.

Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

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

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

Modificato: da sorecaro
Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

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

Modificato: da sorecaro
Link al commento
Condividi su altri siti

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.

Link al commento
Condividi su altri siti

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.

Link al commento
Condividi su altri siti

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

Modificato: da walterword
Link al commento
Condividi su altri siti

@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

Link al commento
Condividi su altri siti

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:

Link al commento
Condividi su altri siti

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

                            }
    }
Link al commento
Condividi su altri siti

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.

Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

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

Display sempre spento, non capisco dove sto sbagliando.

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

Link al commento
Condividi su altri siti

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.

Link al commento
Condividi su altri siti

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

Modificato: da accacca
Link al commento
Condividi su altri siti

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

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