Bonjour,
J'ai deux cartes. L'une est une carte Arduino et l'autre une carte électronique munie d'un PIC16F876 et d'un afficheur LCD. Les deux cartes communiquent par l'intermédiaire de deux modules XBee.
La carte PIC est programmée pour réceptionner des informations issues du module Xbee et les afficher sur l'écran LCD. Le programme est disponible ci-dessous.
La carte Arduino est programmée pour envoyer des informations grâce au module Xbee.Code:#include<pic16f876.h> #include <xc.h> #include <stdio.h> #include <stdlib.h> #pragma config FOSC = XT // Oscillator Selection bits (XT oscillator) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled) #pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT enabled) #pragma config CP = OFF // FLASH Program Memory Code Protection bits (Code protection off) #pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled) #pragma config LVP = OFF // Low Voltage In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming) #pragma config CPD = OFF // Data EE Memory Code Protection (Code Protection off) #pragma config WRT = ON // FLASH Program Memory Write Enable (Unprotected program memory may be written to by EECON control) #define _XTAL_FREQ 4000000 #define RS PORTCbits.RC1 #define EN PORTCbits.RC0 #define LED PORTAbits.RA0 // RB7 -> D7 //Connectiques entre PIC et LCD // RB6 -> D6 //Connectiques entre PIC et LCD // RB5 -> D5 //Connectiques entre PIC et LCD // RB4 -> D4 //Connectiques entre PIC et LCD // INITIALISATION ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ void LCD_Init(); void LCD_Cmde(unsigned char cmde); void LCD_data(unsigned char data); void LCD_goto(char position); char var1; char var2; char var3; int variable; void main(void) //PROGRAMME PRINCIPAL { //INITIALISATION ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ TRISA = 0b00000000; ADCON1 = 0b00000110; TRISB = 0b11000000; TRISC = 0b11000000; TXSTA = 0b00000110; RCSTA = 0b10010000; SPBRG = 25; PIE1 = 0b00100000; PORTA = 0; PORTB = 0; RCREG = 0x00; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ LCD_Init(); //Initialisation LCD LCD_goto(0x03); //Décale le curseur ligne 1, position 3 LCD_data('P'); LCD_data('r'); LCD_data('o'); LCD_data('j'); LCD_data('e'); LCD_data('t'); LCD_data(' '); LCD_data('B'); LCD_data('T'); LCD_data('S'); LCD_goto(0x43); //Décale le curseur ligne 2, position 0 LCD_data('G'); LCD_data('i'); LCD_data('g'); LCD_data('a'); LCD_data(' '); LCD_data('P'); LCD_data('i'); LCD_data('x'); LCD_data('e'); LCD_data('l'); __delay_ms(3000); LCD_Cmde(0x01); //Efface LCD LCD_data('V'); LCD_data('i'); LCD_data('t'); LCD_data('e'); LCD_data('s'); LCD_data('s'); LCD_data('e'); LCD_data(':'); while (1) { if (RCIF == 1) { LED = !LED; variable = RCREG; //Contenu de RCREG stocké dans variable } var1 = variable/100; var2 = (variable%100)/10; var3 = variable%10; LCD_data(var1+'0'); //Ecrire les centaines sur LCD __delay_us(100); LCD_data(var2+'0'); //Ecrire les dizianes sur LCD __delay_us(100); LCD_data(var3+'0'); //Ecrire les unités sur LCD __delay_us(100); LCD_goto(0x08); //Décale le curseur ligne 1, position 8 __delay_us(100); } } void LCD_Init (void) //FONCTION D'INITIALISATION LCD ~~~~~~~~~~~~~~~~~~~~~~~~~~~ { __delay_ms(15); LCD_Cmde(0b00110000); //En mode 8 bits __delay_ms(5); LCD_Cmde(0b00110000); //En mode 8 bits __delay_ms(5); LCD_Cmde(0b00110010); //En mode 8 bits __delay_us(100); LCD_Cmde(0x28); //En mode 4 bits / 2 lignes __delay_us(100); LCD_Cmde(0x28); __delay_us(100); LCD_Cmde(0x0C); //Display ON/OFF / Cursor off __delay_us(100); LCD_Cmde(0x01); //Efface LCD __delay_us(100); } void LCD_Cmde(char cmde) //FONCTION ENVOI D'UNE COMMANDE LCD ~~~~~~~~~~~~~~~~~~~ { RS = 0; //Ecrire une commande PORTB = cmde>>4; //Envoi des 4 bits de poids forts MSB __delay_ms(1); EN = 1; __delay_ms(1); EN = 0; PORTB = cmde; //Envoi des 4 bits de poids faible LSB __delay_ms(1); EN = 1; __delay_ms(1); EN = 0; } void LCD_data(unsigned char data) //ENVOI D'UNE DONNEE LCD ~~~~~~~~~~~~~~~~~~~~~ { RS = 1; //Ecrire une donnée PORTB = data>>4; //Envoi des 4 bits de poids forts MSB __delay_ms(1); EN = 1; __delay_ms(1); EN = 0; PORTB = data; //Envoi des 4 bits de poids faible LSB __delay_ms(1); EN = 1; __delay_ms(1); EN = 0; } void LCD_goto(char position) //FONCTION POSITION CURSEUR LCD ~~~~~~~~~~~~~~~~~~~ { RS = 0; //Ecrire une commande PORTB = (0x80+position)>>4; //0x80 = Ecrire dans la DDRAM / position curseur __delay_ms(1); EN = 1; __delay_ms(1); EN = 0; PORTB = (0x80+position); //0x80 = Ecrire dans la DDRAM / position curseur __delay_ms(1); EN = 1; __delay_ms(1); EN = 0; }
Si j'envoie 'A' et 'B' depuis la carte Arduino vers la carte PIC, les nombres 65 et 66 s'affichent sur l'écran.
Dans ce cas, tout fonctionne bien.Code:void setup { Serial.begin(9600); } voi loop { Serial.print('A'); delay(1000); Serial.print('B'); delay(1000); }
Je cherche maintenant à numériser la tension issue d'un potentiomètre sur la carte Arduino puis l'envoyer à la carte PIC pour l'afficheur en temps réel sur l'écran.
Néanmoins, cela ne marche pas. Je reçois qu'une seule donnée puis plus rien. Sur la carte PIC, il y a une LED (sur RA0) qui change d'état à la réception d'un octet. Avec cette nouvelle programmation de la carte Arduino, la LED ne veut plus clignoter.Code:int POT = A3; int val = 0; void setup()//////////////////////////////////// { Serial.begin (9600); } void loop() { val = analogRead (POT); Serial.print(val); delay(1000); }
Pouvez vous m'aiguiller ?
Je vous remercie,
Cordialement,
Cotton.
-----