Bonjour ,

Paul pour le lien explicatif, c'est celui qui explique le mieux je trouve ! J'ai presque tout compris

En respectant les indications de ton lien , j'ai fait un programme similaire mais avec une simulation de centrale, car je possède deux platines de tests équipés de PIC 16F1847 avec le module.
Le but finale est celui ci :
La centrale envoie toutes les 150 ms une "demande de vie" à un satellite . Il y en aura 8 maximum au total .
Donc chaque satellite recevra une demande toutes les 8*150 = 1.2secondes . Mais avant ça , il faudrait déjà que j'arrive à obtenir un comportement fiable avec 1 seul satellite !
Je simule donc la centrale avec une platine test, qui envoie une "demande de vie" toutes les 500ms, à 1 seul satellite ( le Numéro 1).
Ici je ne tiens pas encore compte de l'accusé de reception pour être le plus simple possible.
► Afficher le programme principale
Code : Tout sélectionner
char tmp, ACK_OK, NON_ACK_OK, RESET_OK, Commande_Mode_OK, Parametre_OK;
char Time_out, Valeur, ID_envoyeur, RSSI, Data;
char Groupe, F_demande, F_Ordre;
unsigned int i, Tempo10ms, Tempo100ms;
char F_Envoi;
void Conf_AMB8626();
void interrupt(){
if (TMR0IF_bit){
TMR0IF_bit = 0;
TMR0 = 6;
Time_out++;
if (Time_out >=30){
Time_out = 0;
TMR0IE_bit = 0; TMR0 = 0x06; Valeur = F_demande = 0;
}
}
if (TMR1IF_bit == 1) {
TMR1IF_bit = 0; TMR1H = 0xB1;
TMR1L = 0xE0;
Tempo10ms++;
if (Tempo10ms > 49){
Tempo10ms = 0;
F_Envoi = 1; }
}
if (RCIF_bit == 1){
tmp = UART_Read(); switch (Valeur){
case 0: if (tmp == 0x02){
Valeur = 1;
Time_out = 0; TMR0IE_bit = 1; }
else
Valeur = 0;
break;
case 1: if (tmp == 0x49) Valeur = 2;
else if (tmp == 0x81) Valeur = 10;
else if (tmp == 0x44) Valeur = 20;
else if (tmp == 0x40) Valeur = 30;
else if (tmp == 0x45) Valeur = 40;
else{
TMR0IE_bit = 0; Valeur = 0;
}
break;
case 2: if (tmp == 0x01) Valeur = 3;
else{
TMR0IE_bit = 0; Valeur = 0;
}
break;
case 3: if (tmp == 0x00) Valeur = 4;
else{
TMR0IE_bit = 0; Valeur = 0;
}
break;
case 4: if (tmp == 0x4A){ Parametre_OK = 1; }
TMR0IE_bit = 0; Valeur = 0;
break;
case 10: if (tmp == 3) Valeur = 11;
else if (tmp == 4) Valeur = 15;
else{
TMR0IE_bit = 0; Valeur = 0;
}
break;
case 11: if (tmp == 99){ ID_envoyeur = tmp ; Valeur = 12;
}
else{
TMR0IE_bit = 0; Valeur = 0;
}
break;
case 12: if ((tmp >= 0) && (tmp <= 8) ){ Data = tmp ; Valeur = 13;
}
else{
TMR0IE_bit = 0; Valeur = 0;
}
break;
case 13: if ((tmp >= 0) && (tmp <= 255) ){ RSSI = tmp; Valeur = 14;
}
else{
TMR0IE_bit = 0; Valeur = 0;
}
break;
case 14: if (tmp = (0xE3^Data^RSSI) ){ F_demande = 1; }
TMR0IE_bit = 0; Valeur = 0;
break;
case 15: if (tmp == 99) Valeur = 16;
else{
TMR0IE_bit = 0; Valeur = 0;
}
break;
case 16: if (tmp == 255) Valeur = 17;
else{
TMR0IE_bit = 0; Valeur = 0;
}
break;
case 17: if ( (tmp >= 0) && (tmp <= 255) ){ Groupe = tmp;
Valeur = 18;
}
else{
TMR0IE_bit = 0; Valeur = 0;
}
break;
case 18: RSSI = tmp;
Valeur = 19;
break;
case 19: if (tmp = (0x1B^Groupe^RSSI) ){ F_Ordre = 1; }
TMR0IE_bit = 0; Valeur = 0;
break;
case 20: if (tmp == 0x01){
Valeur = 21;
}
else{
TMR0IE_bit = 0; Valeur = 0;
}
break;
case 21: if (tmp == 0x10){ Valeur = 22;
}
else{
TMR0IE_bit = 0; Valeur = 0;
}
break;
case 22: if (tmp == 0x57){ Commande_Mode_OK = 1; }
TMR0IE_bit = 0; Valeur = 0;
break;
case 30: if (tmp == 0x01) Valeur = 31;
else{
TMR0IE_bit = 0; Valeur = 0;
}
break;
case 31: if (tmp == 0x00) Valeur = 32;
else if (tmp == 0x01) Valeur = 33;
else{
TMR0IE_bit = 0; Valeur = 0;
}
break;
case 32: if (tmp == 0x43){ ACK_OK = 1; }
TMR0IE_bit = 0; Valeur = 0;
break;
case 33: if (tmp == 0x42){ NON_ACK_OK = 1; }
TMR0IE_bit = 0; Valeur = 0;
break;
case 40: if (tmp == 0x01) Valeur = 41;
else{
TMR0IE_bit = 0; Valeur = 0;
}
break;
case 41: if (tmp == 0x00) Valeur = 42;
else{
TMR0IE_bit = 0; Valeur = 0;
}
break;
case 42: if (tmp == 0x46){ RESET_OK = 1; }
TMR0IE_bit = 0; Valeur = 0;
break;
default: Valeur = 0;
}
}
}
void main(){
ANSELA = ANSELB = 0; TRISA = 0b11010000; TRISB = 0b00011010;
PORTA = PORTB = 0; RTS = 1;
OSCCON = 0b01110010; TRX_DIS = 1; CONFIG = 0; PEIE_bit = 1; RCIE_bit = 1; RCIF_bit = 0; T1CON = 0x01; TMR1H = 0xB1; TMR1L = 0xE0; TMR1IF_bit = 0; TMR1IE_bit = 1;
OPTION_REG = 0x82; TMR0 = 0x06; TMR0IF_bit = 0; TMR0IE_bit = 0; UART1_Init(9600);
delay_ms(100);
Led_R = Led_B = Led_V = 0;
GIE_bit = 1; Conf_AMB8626(); F_demande = Valeur = Groupe = F_Ordre = 0;
while(1){
if (F_Envoi == 1){
F_Envoi = 0;
Led_V = 1; RTS = 0;
while (CTS == 1);
UART_Write(0x02); UART_Write(0x01); UART_Write(0x03); UART_Write(0x6A); UART_Write(0x01); UART_Write(0x01); UART_Write(0x6A); RTS = 1; while (CTS == 0);
delay_ms(10);
Led_V = 0;
}
}
}► Afficher le Header de configuration
Code : Tout sélectionner
void Conf_AMB8626(){
Parametre_OK = Commande_Mode_OK = RESET_OK = 0;
do{
CONFIG = 1;
delay_ms(10);
CONFIG = 0;
delay_ms(100);
}while (Commande_Mode_OK == 0 ); do{
UART_Write(0x02); UART_Write(0x09); UART_Write(0x04); UART_Write(0x48); UART_Write(0x02); UART_Write(0x00); UART_Write(0x03); UART_Write(0x46); delay_ms(50);
}while (Parametre_OK == 0 ); Parametre_OK = 0; do{
UART_Write(0x02); UART_Write(0x09); UART_Write(0x03); UART_Write(0x14); UART_Write(0x01); UART_Write(0x03); UART_Write(0x1D^0x03); delay_ms(50);
}while (Parametre_OK == 0 ); Parametre_OK = 0; do{
UART_Write(0x02); UART_Write(0x09); UART_Write(0x03); UART_Write(0x15); UART_Write(0x01); UART_Write(0x01); UART_Write(0x1D); delay_ms(50);
}while (Parametre_OK == 0 ); Parametre_OK = 0; do{
UART_Write(0x02); UART_Write(0x09); UART_Write(0x03); UART_Write(0x19); UART_Write(0x01); UART_Write(0x63); UART_Write(0x73); delay_ms(50);
}while (Parametre_OK == 0 ); Parametre_OK = 0; do{
UART_Write(0x02); UART_Write(0x09); UART_Write(0x03); UART_Write(0x1D); UART_Write(0x01); UART_Write(Identifiant); UART_Write(0x14^Identifiant); delay_ms(50);
}while (Parametre_OK == 0 ); Parametre_OK = 0; do{
UART_Write(0x02); UART_Write(0x05); UART_Write(0x00); UART_Write(0x07); delay_ms(100);
}while (RESET_OK == 0 ); RESET_OK = 0; delay_ms(500); do{
CONFIG = 1;
delay_ms(10);
CONFIG = 0;
delay_ms(100);
}while (Commande_Mode_OK == 0 ); for (i=0;i<6;i++){
Led_B = ~Led_B;
delay_ms(50);
}
TRX_DIS = 0; }Ça fonctionne presque bien. Disons que ca marchotte ! et je n'arrive pas à trouver la coquille !
Je fais clignoter une LED verte sur le module centrale quand il émet une demande, et rouge sur le recepteur quand il à reçu et envoyé la réponse.
Le module satellite est obligé d'envoyer une réponse à la centrale pour pour que celle ci puisse avoir son RSSI ! Sinon je pourrai me contenter un accusé de reception pour savoir que mon satellite est allumé ou à portée .( Ce serait plus simple et j'ai pense de plus en plus même si le fait de voir le RSSI est un très gros avantages).
Le hic c'est que des fois la led rouge de reception arrête de clignoter au rythme de l’émission, puis reprend ! Elle arrete aléatoirement allant de 1 coup a plus de 30 secondes.
J'ai donc branché un cable USB/TLL, pour regarder ce que reçoit mon PIC pendant ces bug ? et surprise il reçoit bien la commande qui devrait faire clignoter ma led , mais elle clignote pas !.
J'en ai déduis qu'il s'agissait de ma partie reception qui posait problème. Mais ou mon PIC pourrait-il se bloquer pour ne pas faire clignoter ma LED quand l'UART recoit la bonne commande ?