Mémoires & E/S
Gestion d'Entrées/Sorties avec les PICBASIC
Mon premier programme: pilotage d'une Led - Lextronic
Ce premier programme vous permettra de vous familiariser avec quelques instruction du PICBASIC. Commencez en premier lieu par relier la broche "I/O 8" du PICBASIC sur une des Leds de la platine "PB Study Board" (à noter que la led dispose d'une résistance en série pré-installée sur la platine).
Recopiez alors à l'écran le programme ci-dessous:
10 OUT 8,1
DELAY 1000
OUT 8,0
DELAY 1000
GOTO 10
Comme vous pourrez le remarquer, toutes les lignes du programme doivent être impérativement décalées de plusieurs espace vers la droite (les instructions ne doivent pas être collées complètement vers la gauche de l'écran). Seules les lignes dotées d'un numéro doivent être accolées vers la gauche de l'écran (avec un ou plusieurs espace entre le numéro en question et son instruction) -> Dans cet exemple, la ligne 10.
Un fois le programme saisie, cliquez sur le bouton "RUN" en haut de l'écran (le programme vous demande alors sous quel nom vous voulez sauvegarder votre listing: tapez LED1). A ce stade, si tout ce passe correctement, une barre de progression bleue en bas de l'écran doit se remplir 2 fois (une fois pour suivre la programmation du PICBASIC et une seconde fois pour suivre sa vérification). Attention, suivant la vitesse de votre PC, la progression de la ligne bleue peu être très rapide (moins d'une 1/2 seconde !).
Dès lors, la Led N° 1 de la platine doit se mettre à clignoter toutes les secondes !
Cet exemple très simple utilise principalement 3 instructions:
OUT - DELAY - GOTO
En ligne 10 , le programme va donc commencer par appliquer un niveau logique haut sur le port "I/O 8" (lequel est relié à la Led - via une résistance présente sur la platine "PB Study Board"). Ce qui aura pour effet de l'allumer. A la ligne suivante, le PICBASIC effectue une temporisation de 1000 ms avant d'appliquer un niveau logique bas sur le port "I/O 8" (ce qui aura pour effet d'éteindre la Led). La quatrième ligne du programme demande une nouvelle fois au PICBASIC d'effectuer une temporisation de 1000 ms. Enfin la dernière ligne indique au PICBASIC qu'il doit reprendre l'exé-cution de son programme à partir de la ligne 10, ceci afin d'effectuer un clignotement sans fin de la led.
Modifiez maintenant votre programme en remplaçant les 2 valeurs après les instructions DELAY par 250 (au lieu de 1000). Cliquez à nouveau sur le bouton "RUN" en haut de l'écran. Après avoir été programmé, le PICBASIC fait alors clignoter sa led plus rapidement. Programmez maintenant la première valeur de l'instruction DELAY avec le nombre 25 et la seconde instruction DELAY avec la valeur 1000. Cliquez à nouveau sur le bouton "RUN" en haut de l'écran. A ce stade, la Led doit émettre des flashs cycliques très brefs. Expérimentez alors vous-même vos propres valeur.
Comme vous pourrez le remarquer, si vous mettez des valeurs très basses pour les 2 instructions DELAY, la Led semblera resté allumée (la persistance rétinienne y étant pour quelque chose - la durée entre l'allumage et l'extinction de la led est en effet beaucoup trop courte pour que l'heure puisse "voir" le changement d'état).
Nota: rappelez-vous que les valeurs limites desinstructions DELAY doivent être comprise entre 1 et 65535.
Led clignotante à vitesse variable
Cette nouvelle application vous permettra de modifier la vitesse de clignotement de la Led par le biais d'un potentiomètre à raccorder sur la broche "I/O 0" de votre module "PICBASIC" (tout modèle sauf le "PICBASIC-1B").
DIM VITESSE AS INTEGER
10 VITESSE=ADIN(0)
VITESSE=VITESSE+1
OUT 8,1
DELAY VITESSE
OUT 8,0
DELAY VITESSE
GOTO 10
Ce nouveau programme apporte beaucoup de commentaires. Il va en premier lieu nous permettre d'avoir recours à ce que l'on appel une "VARIABLE". Une variable, comme son nom l'indique est un nombre dont la valeur peut changer suivant l'exécution de votre programme. La première chose à faire avant de pouvoir l'utiliser et d'indiquer au PICBASIC son nom et sa taille. C'est ce qui fait dans la première ligne de ce nouveau programme avec l'instruction DIM.
On indique donc ici au PICBASIC que l'on désire utiliser une variable portant le nom VITESSE.
Pour la taille, le PICBASIC-3B peut travailler soit avec:
- Des variables dont la valeur peut être comprise entre 0 et 255 (variable sur 8 bits), encore
appelée variable de type BYTE.
- Des variables dont la valeur peut être comprise entre 0 et 65535 (variable sur 16 bits), encore
appelée variable de type INTEGER.
Dans notre programme, la longueur est de 16 bits. La valeur que pourra prendre la variable VITESSE pourra donc être comprise entre 0 et 65535.
La deuxième ligne de notre programme utilise une nouvelle instruction
ADIN
Celle-ci vous permettra de récupérer la valeur de la tension analogique présente sur une des entrées spécialisées du PICBASIC et de vous la présenter sous la forme d'un chiffre compris entre 0 et 1023 (il s'agit en fait des entrées de conversion analogique/numérique). A noter que les PICBASIC-3B/3H et PICBASIC-2000 sont dotés d'entrées de conversion analogique/numérique de résolution 10 bits - les PICBASIC-1S/2S/2H ayant pour leur part des entrées de conversion analogique/numérique d'une résolution de 8 bits -> Dès lors, le chiffre retourné par ces derniers ne sera compris qu'entre 0 et 255). Enfin pour rappel, le PICBASIC-1B ne peut pas gérer les valeurs analogique, du fait qu'il ne dispose pas d'entrée de conversion analogique/numérique.
La ligne 10 du programme va donc demander au PICBASIC de récupérer la valeur analogique présente à la broche "I/O 0" et de la stocker dans la variable VITESSE. A ce stade, si le curseur est à fond dans le sens des aiguilles d'une montre, la tension présente sur le curseur du potentiomètre (et à l'entrée de "I/O 0") sera nulle (curseur mis à a masse) et la variable VITESSE sera égale à 0. Si le curseur du potentiomètre est positionné à fond dans le sens inverse, le +5 V présent sur ce dernier fera que la variable VITESSE recevra la valeur 1023. Si le curseur est à mi-course, la valeur de VITESSE avoisinera 512 et ainsi de suite.
NOTA: Une erreur à ne pas commettre serait d'avoir déclaré la variable VITESSE en mode BYTE (sur 8 bits) en début de programme. Dès lors, celle-ci ne serait prévue que pour accepter des valeurs comprises entre 0 et 255 et les valeurs récupérées par l'instruction ADIN ne seraient alors plus compatibles (puisque ces dernières peuvent varier de 0 à 1023).
Du fait que nous désirions utiliser la valeur stockée dans la variable VITESSE pour paramétrer la durée de la temporisation à l'aide de l'instruction DELAY, il est important de rappeler les limites d'utilisation acceptée par DELAY (entre 1 et 65535). Dès lors, si le curseur est positionné de tel sorte que la variable VITESSE soit à 0, il y aura incompatibilité. C'est pourquoi on prend le soin d'ajouter une unité à la variable VITESSE (VITESSE=VITESSE+1) qui pourra donc au final être comprise (suivant la position du curseur) entre 1 et 65536.
Le reste du programme est assez simple à comprendre. On allume la Led présente sur le sortie "I/O 8", puis on effectue une temporisation dont la durée est donnée par la variable VITESSE, puis on éteint la Led, puis on effectue à nouveau une temporisation de même durée avant de venir relire à nouveau la valeur de la tension présente sur le curseur, pour à nouveau faire clignoter la Led selon la durée mesurée et ainsi de suite.
Dans la pratique, vous vous apercevrez que la Led reste quasiment allumée lorsque le curseur est proche du 0 V (la valeur de la variable VITESSE étant alors très faible et de part le phénomène de persistance rétinienne expliqué ci-avant, vous aurez l'impression que la Led reste allumée).
Extension des ports d'E/S - Lextronic
Bien que bénéficiant d'un nombre de ports d'entrées/sorties supérieur à la plupart des produits concurrents, il peut être intéressant pour certaines applications de disposer d'encore plus d'entrées ou de sorties que ce que les "PICBASIC" peuvent proposer. Les exemples de schémas et programmes qui suivent vous montreront comment faire.
a) Comment adjoindre 5 sorties supplémentaires ?
Le schéma ci-contre montre comment vous pourrez, grâce à un circuit intégré additionnel de type 74HC595, bénéficier de 5 nouvelles sorties. Ce circuit s'interface très facilement avec les "PICBASIC" à l'aide de 3 ports en utilisant l'instruction "SHIFTOUT". Il vous suffira de lui envoyer l'état que doivent prendre ses 8 sorties par l'intermédiaire d'une broche série (synchronisée par un signal d'horloge) avant de "verrouiller" cet état via une entrée de type "latch", tout ceci vous permettant donc de disposer de "8-3"= 5 sorties en plus. Le programme qui suit incrément une valeur en permanence et envoi sa valeur sur les 8 sorties du 74HC595.
10 DIM I AS BYTE
20 OUT 14,0 ' RAZ "LATCH"
30 I = 0
40 SHIFTOUT 15,13,1,I
50 I = I + 1
60 PULSE 14
70 GOTO 40
b) Comment adjoindre 5 entrées supplémentaires ?
Le schéma ci-contre montre comment vous pourrez, grâce à un circuit intégré additionnel de type 74HC597, bénéficier de 5 nouvelles entrées. Ce circuit s'interface très facilement avec les "PICBASIC" de façon similaire au circuit ci-dessus, à l'aide de 3 ports en utilisant l'instruction "SHIFTIN". Le programme qui suit transfère la valeur des 8 entrées du "74HC597" dans la variable "I".
10 DIM I AS BYTE
20 OUT 8,0
30 PULSE 8
40 PULSE 8
50 I = SHIFTIN 9,10
Les 2 exemples ci-avant ne sont que quelques-unes des possibilités offertes pour la réalisation d'extension d'entrées/sorties. Il vous est également possible d'avoir très facilement recours à des circuits type bus I2C™ (PCF8474P) ou même des PIO (8255A).
Adressage mémoire EEprom I2C™ 24LC04 - 30/05/2002 - Mr Bernard Bourgeois
Le programme "EEPROM.BAS" vous montrera comment adresser une mémoire externe I2C™ à l'aide d'un module PICBASIC.
Autre exemple d'adressage d'une mémoire EEprom I2C™ - Lextronic
Il peut être intéressant dans certains cas de figure de disposer d'une mémoire externe supplémentaire pour sauvegarder un grand nombre de données. L'exemple qui suit vous montre comment piloter une mémoire de type 24LC04. Cette référence utilise un mode de gestion basé sur le protocole "I2C™". Ce protocole mis au point par Philips™ est très utilisé par d'autres types de composants: mémoire RAM, gestionnaire d'entrées/ sorties, convertisseurs N/A, synthétiseurs, etc... Sans expliquer dans le détail le principe de fonctionnement (de très bons ouvrages techniques spécialisés sont disponibles pour celà), sachez qu'il nécessite seulement le recours à 2 fils de liaisons qui par le biais d'un dialogue série vous permettront de piloter entièrement ces composants. Tous les composants "I2C™" peuvent être "montés" en parallèle (vis-à-vis de leur bus 2 fils) et adressés indépendamment grâce à un système de "repérage" par une adresse interne à chaque circuit. Les 2 fils utilisés sont respectivement RDA (servant à envoyer / recevoir les données en série) et CSL servant de signal d'horloge de synchronisation. Des conditions particulières dans l'établissement et le chevauchement de ces signaux permettent de déterminer les débuts et fins (START/STOP) de communication entre les circuits. Le programme ci-dessous recrée tous les signaux de base propres à piloter des composants I2C™ et vous montre comment lire et afficher tout le contenu d'une mémoire EEPROM 24LC04 sur un afficheur LCD à commande série.
CONST SCL = 4
' Programme de gestion de la mémoire EEPROM
CONST SDA = 5
DIM I AS BYTE
DIM J AS BYTE
DIM K AS BYTE
SET PICBUS HIGH
LCDINIT
J=0
10 GOSUB I2C_WRITE
GOSUB I2C_READ
J = J + 1
LOCATE 0,0 ' Initialise l'adresse de lecture
' Entame le dialogue avec l'EEPROM
' Récupère la donnée dans l'EEPROM
PRINT HEX(K)
GOTO 10
I2C_WRITE:
GOSUB I2C_START ' Affiche la valeur hexadécimale de la donnée lue.
I = &B10101110 ' Configure l'adresse de repérage de l'EEPROM
SHIFTOUT SCL,SDA,2,I ' Envoi l'adresse de l'EEPROM sur le BUS I2C
SHIFTOUT SCL,SDA,2,J ' pour le sélectionner
SHIFTOUT SCL,SDA,2,J
GOSUB I2C_STOP
RETURN
I2C_READ:
GOSUB I2C_START
I = &B10101110 ' Configure l'adresse de repérage de l'EEPROM
SHIFTOUT SCL,SDA,2,I ' Envoi l'adresse de l'EEPROM sur le BUS I2C
SHIFTOUT SCL,SDA,2,J ' pour le sélectionner
GOSUB I2C_START
I = &B10101110
SHIFTOUT SCL,SDA,2,I
K = SHIFTIN (SCL,SDA,1)
GOSUB I2C_STOP
RETURN
I2C_START:
OUT SCL,1
OUT SDA,1
OUT SDA,0
RETURN
I2C_STOP:
OUT SDA,0
OUT SCL,1
OUT SDA,1
RETURN