Toujours sur mon Bluetooth, j'avance petit à petit ....... . J'ai fini une version stable, mais très peu optimisée. détection de perte de com, plus recuperation automatique de celle ci quand on rentre dans le rayon etc ;...
Je souhaiterais pour cela améliorer ma compréhension dans divers point.
Pour ce faire j'ai besoin de voir exactement le dialogue entre mon module Bluetooth et mon PIC .
J'ai modifier mon programme tournant sur un PIC16F1847 pour tourner sur un PIC18F46K22 possédant deux UARTs !!!!
Le but étant de brancher sur la brcoheTX2 mon cable USB/UART . ainsi je pourrais voir ce qui ce trame et les cailloux dans ma chaussure
D’après mes premiers tests, ce n'est pas si simple vu l'architecture de mon programme "source" .
En effet la gestion du dialogue est tiré d'une source qui n'est pas de moi, et je vois mal comment je pourrais m'en servir .
Pour la partie TX1 à la limite j'ai juste à rajouter un TX2 a la suite avec les mêmes valeurs à envoyer . ( reloud mais ça devrait fonctionner).
Par contre pour la partie RX1 qui doit etre envoyer en TX2 je vois pas trop Auriez vous des pistes ?
Voici le programme avec mes quelques premières modifications ( les plus faciles) :
Code : Tout sélectionner
/*##################################################################################
- Version du "13-07-2016"
- MikroC version 6.6.3
- PIC 18F46K22 , FOSC INTERNE à 1MHZ PLL Disable
- Data-Shit du PIC : http://ww1.microchip.com/downloads/en/DeviceDoc/41412F.pdf
#################################################################################*/
#include "BT_Routines.h"
// Constantes pour analyser les réponses
const BT_CMD = 1;
const BT_AOK = 2;
const BT_CONN = 3;
const BT_END = 4;
//####################### DEFINE #########################
#define Led_rouge PORTB.B4
#define Led_verte PORTA.B0
#define status PORTB.B0
//####################### Déclaration des Variables #########################
char txt[255]={0};
char Convert[1]={0};
unsigned int Index_Buffer, tmp, DataReady, Flag_seconde, i, compteur=0 ;
unsigned int Var_Heure, Var_Minute, Var_Seconde, Lancement;
char CMD_mode, BT_state, response_rcvd, responseID, response = 0 ;
//########################### Interruption ##################################
void interrupt(){
if (TMR1IF_bit) // Interruption sur Timer1 toutes les 100 ms
{
TMR1IF_bit = 0; // RAZ du flag
TMR1H = 0x9E;
TMR1L = 0x58;
compteur++ ; // On signale que 100ms se sont écoulées
}
if (RC1IF_bit == 1) { // Interruption sur reception UART
tmp = UART1_Read(); // On enregistre notre byte
if (CMD_mode){ // Si CMD_mode est égale à 1, l'initialisation n'est pas encore terminée
// Tout ce qui arrive sur le buffer est une commande
switch (BT_state) {
case 0: {
response = 0; // Clear response
if (tmp == 'C') // We have 'C', it could be CMD<cr><lf> or CONN
BT_state = 1; // Expecting 'M' or 'N'
if (tmp == 'A') // We have 'A', it could be AOK<cr><lf>
BT_state = 11; // expecting 'O'
if (tmp == 'E') // We have 'E', it could be END<cr><lf>
BT_state = 31; // expecting 'N'
break; // ...
}
case 1: {
if (tmp == 'M')
BT_state = 2;
else if (tmp == 'O')
BT_state = 22;
else
BT_state = 0;
break;
}
case 2: {
if (tmp == 'D') {
response = BT_CMD; // CMD
BT_state = 40;
}
else
BT_state = 0;
break;
}
case 11: {
if (tmp == 'O')
BT_state = 12;
else
BT_state = 0;
break;
}
case 12: {
if (tmp == 'K'){
response = BT_AOK; // AOK
BT_state = 40;
}
else
BT_state = 0;
break;
}
case 22: {
if (tmp == 'N')
BT_state = 23;
else
BT_state = 0;
break;
}
case 23: {
if (tmp == 'N') {
response = BT_CONN; // SlaveCONNECTmikroE
response_rcvd = 1;
responseID = response;
}
BT_state = 0;
break;
}
case 31: {
if (tmp == 'N')
BT_state = 32;
else
BT_state = 0;
break;
}
case 32: {
if (tmp == 'D') {
response = BT_END; // END
BT_state = 40;
}
else
BT_state = 0;
break;
}
case 40: {
if (tmp == 13)
BT_state = 41;
else
BT_state = 0;
break;
}
case 41: {
if (tmp == 10){
response_rcvd = 1;
responseID = response;
}
BT_state = 0;
break;
}
default: {
BT_state = 0;
break;
}
}
}
else // Une fois l'initialisation finie on remplit notre buffer
{
if (tmp == 13) // Si on recoit un "CR" fin d'une chaine de caractere
{
txt[Index_Buffer] = 0; // Terminateur de string , on rajoute un 0 pour dire "Fin de la chaine"
DataReady = 1; // Une donnée à été recue et est prête , on léve le drapeau
}
else // Sin on a pas recu de "CR"
{
txt[Index_Buffer] = tmp; // On place la donnée recue dans le tableau txt[] à l'endroit de l'index
Index_Buffer++; // Incremente l'index du tableau pour placer la lettre suivante
}
}
RCIF_bit = 0; // Ré-arme le flag
}
}
// -----------------------------------------------------------------------------
char BT_Get_Response() { // renvoie l'identifiant de la réponse
if (response_rcvd) {
response_rcvd = 0;
return responseID;
}
else
return 0;
}
//##############################################################################
//##################### PROGRAMME PRINCIPAL ############################
//##############################################################################
void main() {
// Configuration des PORTs
ANSELA = 0; // PORT en numérique
ANSELB = 0; // PORT en numérique
ANSELC = 0; // PORT en numérique
ANSELD = 0; // PORT en numérique
ANSELE = 0;
TRISA = 0; // En sortie
TRISB = 0;
TRISC = 0b10000000; // RC7 En entrée pour reception UART 1
TRISD = 0b10000000; // RD7 En entrée pour reception UART 2
TRISE = 0;
//--------------------------------------------------------------------
UART1_init(9600); // Initialise l'UART1 à 9600 Bauds
delay_ms(100);
UART2_init(9600);
delay_ms(100);
// Initialisation des variables
CMD_mode = 1;
BT_state = 0;
response_rcvd = 0;
responseID = 0;
response = 0;
tmp = 0;
DataReady = 0; // RAZ du flag
Index_Buffer = 0; // RAZ dde l'index
Flag_seconde = 0; // RAZ du flag seconde
Lancement = 0; // RAZ du flag Lancement
//------------- Interruption sur reception UART ------------------------
PIR1.RC1IF = 0; // RAZ Drapeau d'interrutpion
PIE1.RC1IE = 1; // Autorise l'INT sur reception Rx de l'UART
RC2IF_bit = 0;
RC2IE_bit = 1;
//------------- reglages timer1 et INT TIMER 1 ------------------------
T1CON = 0x01;
TMR1H = 0x9E;
TMR1L = 0x58;
TMR1IF_bit = 0;
TMR1IE_bit = 1 ;
INTCON = 0xC0; // Configuration de l'INT GIE et Peripherique
//------------- Configure le module BlueTooth-Click
BT_Configure(); // Envoi la configuration au BT au démarrage via le fichier BT_Routines.h
//------------- Attente de connexion
while (BT_Get_Response() != BT_CONN); // Tant que le BT n'est pas connecté on reste ici
CMD_mode = 0; // On arrete le mode de commande car le BT est configuré et Connecté
//------- Indication de connexion
for (i=0;i<3;i++){
Led_verte = 1;
delay_ms(100);
Led_verte = 0;
delay_ms(100);
}
//###################################################################################
while (1) {
if (DataReady) // Si une donnée est recue
{
GIE_bit = 0; // Interdit les Interutpions le temps du traitement
DataReady = 0; // Réarme le flag
Index_Buffer = 0; // Raz l'index du buffer
//--------------- Reception des valeurs du chrono ---------------------------
if ( txt[0] == 'c' & txt[1] == 'h') // on verifie le mot de commande "ch" correspondant à chrono
{
Var_Heure = txt[3]; // On enregistre les valeurs du chrono recues dans les variables
Var_Minute = txt[5];
Var_Seconde = txt[7];
Lancement = 1; // On met le flag à 1 pour signaler le Lancement du chrono
}
//--------------- Reception de l'arret du chrono ---------------------------
else if ( txt[0] == 's' & txt[1] == 't') // on verifie le mot de commande "st" correspondant à stop
{
Lancement = 0; // On met le flag à 0 pour signaler l'arret du chrono
Var_Heure = Var_Minute = Var_Seconde = 0;
Led_rouge = 0;
}
GIE_bit = 1; // On ré-active les INT
}
//----------------------------------------------------------------------------------
if ( compteur >= 10) // Toute les secondes ont envoie les infos pour tenir le fil de vie
{
compteur = 0; // RAZ le compteur de seconde
if ( Lancement == 1 ) // Si le Lancement à été effetué
{ // On effectue le décompte des secondes et on envoie les valeurs par BT
Var_Seconde--; // On décremente une seconde
Led_rouge = !Led_rouge ;
if (Var_Seconde > 59 ) // Quand la seconde passe de 0 à 255
{
Var_Seconde = 59;
Var_Minute--; // On décremente une minute
if (Var_Minute> 59 )
{
Var_Minute = 59;
Var_Heure--;
if (Var_Heure > 59 ) // Si le Compte à rebours arrive à zéro
{
Lancement = 0; // On arrete le chrono
Led_rouge = 0;
Var_Heure = Var_Minute = Var_Seconde = 0; // On RAZ les valeurs
delay_ms(2000);
}
}
}
}
if (status)
{
UART1_Write_text("#"); // Mot de reconnaisance pour la tablette
UART1_Write(Lancement); // On indique que le chrono tourne ou non
UART1_Write(Var_Heure);
UART1_Write(Var_Minute);
UART1_Write(Var_Seconde);
UART2_Write_text("#"); // Mot de reconnaisance pour la tablette
IntToStr(Lancement, convert);
UART2_Write_text(Convert); // On indique que le chrono tourne ou non
IntToStr(Var_Heure, convert);
UART2_Write_text(Convert);
IntToStr(Var_Minute, convert);
UART2_Write_text(Convert);
IntToStr(Var_Seconde, convert);
UART2_Write_text(Convert);
UART2_Write(13);
UART2_Write(10);
}
}
}
}Et le Header :
Code : Tout sélectionner
// Configure le module BlueTooth-Click
// Vous trouverez les configurations du module à cette adresse
// http://ww1.microchip.com/downloads/en/DeviceDoc/bluetooth_cr_UG-v1.0r.pdf
// réponses à analyser et attendues
extern const BT_CMD;
extern const BT_AOK;
extern const BT_CONN;
extern const BT_END;
extern char BT_Get_Response();
//----------------------- CONFIGURATION DU MODULE ------------------------------
void BT_Configure() {
do {
UART1_Write_Text("$$$"); // On rentre dans la configuration
Delay_ms(100);
} while (BT_Get_Response() != BT_CMD); // On reste ICI tant qu'on à pas la réponse du module BT
do {
UART1_Write_Text("SN,EasyPic_18F"); // Selection du Nom de notre module qui apparaitra lors de la recherche 20 caractéres max
UART1_Write(13);
UART1_Write(10);
Delay_ms(100);
} while (BT_Get_Response() != BT_AOK); // On reste ICI tant qu'on à pas la réponse du module BT
do {
UART1_Write_Text("SO,Master"); // Extended status string , pas compris !
UART1_Write(13);
UART1_Write(10);
Delay_ms(100);
} while (BT_Get_Response() != BT_AOK); // On reste ICI tant qu'on à pas la réponse du module BT
do {
UART1_Write_Text("SM,1"); // selection du mode (0 = esclave, 1 = master, 2 = trigger, 3 = auto-connect, 4 = DTR, 5 = ANY)
UART1_Write(13);
UART1_Write(10);
Delay_ms(100);
} while (BT_Get_Response() != BT_AOK); // On reste ICI tant qu'on à pas la réponse du module BT
do {
UART1_Write_Text("SJ,00A0"); // Le module est "Connectable" pendant 100ms
UART1_Write(13);
UART1_Write(10);
Delay_ms(100);
} while (BT_Get_Response() != BT_AOK); // On reste ICI tant qu'on à pas la réponse du module BT
do {
UART1_Write_Text("SI,0000"); // Le module est non "decouvrable"
UART1_Write(13);
UART1_Write(10);
Delay_ms(100);
} while (BT_Get_Response() != BT_AOK); // On reste ICI tant qu'on à pas la réponse du module BT
do {
UART1_Write_Text("S|,0303"); // mode "OFF" pendant 3 secondes, mode "ON" pendant 3 secondes
UART1_Write(13);
UART1_Write(10);
Delay_ms(100);
} while (BT_Get_Response() != BT_AOK); // On reste ICI tant qu'on à pas la réponse du module BT
do {
UART1_Write_Text("SW,0000"); // Désactivation du mode Low-Power sniff mode
UART1_Write(13);
UART1_Write(10);
Delay_ms(100);
} while (BT_Get_Response() != BT_AOK); // On reste ICI tant qu'on à pas la réponse du module BT
do {
UART1_Write_Text("SA,0"); // Selection Authentication (0 désactivé , 1 activé) il me semble que ca concerne que l'appairage
UART1_Write(13);
UART1_Write(10);
Delay_ms(100);
} while (BT_Get_Response() != BT_AOK); // On reste ICI tant qu'on à pas la réponse du module BT
do {
UART1_Write_Text("SP,1"); // Code de sécurité ( SP =Security Pin), à l'origine "SP,1234"
UART1_Write(13);
UART1_Write(10);
Delay_ms(100);
} while (BT_Get_Response() != BT_AOK); // On reste ICI tant qu'on à pas la réponse du module BT
do {
UART1_Write_Text("---"); // Indique la fin ! On sort du mode de commande
UART1_Write(13);
UART1_Write(10);
Delay_ms(100);
} while (BT_Get_Response() != BT_END); // On reste ICI tant qu'on à pas la réponse du module BT
// ICI METTRE UNE VISUALISATION POUR VERIFIER QUE LA CONFIGURATION S'EST BIEN PASSEE
}Peut être existe-t-il une façon élégante d'obtenir le résultat souhaité
Bonne journée
