Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

USART pic16F1618

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] USART pic16F1618

Messaggioda Foto UtenteX206 » 8 gen 2023, 18:20

Salve,
sto cercando di inviare un carattere su un terminale in rs-232, al terminale arriva un segnale sempre diverso che non corrisponde a quello inviato, facendo il debug il programma si ferma nel momento in cui attende la ricezione dei dati aspettando che si setti RCIF, vi posto il programma, scusate se non faccio uso di funzioni

Codice: Seleziona tutto
#include <xc.h>

#define _XTAL_FREQ 8000000

#define on 1                   // LED acceso
#define off 0                  // LED spento
#define LEDerr  LATAbits.LATA2
#define LEDnok  LATAbits.LATA1
#define LEDok   LATAbits.LATA0
#define PBRES   LATAbits.LATA3 //pulsante

/***** MAIN PROGRAM *****/
void main(){
    ANSELA = 0;         //no analogiche
    ANSELB = 0;         //no analogiche
    ANSELC = 0;         //no analogiche
    TRISA=0b11111000;   //RA0 RA1 RA2 out led - RA3 pulsante
    LATA=0x00;
   
// setup INTOSC 8MHz
    OSCCONbits.IRCF = 0b1110;
    OSCSTATbits.HFIOFS=1;
    OSCTUNEbits.TUN=0b000000;
   
// WPU enable on RA3
    WPUA=0b00001000;
    INLVLB=0xFF;
   
// inizializzazione UART
    RB7PPS=0b00110;  //Uscita TX su RB7
    RXPPS = 0b01101;//input RX predefinito su RB5
    BAUD1CONbits.BRG16=1;// 16 bit
    TX1STAbits.BRGH=0;//baud rate low speed
    TX1STAbits.SYNC=0;//modo asincrono
    SP1BRGH=0;
    SP1BRGL=51;// baud rate 9600
    TX1STAbits.TXEN=1;//tx enable bit
    RC1STAbits.SPEN=1;//serial port enable
    RC1STAbits.CREN=1;//abilita ricezione   
   
    while(1){
        while(PBRES);                   // attendi pressione tasto
        unsigned char tx_byte = 'L' ;  // carattere da inviare
        while (! PIR1bits.TXIF){}     // se TXIF è libero
        TX1REG = tx_byte;             // invia byte
        while (! PIR1bits.TXIF){}     // attendi fine trasmissione
       
        while (! PIR1bits.RCIF){}     // attendi ricezione
        if(RC1REG == tx_byte){        // se il carattere è lo stesso
        PIR1bits.RCIF = 0;            //cancello il flag
       
        LEDok = on;              // accendi LED2
        LEDnok = off;
        }else{                   // altrimenti
        LEDok = off;
        LEDnok = on;             // accendi LED1
        }       
        while (! PBRES){}        // rilascio pulsante con debounce
        __delay_ms(30); 
    }
}
Avatar utente
Foto UtenteX206
0 2
 
Messaggi: 5
Iscritto il: 2 gen 2023, 21:49

0
voti

[2] Re: USART pic16F1618

Messaggioda Foto UtenteX206 » 9 gen 2023, 21:18

Nel frattempo ho provato ad usare l'MCC di mplabx ottenendo lo stesso risultato,
mi verrebbe da pensare che il problema possa venire dal cavo convertitore seriale usb-rs232
perché in rete ho letto che ad alcune persone ha dato problemi, comunque sto usando un
Ewent-ew1116
Avatar utente
Foto UtenteX206
0 2
 
Messaggi: 5
Iscritto il: 2 gen 2023, 21:49

0
voti

[3] Re: USART pic16F1618

Messaggioda Foto UtenteWALTERmwp » 9 gen 2023, 22:22

Sarebbe il caso di descrivere il setup specificando anche le connessioni elettriche.
Il codice evidentemente sotto il profilo sintattico è a posto se il compilatore non restituisce alcuna indicazione, i preset non li ho confrontati, ma ho un dubbio: potresti provare in questo modo?
Codice: Seleziona tutto
    . . .   
    while(1){
        while(PBRES);                   // attendi pressione tasto
        unsigned char tx_byte = 'L' ;  // carattere da inviare
        while (! PIR1bits.TXIF){ ; }     // se TXIF è libero
        TX1REG = tx_byte;             // invia byte
        while (! PIR1bits.TXIF){ ; }     // attendi fine trasmissione
       
        while (! PIR1bits.RCIF){ ; }     // attendi ricezione
        if(RC1REG == tx_byte){        // se il carattere è lo stesso
        PIR1bits.RCIF = 0;            //cancello il flag
       
        LEDok = on;              // accendi LED2
        LEDnok = off;
        }else{                   // altrimenti
        LEDok = off;
        LEDnok = on;             // accendi LED1
        }       
        while (! PBRES){ ; }        // rilascio pulsante con debounce
        __delay_ms(30);
    }
}
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
29,6k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 8795
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

0
voti

[4] Re: USART pic16F1618

Messaggioda Foto Utentestefanopc » 10 gen 2023, 10:21

Ma per curiosità lato micro usi un MAX232 o simili per convertire da TTL a seriale Rs232 ?
Ciao
600 Elettra
Avatar utente
Foto Utentestefanopc
11,7k 5 9 13
Master EY
Master EY
 
Messaggi: 4883
Iscritto il: 4 ago 2020, 9:11

0
voti

[5] Re: USART pic16F1618

Messaggioda Foto UtenteX206 » 10 gen 2023, 18:26

Salve,
grazie per le risposte, l'adattatore che uso ha il chip max232 di quelli cinesi usati molto in arduino, ho fatto l'ennesima prova usando anche un arduino uno ma niente stessa cosa così ieri sera ho ordinato sia un max232 che un cavo usb-232 nuovi, appena arrivano riprovo il tutto, inizialmente ero convinto fosse piu un problema di codice visto che sono alle prime armi, però se mi dite che dovrebbe essere a posto sono contento, ah ho provato anche il ";"nel codice suggeritomi ma niente
Avatar utente
Foto UtenteX206
0 2
 
Messaggi: 5
Iscritto il: 2 gen 2023, 21:49

0
voti

[6] Re: USART pic16F1618

Messaggioda Foto Utenteluxinterior » 10 gen 2023, 18:44

In questi casi io di solito faccio il contrario mando qualcosa dal PC al micro così capisco che connesisoni baudrate ecc. sono a posto.
Se hai un oscilloscopio potresti inviare in continuo il carattere U maiuscola dovresti vedere un'onda quadra con la frequenza del bit.
Se non hai l'oscilloscopio misura con un tester la tensione sui pin TX e RX nel tratto MAX232 PC dopo aver collegato tutto se vedi un atensione "stupida" positiva o verso zero volt verifica la connessione TX da un lato va in RX dall'altro e viceversa NON collegare TX TX e RX con RX
Se non hai combinato qualche guaio tu(nulla di cui vergognarsi io combino di quelle cose....) inutile incolpare l'hw e spendere soldi se il max è alimentato correttamente fa il suo dovere
Se proprio vuoi cortocircuita TX e RX del MAX così quello che scrivi ti torna indietro sul micro e lavori senza PC.
Avatar utente
Foto Utenteluxinterior
4.132 3 4 9
Master
Master
 
Messaggi: 2620
Iscritto il: 6 gen 2016, 17:48

0
voti

[7] Re: USART pic16F1618

Messaggioda Foto UtenteWALTERmwp » 10 gen 2023, 19:17

X206 ha scritto:(...) convinto fosse piu un problema di codice visto che sono alle prime armi, però se mi dite che dovrebbe essere a posto sono contento, ah ho provato anche il ";"nel codice suggeritomi ma niente
io ho affermato che se il compilatore non ti da errori o warning "significativi", a livello di sintassi è a posto: questo non significa faccia quel che ti aspetti; inoltre non ho controllato la configurazione.

Prima di provare altro hardware, come già suggerito, si dovrebbe stabilire qual è la situazione; se ci sono più incertezze occorre procedere per esclusione.
Documenta le connessioni, magari usando FidoCadJ.

Saluti

p.s.
riporta l'ultimo codice, esattamente come lo hai provato.
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
29,6k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 8795
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

0
voti

[8] Re: USART pic16F1618

Messaggioda Foto Utentestefanopc » 10 gen 2023, 19:43

Accertato che il Max 232 è presente si dovrebbero verificare se le tensioni di Mark e Space in TX sono corrette
- Mark (1 logico tra - 8 e - 15)
- Space (0 logico tra +8 e +15)
vedi link.
https://wwwdisc.chimica.unipd.it/luigin ... 232_1.html
Come ha scritto chi mi ha preceduto in ambito trasmissivo con segnali asincroni di questo genere è sempre molto utile in fase di ricerca guasto fare un loop tra Tx e Rx e vedere se quanto viene trasmesso ritorna indietro correttamente.

Quindi prima di cambiare tutto (meglio fare qualche prova) si connette pin 2 con pin 3 (DB9) e si verifica che alle diverse velocità (dalla più bassa alla più alta) se si trasmette un carattere lo stesso ritorna correttamente riconosciuto in ricezione .
Se torna insisti con qualche altra decina di caratteri verificando che sia tutto ok.
Si prova prima un lato e poi quello opposto e si dovrebbe capire dove risiede il problema.
Dopo di che ci si può spostare lato TTL a monte del MAX232 in questo modo verifichi che il convertitore TTL - Rs232 sia ok.
Naturalmente oltre alla velocità vanno gestiti e configurati in modo corretto anche gli altri parametri
Lunghezza in Bit 7 o 8
Parità None Even Odd
Stop Bit 1 o 2
Verificre anche che tutti i criteri di sincronizzazione (handshake) Hw siano disabilitati ( altrimenti collegare lato PC Rts-Cts e Dtr-Dsr e verificare che xon-xoff sia disabitato ) .
Per fare le prove si può utilizzare hyperterminal o altro sw simile.
Ciao
600 Elettra
Avatar utente
Foto Utentestefanopc
11,7k 5 9 13
Master EY
Master EY
 
Messaggi: 4883
Iscritto il: 4 ago 2020, 9:11

0
voti

[9] Re: USART pic16F1618

Messaggioda Foto UtenteX206 » 27 gen 2023, 12:14

Alla fine dopo averle provate tutte mi è arrivato il nuovo cavo usb-ttl e funziona tutto o quasi (probabilmente il vecchio cavo era già danneggiato all'acquisto avvenuto in una fiera dell'elettronica e acquistato usato per pochi centesimi :D ), mi spiego meglio,
se invio il dato, il terminale seriale riceve perfettamente ma per la risposta devo inviare io sempre da terminale il carattere e poi il PIC mi fa la verifica dei dati e accende di conseguenza il led giusto, ora vorrei sapere se è possibile che questo processo avvenga in automatico da solo?
Avatar utente
Foto UtenteX206
0 2
 
Messaggi: 5
Iscritto il: 2 gen 2023, 21:49

0
voti

[10] Re: USART pic16F1618

Messaggioda Foto UtenteWALTERmwp » 29 gen 2023, 14:15

Ma sei in grado di stabilire quale o quali interventi sono stati determinanti per farlo funzionare?
X206 ha scritto:(...) se invio il dato, il terminale seriale riceve perfettamente ma per la risposta devo inviare io sempre da terminale il carattere e poi il PIC mi fa la verifica dei dati e accende di conseguenza il led giusto, ora vorrei sapere se è possibile che questo processo avvenga in automatico da solo?
non mi è chiara la richiesta: vorresti che il terminale rispondesse automaticamente al PIC?

Saluti
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
29,6k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 8795
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

Prossimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 5 ospiti