Résumé système embarqué
2/2
ChatGPT
Liaison RS232
Présentation
La liaison RS-232 est une norme pour une voie de communication série, souvent appelée port série. Sur
les systèmes d’exploitation MS DOS et Windows, les ports RS-232 sont nommés COM1, COM2, COM3,
etc. Ces liaisons sont couramment utilisées dans l'industrie pour connecter divers appareils
électroniques (automates, appareils de mesure, etc.) et pour exploiter certains réseaux sans fil comme
le Bluetooth, le GSM et le Wi-Fi.
Fonctionnement
L'hôte (ordinateur) sélectionne l'esclave (périphérique série) avec lequel il souhaite communiquer pour
établir une connexion entre les deux. Une fois la connexion établie, l'hôte ou l'esclave peut envoyer des
données à tout moment.
Signaux
La liaison RS-232 utilise deux signaux logiques :
RXD (RX pour le microcontrôleur) : Receive data
TXD (TX pour le microcontrôleur) : Transmit data
Support de transmission
Le support de transmission est le câble série ou tout autre câble muni de trois ou deux fils, avec une
longueur maximale de 15 mètres pour une vitesse de transmission de 9600 bits/seconde.
Topologie
La topologie utilisée par la liaison RS-232 est du type étoile. Tous les microcontrôleurs esclaves se
connectent au PC, qui est considéré comme le maître.
Codage
Le codage utilisé est le NRZ (no return to zero). Les niveaux de tension sont :
De -25 à -3 volts pour le niveau logique 1
De 3 à 25 volts pour le niveau logique 0
Avec l’UART, les niveaux de tension sont 0 et 5 volts respectivement pour les niveaux logiques 0 et 1.
Interface de ligne
L’interface de ligne utilisée est le circuit intégré MAX232, dont le rôle principal est de convertir le niveau
RS-232 en UART et vice versa. Les connexions sont les suivantes :
Rx est connecté à RiO
Tx est connecté à TiI
RiI est connecté à TXD
TiO est connecté à RXD
C1 et C2 sont connectés à des condensateurs électrolytiques de capacité 1-10 µF
Vs- est connecté à l'électrode négative du condensateur électrolytique de capacité 1-10 µF (l'autre
borne est connectée à VCC)
Vs+ est connecté à l'électrode positive du condensateur électrolytique de capacité 1-10 µF (l'autre borne
est connectée à la masse).
Couche Liaison
Mode d'accès
Le mode d'accès au bus RS-232 est le mode "selecting", c'est-à-dire que le maître (l'ordinateur) doit
sélectionner l'esclave (le microcontrôleur) avec lequel il souhaite communiquer.
Trame
La norme RS-232 utilise souvent des UART qui découpent le flux en trames d’un caractère constituées de
:
1 bit de départ : START
7 à 8 bits de données : DATA
1 bit de parité optionnel : PARITY
1 ou 2 bits d’arrêt : STOP
Le bit de départ a un niveau logique "0" tandis que le bit d’arrêt est de niveau logique "1". Le bit de
donnée de poids faible (LSB) est envoyé en premier, suivi des autres.
Liaison RS-232 en MikroPascal
Bibliothèques UART
UART (Universal Asynchronous Receiver Transmitter) est un module intégré dans de nombreux
microcontrôleurs. MikroPascal offre un travail confortable avec le mode asynchrone (full duplex). Vous
pouvez facilement communiquer avec n'importe quel appareil via le protocole RS-232 (par exemple un
PC).
Les différents signaux d'une liaison UART pour un microcontrôleur PIC sont :
TX, porté par la broche RC6 (pour PIC16F887 et PIC18F4550)
RX, porté par la broche RC7 (pour PIC16F887 et PIC18F4550)
Routines de la bibliothèque UART
UARTx_Init(a: longint) : Initialise le module UART à une vitesse de transfert a. La lettre x spécifie le
numéro du module UART (si plusieurs sont présents). Exemple :
pascal
Copier le code
UART1_Init(9600);
UARTx_Data_Ready(): byte : Vérifie si la mémoire tampon de réception est pleine. Retourne 1 si pleine,
sinon 0. Exemple :
pascal
Copier le code
var recu: byte;
if UART1_Data_Ready() = 1 then
recu := UART1_Read();
UARTx_Tx_Idle(): byte : Vérifie si la mémoire tampon d'émission est vide. Retourne 1 si vide, sinon 0.
Exemple :
pascal
Copier le code
if UART1_Tx_Idle() <> 0 then
begin
...
end;
UARTx_Read(): byte : Lit un octet via l’UART. Vérifier d'abord si la mémoire tampon de réception est
pleine. Exemple :
pascal
Copier le code
var recu: byte;
if UART1_Data_Ready() = 1 then
recu := UART1_Read();
UARTx_Read_Text(var a, b: array[255] of byte; c: byte) : Lit une chaîne de caractères délimitée par la
chaîne b ou ayant une longueur c, affectant le résultat à la variable a. Exemple :
pascal
Copier le code
UART1_Init(4800);
Delay_ms(100);
while TRUE do
begin
if UART1_Data_Ready() = 1 then
begin
UART1_Read_Text(output, 'OK', 10);
UART1_Write_Text(output);
end;
end;
UARTx_Write(a: byte) : Envoie l’octet a via l’UART. Vérifier d'abord si la mémoire tampon d'émission est
vide. Exemple :
pascal
Copier le code
var data: byte;
data := 0x1E;
UART1_Write(data);
UARTx_Write_Text(var a: string) : Envoie la chaîne de caractères a via UART. Exemple :
pascal
Copier le code
UART1_Init(4800);
Delay_ms(100);
while TRUE do
begin
if UART1_Data_Ready() = 1 then
begin
UART1_Read_Text(output, 'OK', 10);
UART1_Write_Text(output);
end;
end;
UART_Set_Active(read_ptr: ^Tread_ptr; write_ptr: ^Twrite_ptr; ready_ptr: ^Tready_ptr; tx_idle_ptr:
^Ttx_idle_ptr) : Active le module UART pour utiliser les routines de la bibliothèque en spécifiant les
adresses des fonctions et procédures. Exemple :
pascal
Copier le code
UART1_Init(9600);
UART2_Init(9600);
RS485Master_Init();
UART_Set_Active(@UART1_Read, @UART1_Write, @UART1_Data_Ready, @UART1_Tx_Idle);
RS485Master_Send(dat, 1, 160);
UART_Set_Active(@UART2_Read, @UART2_Write, @UART2_Data_Ready, @UART2_Tx_Idle);
RS485Master_Send(dat, 1, 160);
Exemple de système embarqué
Un système embarqué qui lit une chaîne provenant du PC et change l'état d'une LED connectée à une
broche du port B si la chaîne est "sammy", avant de la renvoyer via la liaison UART :
pascal
Copier le code
program exempleUART;
var recu: byte;
chaine, tmp: array[20] of char;
begin
osccon := 113;
ansel := 0;
anselh := 0;
c1on_bit := 0;
c2on_bit := 0;
trisb := 0;
portb := 0;
UART1_Init(9600);
Delay_ms(100);
UART1_Write_Text('PRET');
while (TRUE) do
begin
if (UART1_Data_Ready() <> 0) then
begin
uart1_read_text(chaine, #13#10, 20);
tmp := 'sammy';
if memcmp(@chaine, @tmp, 5) = 0 then portb := not portb;
uart1_write_text(chaine);
end;
end;
end.
Du côté PC, nous aurons l’interface suivante :
Avec les codes pour l’envoi (procedure Button2Click), la réception (procedure Timer1Timer), la
connexion (procedure Button1Click), et la déconnexion (procedure Button3Click) :
pascal
Copier le code
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenCom(2, 9600, NOPARITY, ONESTOPBIT, true) then
Color := clGreen;
end;
procedure TForm2.Button2Click(Sender: TObject);
begin
sendbyte(StrToInt([Link]));
end;
procedure TForm2.Timer1Timer(Sender: TObject);
var x: string;
begin
x := readstring();
if x <> '' then [Link] := x;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
closecom(2);
Color := clRed;
end;
end.
Le tableau ci-dessous montre la correspondance entre les routines de la bibliothèque UART et son
équivalent dans la bibliothèque SLBCOM :
UART SLBCOM
Uart_init(a) OPENCOM(a, b, c, d, e): boolean
Uart_read() READBYTE (a: integer): string
Uart_write(a) SENDBYTE(a: integer; b: string)
Uart_read_text(a, b, c) READSTRING (a: integer): string
Uart_write_text(a) SENDSTRING(a: integer; b: string)
Avec le même principe, on peut exploiter les faisceaux hertziens en utilisant :
Le module HC-12 pour la liaison UART sans fil
Le module HC-06 pour la liaison Bluetooth
Le module DT-06 pour la liaison Wi-Fi
Le module SIM800 pour la liaison GSM
ChatGPT peut faire