Logiciels > Proteus > Générateur EasyHDL > RS232

Dernière mise à jour : 15/10/2009

English version

Présentation

Génération d'une trames RS232 avec le générateur EasyHDL inclus dans Isis.

Exemple de code

Le code suivant permet d'envoyer à la suite plusieurs chaînes de caractères ASCII, à une vitesse de 9600 bauds, 1 bit de Start, 1 bit de Stop et sans parité. Un petit délai est volontairement appliqué entre l'envoi de chaque ligne.

// SERIAL DATA GENERATOR

// 1 - ASCII data to be output
DATA "Hello World ", 250m
DATA "- EASYHDL Test Program - First line\r", 500m

DATA "Hello World ", 250m

DATA "- EASYHDL Test Program - Second line\r", 500m

DATA REPEAT

// 2 - Define the baud rate
FLOAT BAUD=9600
FLOAT BITTIME=1.0/BAUD

// 3 - Declare working variables
STRING s
INT i,j,d
TIME td

// 4 - Top level
OUT = 1
SLEEP FOR 5m

// 5 - Read DATA line

LOOP:
READ s,td
GOSUB OUTSTRING
SLEEP FOR td
GOTO LOOP

// 6 - Output an ASCII string in S char
OUTSTRING:
FOR i=1 TO LEN(s)
d = ASC(SUBSTR(s,i))
GOSUB OUTCHAR
NEXT I
RETURN

// 7 - Send a single character, one by one
// 1 Start bit, 1 Stop bit, no parity
OUTCHAR:
// Start bit
OUT = 0
SLEEP FOR BITTIME
// Data bits
FOR j=0 TO 7
OUT = d & (1 << j)
SLEEP FOR BITTIME
NEXT j
// Stop bit
OUT = 1
SLEEP FOR BITTIME
RETURN


1 - ASCII data to be output
On définit ici les données à envoyer, grâce au mot-clé DATA, suivi des caractères à envoyer. Comme les données à envoyer sont des caractères ASCII, on peut écrire directement le texte à envoyer, ce dernier doit obligatoirement être placé entre guillements. On peut placer à la fin de chaque ligne, une valeur qui pourra être par la suite être utilisée pour ajouter un délai d'attente. Le type de donnée de cette seconde valeur étant différent (première valeur de type String et seconde valeur de type Time), les deux sont séparées par une virgule. La ligne de commande DATA REPEAT indique que les données devront être répétées sans arrêt une fois les lignes précédentes envoyées.

2 - Define the baud rate
On définit ici la constante de type FLOAT qui prendra la valeur temporelle séparant chaque bit de la trame à transmettre, et qui dépend bien sûr de la vitesse de transmission de la liaison série à simuler. Ici, la vitesse est de 9600 bauds, ce qui correspond à une "fréquence" de 9600 Hz. La période de temps séparant chaque bit est donc de 1 / 9600 secondes, soit 104 us environ.

3 - Declare working variables
Sont définies ici l'ensemble des variables qui sont utilisées par la suite.

4 - Top level
Indique l'endroit à partir duquel le générateur de signal commence réellement à "émettre" ses données.

5 - Read DATA line
Ici, une boucle lit chaque ligne de données spécifiée au tout début grâce au mot-clé DATA. Ainsi, lors de la première passe de la boucle, le contenu de la première ligne DATA est lu, et est placé dans une ou plusieurs variables, grâce au mot-clé READ. Ici, on a deux variables par ligne DATA : une variable de type Strnig (chaine ASCII à transmettre), et une variable de type Time (délai à ajouter entre chaque ligne), les deux étant séparées par une virgule. La ligne READ extrait les deux valeurs et les place dans deux variables séparées.
La première ligne DATA 
DATA "Hello World ", 250m
grâce à la ligne
READ s,td
est ainsi décomposée :
- la valeur "Hello World " est placée dans la variable s
- la valeur 250m est placée dans la variable dt
Une fois cette opération effectuée, on passe la main à la routine OUTSTRING grâce à la ligne GOSUB OUTSTRING, puis on attend un peu, grâce à la ligne SLEEP FOR td.

6 - Output an ASCII string in S char
La routine OUTSTRING travaille sur le contenu de la variable s, préalablement spécifié par la commande READ précédente. Chaque caractère de la chaîne de caractères est transformé en son équivalent "code ASCII", grâce à la fonction
d = ASC(Chr)
où d est la variable où stocker la valeur de la conversion, et Chr est le caractère pioché dans la chaîne concernée. Une fois cette opération effectuée, on passe la main à la routine OUTCHAR grâce à la ligne GOSUB OUTCHAR, qui va transformer chaque code ASCII en son "équivalent de bits".

7 - Send a single character, one by one
C'est donc là que chaque octet stocké dans la variable d, est décomposé en bits, qui sont transmis les un après les autres. Le mot-clé RETURN indique qu'à la fin de la procédure, le programme doit retourner au début de la procédure qui l'a appelée.