project76 Inserito: 11 gennaio Segnala Share Inserito: 11 gennaio Salve, premetto il pic di riferimento essere PIC16f18857, già funzionante, il problema è l' USART o la Trasmissione perchè riceve bene con l'interrupt alla org 0x0004 va nella nella routine svuoto rc1reg salvo il contenuto in una variabile e poi per resettare il flag rcif lo svuoto altre 2 volte, retfie e si chiude mentre da mainloop poi li leggo il dato arrivato correttamente. Il collegamento è tramite porta seriale pc (terminal: monitor seriale di arduino) grazie ad un adattatore ttl, lo stesso che si usa anche per l'esp-01 per intenderci che si trova a qualche euro su amazon ho connessa la massa tra interfaccia e pic poi sull'ingresso interfaccia ove andava connesso il TX dell'esp01 ho messo invece il TX del pic mentre viceversa dove andava RX ho messo l' RX del pic infatti dal monitor seriale arduino scrivendo la lettera "a" la legge il pic il problema è che non fa il contrario trasmettendo dal pic non stampa mai nulla sul monitor seriale, che ho cambiato anche con un altro monitor seriale scaricato dal web, ho anche provato a connettere la Tx direttamente sull' RX del pic stesso ma nulla pare arriva qualcosa nell' interrupt ma non è lo stesso dato. Prima di postare il codice devo dire di avere provato di tutto di più senza interrupt di TX, con interrupt, leggendo il flag trmt, il flag txif, tutto vano l'interrupt si attiva dopo che nel mainloop viene inviato un carattere ma dall'altra parte pare non arrivare mai nulla! L'enable Txen ho provato ad attivarlo dall'inizio e anche come ora non lasciarlo acceso ma abilitarlo solo quando trasmettere disabilitando anche l'interrupt di ricezione e poi alla fine riabilitandolo ma non cambia nulla! LIST P=PIC16F18857 #include "p16f18857.inc" __config _CONFIG1, _RSTOSC_HFINT32 & _FEXTOSC_OFF & _CLKOUTEN_OFF & _CSWEN_OFF & _FCMEN_OFF __config _CONFIG2, _MCLRE_OFF & _PWRTE_ON & _LPBOREN_OFF & _BOREN_ON & _BORV_HI & _ZCD_OFF & _PPS1WAY_OFF & _STVREN_ON & _DEBUG_OFF __config _CONFIG3, _WDTE_OFF __config _CONFIG4, _WRT_OFF & _LVP_OFF __config _CONFIG5, _CP_OFF & _CPD_OFF __IDLOCS 0x1234 CONSTANT CLOCK = 32000000 CBLOCK 0X20 CONTA CONTA1 CONTA2 CONTA3 etc. etc. endc AVVIO7 ;********************************************************************** ; Interrupt handler: Tx, uart ;********************************************************************** PAGESEL BEEPZ3 ;BEEP SONORO BREVE DI AVVISO INTERRUPT CALL BEEPZ3 BANKSEL TX1STA ;ESSENDO APPENA INVIATO DATO SPENGO MODULO TX BCF TX1STA,TXEN BANKSEL PIE3 ;RIAVVIO INTERRUPT RX BSF PIE3,RCIE RETFIE ;********************************************************************** AVVIO BANKSEL TRISC MOVLW B'11000000' ;RX RC7, TX RC6 MOVWF TRISC BANKSEL ANSELC MOVLW B'00000000' MOVWF ANSELC BANKSEL TX1STA BCF TX1STA, TXEN ;SPENTO TX INIZIALMENTE BCF TXSTA, SYNC_TX1STA ;MODALITA' ASINCRONA BSF TX1STA, BRGH ;ALTA VELOCITA' BANKSEL RC1STA BSF RC1STA,SPEN ;ABIL. MODULO USART RICEZIONE BSF RC1STA,CREN BANKSEL BAUD1CON BSF BAUD1CON,BRG16 ;********************************************************************************************** MOVLW D'51' ;51, totale: 306 per avere: 9600 BAUD UART; fosc 11,788MHz MOVWF SP1BRGL MOVLW D'1' ;255, 9600 BAUD UART MOVWF SP1BRGH BANKSEL PIE3 BSF PIE3,TXIE ;ABIL. trasm. SERIALE INTERRUPT BSF PIE3,RCIE BANKSEL LATA CLRF LATA BANKSEL LATB CLRF LATB BANKSEL LATC CLRF LATC BANKSEL PORTA CLRF PORTA BANKSEL PORTB CLRF PORTB BANKSEL PORTC CLRF PORTC PAGESEL DELAY ;DO UN 20 SECONDI ALL'ACCENSIONE DI ASSESTAMENTO PIC CALL DELAY PAGESEL DELAY CALL DELAY PAGESEL DELAY CALL DELAY PAGESEL DELAY CALL DELAY PAGESEL DELAY CALL DELAY PAGESEL DELAY CALL DELAY PAGESEL DELAY CALL DELAY PAGESEL DELAY CALL DELAY BANKSEL INTCON BSF INTCON, 7 LOOP_GP09 NOP nop nop nop PAGESEL DELAY ;PAUSA ASSESTAMNETO CIRCA 1,5 S CALL DELAY BANKSEL PIE3 ;SPENGO INTERRUPT RX ACCENDO MODULO TX BCF PIE3,RCIE BANKSEL TX1STA BSF TX1STA,TXEN NOP NOP PAGESEL DELAY CALL DELAY BANKSEL TX1REG MOVLW "a" MOVWF TX1REG NOP NOP PAGESEL DELAY CALL DELAY ;BANKSEL TX1STA ;BCF TX1STA,TXEN BANKSEL PIE3 ;RIACCENDO INTERRUPT RX E SPENGO MODULO TX BCF PIE3,RCIE PAGESEL LOOP_GP09 GOTO LOOP_GP09 END Anche se si può fare in vari modi attendendo che sia impostato il flag TXIF prima di inviare di nuovo, come provato o con interrupt acceso/spento e non funziona, il primo byte dovrebbe inviarlo comunque, ho provato ad inviare fino a 3 byte di seguito nulla arriva mai dall' altra parte, pur attivandosi però l'interrupt di TX che infatti mi da un beep ogni 1,5 secondi di continuo. Invece riguardo l'hd ho provato che 'è continuità nei collegamenti con resistenze di limitazione della corrente da 4,7 kohm sulle 2 linee e le tensioni misurate sono 5,06 volt lato pic rx e 4,72 volt tx lato pic, a riposo. Qualcuno ha un'idea di cosa potrebbe non andare?? grazie. Link al commento Condividi su altri siti More sharing options...
Livio Orsini Inserita: 11 gennaio Segnala Share Inserita: 11 gennaio Domanda banale, come hai impostatp la trasmissione? bit di start?, bit di stop? altro? Devi impostare la trasmissione come è impostata la ricezione sul terminla da PC. 1 ora fa, project76 ha scritto: Il collegamento è tramite porta seriale pc (terminal: monitor seriale di arduino) grazie ad un adattatore ttl, Ma tu ti colleghi con PC o con arduino? Io sinceramente non l'ho capito. Link al commento Condividi su altri siti More sharing options...
giacomo56 Inserita: 11 gennaio Segnala Share Inserita: 11 gennaio (modificato) La seriale è impostata per un clock di 11.788 MHz mentre il pic usa l'oscillatore interno a 32 MHz o sbaglio? Ciao Modificato: 11 gennaio da giacomo56 Link al commento Condividi su altri siti More sharing options...
Livio Orsini Inserita: 11 gennaio Segnala Share Inserita: 11 gennaio 3 minuti fa, giacomo56 ha scritto: La seriale è impostata per un clock di 11.788 MHz mentre il pic usa l'oscillatore interno a 32 MHz o sbaglio? Ma se l'hai impostata a 9600 baud! Link al commento Condividi su altri siti More sharing options...
giacomo56 Inserita: 11 gennaio Segnala Share Inserita: 11 gennaio 2 minuti fa, Livio Orsini ha scritto: Ma se l'hai impostata a 9600 baud! Intendo il clock del micro. Link al commento Condividi su altri siti More sharing options...
project76 Inserita: 11 gennaio Autore Segnala Share Inserita: 11 gennaio Ciao allora per chiarire utilizza il modulo interno intoscHs 32mhz poi c'è un divisore interno che lo porta impostato a 12 mhz comunque il baudrate penso sia certamente quello perchè riceve perfettamente funziona provato con valore nel registro brg basso da 38 a 74 per cui mi sono messo nel mezzo a 51. Premetto non sono pratico di comunicazioni Usart e invece quale sarebbe il bit start e stop da impostare?? (perchè il codice è tutto quello postato finora). Poi l' hd è dato da interfaccia USB / TTL a Pic e lato pc visualizzo con solo il sw arduino Tramite monitor seriale dello stesso ma ho notato una cosa strana l'uscita del tx pic staccato Dall'interfaccia è normalmente bassa e pare commutare alto quando invio un carattere e non dovrebbe essere il contrario? Cioè normalmente alta visto che l'ingresso rx dell' interfaccia è normalmente alta a 4,72 volt. Link al commento Condividi su altri siti More sharing options...
Livio Orsini Inserita: 11 gennaio Segnala Share Inserita: 11 gennaio Quindi tu, trame l'Ide di arduino ed il suo monitor testi il tuo PIC. Per prima cosa, lascia stare l'IDE di arduino ed usa un terminale virtuale come, ad esempio, Hiper terminal. Le trasmissioni seriali iniziano con un bit di start, 8 bit per il caratter ed uno due bit di stop. Se vai, come nella maggior parte dei casi con 10bits per carattere avrai un bit di start, 8bit di carattere ed un bit di stop. Inoltre visto che il PC non ha seriale bisogna usare un interfaccia USB - seriale TTL. Sono anni che ho smesso di usare PIC e, solitamente quando li usavo, la maggior parte del codice lo scrivevo in "C", quindi non più dimestichezza con l'ASm e non penso di andare a riprenderlo per analizzare il tuo codice. Visto che hai parlato di arduino, potresti usare un arduino conla seriale messa in parallelo a quella del PIC per fare sniffing sulla comunicazione. Link al commento Condividi su altri siti More sharing options...
giacomo56 Inserita: 11 gennaio Segnala Share Inserita: 11 gennaio Rx è collegato per default a RC7 mentre Tx deve essere collegata a RC6 da programma. Se è questo il problema bisogna caricare nel registro RC6PPS il valore 10H. Ciao. Link al commento Condividi su altri siti More sharing options...
project76 Inserita: 11 gennaio Autore Segnala Share Inserita: 11 gennaio Ciao non penso sia questo il problema li ho impostati rc6, rc7 tutti e due ingressi e li dovrebbe recepire tispettivamente in automatiico tx ed rx. Link al commento Condividi su altri siti More sharing options...
project76 Inserita: 11 gennaio Autore Segnala Share Inserita: 11 gennaio Penso di aver risolto il problema hd perchè l" uscita Tx pic era bassa mentre ingresso interfaccia pc alta normalmente quindi con un transistor ho invertito questa logica così che ora quando il Tx pic va alto provando a comunicare porta giu rx collegato difatti provando ora manulmente a portare a 5 volt con tocchi veloci simulando il Tx pic scrive dei caratteri casuali sul monitor. Ora si tratta di impostare la giusta logica. Link al commento Condividi su altri siti More sharing options...
giacomo56 Inserita: 13 gennaio Segnala Share Inserita: 13 gennaio RC6 al reset è collegato a CK. Se non imposti il registro RC6PPS la trasmissione non può funzionare. Ho provato la trasmissione seriale su un pic16f18855 che è simile al 57 e funziona, se non si imposta RC6PPS l'uscita rimane bassa. Per quanto riguarda lo stato idle dell'uscita TX per default è alto (si può invertire la polarità mettendo a 1 il bit SCKP del registro BAUD1CON). Ciao. Link al commento Condividi su altri siti More sharing options...
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