Vai al contenuto
PLC Forum


Mistero della trasmissione seriale su pic non funziona in nessuna maniera


project76

Messaggi consigliati

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


Livio Orsini

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

La seriale è impostata per un clock di 11.788 MHz mentre il pic usa l'oscillatore interno a 32 MHz o sbaglio?

Ciao

Modificato: da giacomo56
Link al commento
Condividi su altri siti

Livio Orsini
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

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

Livio Orsini

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

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

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

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

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

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