TP4 : Communication par le bus série OneWire
Manipulation :
Travail à faire :
Créer un projet avec MikroC on utilisant le Pic16f887 avec une fréquence de 8MHz, activer les librairies
suivantes : (Conversions, C_String, LCD, LCD_Constats, One_Wire, Sound).
Ecrire le programme suivant :
// Connexion du module LCD
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// Fin de connexion du module LCD
//------------------------- DECLARATION VARIABLE ET I/O -----------------------------------------------
char Flag_alarme;
unsigned int temperature; // Création d'une variable pour stocker la temperature sur 2 Octets
char text[15]; // Création d'une chaine de caractère pour stocker le texte à afficher
//------------------------------------------ PROTOTYPE --------------------------------------------------------
void Calcul_temperature(unsigned int);
void main() {
ANSEL = 0; // Configure AN pins as digital I/O
ANSELH = 0; // Configure le PORTB et le PORTE en digital
TRISB = 0; // Configure le PORTB en sortie pour le LCD
Lcd_Init(); // Initialisation du LCD
Lcd_Cmd(_LCD_CLEAR); // On efface l'écran
Lcd_Cmd(_LCD_CURSOR_OFF); // On arrête le clignotement du curseur
Lcd_Out(1, 1, "DS18B20+"); // Texte de fond 1ere ligne
Lcd_Out(2, 1, "Temp = C"); // Texte de fond 2iéme ligne
Lcd_Chr(2,13,178); // Rajoute le petit signe "°"
Sound_Init(&PORTE, 1); // On initialise le buzzer sur RE1
while (1) {
//--- On effectue une lecture de température
Ow_Reset(&PORTE, 2); // On reset le signal sur le BUS
Ow_Write(&PORTE, 2, 0xCC); // Saute lecture du code 64 bits en ROM (si 1 seul DS18B20+)
Ow_Write(&PORTE, 2, 0x44); // Demande d'effectuer une conversion "CONVERT_T"
Delay_us(800); // Délais d'attente de la DS. Pour une conversion sur 12 bit c'est 750ms
Ow_Reset(&PORTE, 2); // On reset le signal sur le BUS
Ow_Write(&PORTE, 2, 0xCC); // Saute lecture du code 64 bits en ROM (si 1 seul DS18B20+)
Ow_Write(&PORTE, 2, 0xBE); // On demande la lecture du scratchpad "READ_SCRATCHPAD"
temperature = Ow_Read(&PORTE, 2); // On lit la premiére valeur du Scratchpad
temperature += (Ow_Read(&PORTE, 2) << 8); // La seconde qui est la MSB donc on décale de 8 bit
// La variable "temperature" est maintenant sur 16 bit correspondant à notre temperature
Calcul_temperature(temperature); // Fonction qui convertit les valeurs et les affichent
delay_ms(1000); // Petite pause
}
}
void Calcul_temperature(unsigned int temperature_hex) {
float temperature_flt ; // Création d'une variable locale flottante
// On regarde si la temperature est négative
if (temperature_hex & 0x8000) { // On test le bit du signe qui est le bit15 .
text[0] = '-'; // Si la réponse est 1 ,elle est négative, donc on place le signe moins dans le texte
temperature_hex = ~temperature_hex + 1 ;
}
temperature_flt = temperature_hex * 0.0625; // on convertir la valeur hexadecimale sur 16bit en float
FloatToStr(temperature_flt, text); // On convertit le Flottant en string pour l'afficher
text[4] = 0; // On coupe la chaine de caractère à 4 valeurs
// Cela revient à arrondir à un chiffre après la virgule
Lcd_Out(2, 8, text); // On affiche notre température
}
Travail demander
1- Réaliser sur Proteus le circuit électronique puis téléverser le programme dans le microcontrôleur
16f887 le DS18b20 est placer sur le port RE2, et le switch J11 sur RE2 ?
2- Modifier le Texte qui s’affiche dans l’écran par une phrase de 16 caractères et fait là d’effiler ?
3- Utiliser les connaissances de TP1 et TP2 pour réaliser une calculatrice simple ?