Pagina 1 di 2

PIC18f4550 e modulo bluetooth HC-05

MessaggioInviato: 16 ott 2015, 18:02
da Nick01
Ciao a tutti sto lavorando con un PIC18F4550, un piccolo modulino bluetooth HC-05 e il mio cellulare android (ho scaricato l'applicazione bluetooth terminal). Come prima cosa vorrei riuscire ad accendere un led se il PIC riceve il carattere '1' e spegnerlo se riceve il carattere '0'. Mi sono munito di tanta pazienza e ho cercato in tutti i modi di farlo funzionare però non ci sono riuscito. Inizialmente ho cercato di capire se il problema stava nel modulino, che magari era rotto, però dopo una prova con arduino ho capito che il problema sta nel mio codice (uso MPLAB X e come compilatore XC8)infatti il PIC non riceve nessun carattere.
Questo è il codice che ho provato ad utilizzare:
Codice: Seleziona tutto
/*
* File:   main.c
* Author: Utente
*
*/

#include <xc.h>
#include <plib/usart.h>
#include <plib/xlcd.h>
#define _XTAL_FREQ 8000000
//Frequenza del quarzo o del oscillatore interno
#pragma config FOSC = INTOSC_HS && WDT = OFF && PBADEN = OFF && MCLRE = OFF && STVREN = OFF && LVP = OFF
//Oscillatore interno HS


void configurazioni(void){
    OSCCON = 0b01110110;
    // Imposto il quarzo interno a 8MHz
    ADCON1 = 0b00001111;
    //Imposto tutti i pin come digitali
    TRISBbits.TRISB7 = 0;
    //Pin di verifica ricezione
    TRISAbits.TRISA0 = 0;
    //Pin di output
    TRISCbits.TRISC6 = 0;
    //Imposto il pin Rx come output
    TRISCbits.TRISC7 = 1;
    //Imposto il pin Tx come input
    OpenUSART(USART_TX_INT_OFF & USART_RX_INT_OFF & USART_ASYNCH_MODE & USART_EIGHT_BIT & USART_CONT_RX & USART_BRGH_HIGH & USART_ADDEN_OFF, 51);
    //Imposto la USART
}

void main(void) {
     configurazioni();
     //Impostazioni USART
     char data;
     while(1){
        PORTBbits.RB7 = 1;
        //Accendo il led per il test
        while(DataRdyUSART());
        //Aspetto di ricevere un dato
        PORTBbits.RB7 = 0;
        //Indica che ho ricevuto un dato
        data = ReadUSART();
        //Leggo il dato e lo memorizzo nella variabile data
        if(data == '1'){
            PORTAbits.RA0 = 1;
            WriteUSART("Acceso");
        }
        if(data == '0'){
            PORTAbits.RA0 = 0;
            WriteUSART("Spento");
        }
     }
}

Collegamenti:
Pin Rx del modulo al pin Tx del PIC
Pin Tx del modulo al pin Rx del PIC
Alimentazione del modulo 5V, perché non uso il modulo SMD ma quello con 6 pin

Modulo HC-05: configurato come slave, 9600 baud, 1 bit di stop e nessun bit di parità.
Se qualcuno di voi saprebbe come aiutarmi gliene sarei grato, perché non so più dove sbattere la testa per capire come farlo funzionare. Grazie

Re: PIC18f4550 e modulo bluetooth HC-05

MessaggioInviato: 17 ott 2015, 9:28
da grandegiove
Ciao Foto UtenteNick01,

Hai uno strumento per monitorare il traffico sulla linea UART?

Re: PIC18f4550 e modulo bluetooth HC-05

MessaggioInviato: 17 ott 2015, 10:17
da Nick01
Innanzitutto ti ringrazio per avermi risposto, scusa la mia ignoranza ma cosa intendi per monitorare il traffico sulla uart?
Al massimo posso utilizzare un oscilloscopio

Re: PIC18f4550 e modulo bluetooth HC-05

MessaggioInviato: 17 ott 2015, 11:09
da WALTERmwp
Ciao Foto UtenteNick01,
Nick01 ha scritto:(...) cosa intendi per monitorare il traffico sulla uart? (...)
Foto Utentegrandegiove si riferisce verosimilmente a un analizzatore seriale.
E' utile per fare una analisi dei segnali, in tal caso sulle linee TX e RX e quindi in entrambi i versi, che vengono scambiati tra i due device.

Aggiungo, sarebbe utile tu riportassi lo schema (usando FidoCadJ) che raffigura, almeno, la sezione di interfaccia tra il micro e il modulo radio oltre a evidenziare le connessioni della/delle alimentazioni, grazie.

Magari lo hai già fatto ma, lasciando perdere lo scambio delle informazioni, verificherei se allo stato attuale piloti correttamente il led.

Poi ne riparliamo ...

Saluti

p.s.
non è una anomalia ma solitamente i commenti nello script, almeno in C, precedono la riga dell'istruzione alla quale fanno riferimento o magari sono posti a lato della stessa, per me è strano leggerli dopo.

Re: PIC18f4550 e modulo bluetooth HC-05

MessaggioInviato: 17 ott 2015, 18:10
da Nick01
Foto UtenteWALTERmwp ti ringrazio per avermi risposto ecco lo schema:


Il modulo ha 6 pin: WAKEUP per mandarlo in AT mode e configurarlo, e il pin state che normalmente non viene collegato

Re: PIC18f4550 e modulo bluetooth HC-05

MessaggioInviato: 17 ott 2015, 20:17
da WALTERmwp
Tra i parametri della OpenUSART(...) c'è anche la sua abilitazione (intesa come periferica) ?
Il led, acceso all'inizio, ti si spegne ?
Lo "zero" di riferimento del PIC è collegato a quello del modulino ?
Misura il livello di tensione presente sui TX e RX, in assenza di trasmissione, quanto rilevi ?
Altro ... a dopo ...

Saluti

Re: PIC18f4550 e modulo bluetooth HC-05

MessaggioInviato: 18 ott 2015, 9:56
da Nick01
Nella funzione OpenUSART() la periferica, hai ragione, non è abilitata. Il led che dovrebbe verrificare l'avvenuta ricezione non si spegne, quindi il PIC non riceve niente. Il "flag" che la funzione DataRdyUSART() normalmente 0, non passa mai a 1 (0=nessun dato ricevuto; 1=dato ricevuto).
Il modulino inizialmente lo avevo collegato a un alimentatore a 5v e il PIC lo alimentavo dal pickit3, poi li ho utilizzato lo stesso alimentatore.
Utilizzando lo stesso alimentatore tra i pin Tx e GND nel modulino mi ritrovo 3,3v mentre tra Rx e GND 4,8v, nel PIC ho la stessa tensione 3,3v tra Rx e GND e 4,8v tra Tx e GND.

Re: PIC18f4550 e modulo bluetooth HC-05

MessaggioInviato: 18 ott 2015, 10:09
da Nick01
Ho risolto ora funziona! :ok:
Mi sono limitato a togliere questo pezzo di codice:
Codice: Seleziona tutto
PORTBbits.RB7 = 1;
        //Accendo il led per il test
        while(DataRdyUSART());
        //Aspetto di ricevere un dato
        PORTBbits.RB7 = 0;
        //Indica che ho ricevuto un dato

e ad aggiungere un piccolo ritardo alla fine del while infinito.
Grazie per l'aiuto :D

Re: PIC18f4550 e modulo bluetooth HC-05

MessaggioInviato: 18 ott 2015, 10:39
da WALTERmwp
Ottimo, meglio così.
Però, forse, la soluzione non sta nella rimozione di quelle righe.
Non avevo controllato nel "Mplab C18 C Compiler Libraries" ma andando a vedere, per la funzione "DataRdyUSART()" si legge che restituisce 1 se il dato è disponibile quindi il test lo dovresti invertire, così:
Codice: Seleziona tutto
while(!DataRdyUSART());
Puoi provare ?
Tra l'altro, prima di iniziare il controllo in ricezione, sarebbe meglio "pulire" il buffer di ricezione.

Saluti

Re: PIC18f4550 e modulo bluetooth HC-05

MessaggioInviato: 18 ott 2015, 11:11
da Nick01
Foto UtenteWALTERmwp ho provato ora e funziona, hai ragione mi ero dimenticato di negare DataRdyUSART()