Ici, on va aborder quelque chose que vous devez absolument apprendre pour avancer en programmation embarquée: Le Bit Banging.
Il s'agit d'une technique qui a largement été utilisée dans les communications série en l'absence d'un "hardware" dédié.
Pour cet exemple, je vais utiliser la carte de développement PICDEM PIC18 EXPLORER Demo Board de chez Microchip, mais vous pouvez évidemment utiliser un simple microcontrôleur et y connecter quelques LEDs pour tester.
On commence par les différents #include et les #pragma :
// Bibliothèque pour insérer un délai // Header pour le microcontrôleur #include <p18cxxx.h>
Et les #pragma pour le PIC18F8722 #include <delays.h>
Tout se passe dans le main() à travers une boucle globale qui en contient deux autres:#pragma config OSC = HSPLL #pragma config FCMEN = OFF #pragma config IESO = OFF #pragma config PWRT = OFF #pragma config BOREN = OFF #pragma config WDT = OFF #pragma config MCLRE = ON #pragma config LVP = OFF #pragma config XINST = OFF
- La première qui va de D0 à D7
- Et la deuxième qui va de D7 à D0
Il est important ici de noter que pour décaler un bit à droite ou à gauche, il faut qu'il y ait au moins un. Donc plus explicitement, à ce niveau, on a PORTD = 1; ou encore mieux en binaire: PORTD = 0b00000001; c'est là que ça devient intéressant. En effet, si on décale d'un bit vers là gauche on aura:char i = 0; // On en aura besoin pour compter TRISD = 0; // PORTD en mode sortie digitale PORTD = 1; // On met D0 à 1 == Led allumée
PORTD vaudra 2 ou plus exactement 0b00000010. De même, on va dire que PORTD vaut 16 en décimale ( 0b00010000 en binaire); si on fait:PORTD <<= 1; // équivaut PORTD = PORTD << 1;
PORTD vaudra alors 8 ( 0b00001000 en binaire). Je vous laisse avec le petit programme pour expérimenter.PORTD >>= 1;
/* * File: main.c * Author: Mohamed Chakroun * * Created on 17 septembre 2014, 20:29 */ #include <p18cxxx.h> #include <delays.h> #pragma config OSC = HSPLL #pragma config FCMEN = OFF #pragma config IESO = OFF #pragma config PWRT = OFF #pragma config BOREN = OFF #pragma config WDT = OFF #pragma config MCLRE = ON #pragma config LVP = OFF #pragma config XINST = OFF /* * */ void main(void) { char i = 0; TRISD = 0; PORTD = 1; while(1){ while( i < 7 ){ PORTD <<= 1; Delay10KTCYx(1000); i++; } while( i > 0 ){#include <p18cxxx.h> PORTD >>= 1; Delay10KTCYx(1000); i--; } } }Source:www.microkontrol.com