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 ",
250mgrâ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.