sorecaro Inserito: 28 marzo 2015 Segnala Inserito: 28 marzo 2015 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???
Livio Orsini Inserita: 28 marzo 2015 Segnala Inserita: 28 marzo 2015 Se è così allora il problema sta nel misterioso display di cui nulla sappaimo.
sorecaro Inserita: 28 marzo 2015 Autore Segnala Inserita: 28 marzo 2015 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.
walterword Inserita: 28 marzo 2015 Segnala Inserita: 28 marzo 2015 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
sorecaro Inserita: 28 marzo 2015 Autore Segnala Inserita: 28 marzo 2015 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
walterword Inserita: 28 marzo 2015 Segnala Inserita: 28 marzo 2015 il CRC lo calcoli ? ....lo devi inviare perche il display poi farà un test
sorecaro Inserita: 28 marzo 2015 Autore Segnala Inserita: 28 marzo 2015 (modificato) 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: 28 marzo 2015 da sorecaro
Livio Orsini Inserita: 28 marzo 2015 Segnala Inserita: 28 marzo 2015 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è.
sorecaro Inserita: 28 marzo 2015 Autore Segnala Inserita: 28 marzo 2015 Livio ho usato uno sniffer seriale, la stringa è giusta. Ora provo con il CRC come esempio da manuale
sorecaro Inserita: 28 marzo 2015 Autore Segnala Inserita: 28 marzo 2015 (modificato) 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 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: 28 marzo 2015 da sorecaro
Livio Orsini Inserita: 29 marzo 2015 Segnala Inserita: 29 marzo 2015 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.
sorecaro Inserita: 29 marzo 2015 Autore Segnala Inserita: 29 marzo 2015 Buongiorno. Ho provato anche con hyperterminal, la stringa è ok. Il protocollo di comunicazione l'ho già postato, post 5.
pomat Inserita: 29 marzo 2015 Segnala Inserita: 29 marzo 2015 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.
walterword Inserita: 29 marzo 2015 Segnala Inserita: 29 marzo 2015 (modificato) 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: 29 marzo 2015 da walterword
pomat Inserita: 29 marzo 2015 Segnala Inserita: 29 marzo 2015 @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? mai sentita una cosa del genere
sorecaro Inserita: 29 marzo 2015 Autore Segnala Inserita: 29 marzo 2015 Poi, il manuale dice tra l'altro che il crc "è attivato solo su richiesta del cliente"... Cos'avrà voluto dire? mai sentita una cosa del genere E' quello che c'è scritto. Tutto il materiale che ho è stato postato, ma non da segni di vita
sorecaro Inserita: 29 marzo 2015 Autore Segnala Inserita: 29 marzo 2015 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); } }
pomat Inserita: 29 marzo 2015 Segnala Inserita: 29 marzo 2015 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.
sorecaro Inserita: 29 marzo 2015 Autore Segnala Inserita: 29 marzo 2015 Pomat hai ragione e vi chiedo scusa, la fretta è una brutta bestia. Prima di ripostare il codice controllerò bene il CRC. Scusate ancora
sorecaro Inserita: 30 marzo 2015 Autore Segnala Inserita: 30 marzo 2015 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
Livio Orsini Inserita: 31 marzo 2015 Segnala Inserita: 31 marzo 2015 Display sempre spento, non capisco dove sto sbagliando. A questo punto il sospetto che il display abbia dei problemi diventa reale.
sorecaro Inserita: 31 marzo 2015 Autore Segnala Inserita: 31 marzo 2015 Livio comincio a pensarlo anche io. Comunque continuerò a fare delle prove per averne la certezza
Livio Orsini Inserita: 31 marzo 2015 Segnala Inserita: 31 marzo 2015 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.
accacca Inserita: 31 marzo 2015 Segnala Inserita: 31 marzo 2015 (modificato) 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: 31 marzo 2015 da accacca
pomat Inserita: 31 marzo 2015 Segnala Inserita: 31 marzo 2015 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
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora