Les microcontrôleurs ATMEL ont leur BASIC, le - Bils

Transcription

Les microcontrôleurs ATMEL ont leur BASIC, le - Bils
Les microcontrôleurs ATMEL ont leur BASIC, le BASIC BASCOM-AVR qui est tout
simplement un BASIC de très haut niveau, mais accessible à tous.
Que ce soit en terme de prix, qu'en termes de facilités, et de fiabilité.
Nous vous présentons une application qui regroupe quelques-unes des difficultés majeures
rencontrées avec les microcontrôleurs.
Une pendulette de bureau !
Cette pendulette nous servira par la suite, à utiliser et à comprendre les fonctions des
microcontrôleurs. (mémoire interne ou externe, lecture de phénomènes analogiques,
commande de sorties diverses…) et à découvrir les richesses de ce couple BASIC-BASCOMAVR et Microcontrôleur ATMEL à architecture RISC
Notre première application se compose de :
! Un afficheur graphique, 240*128 (la programmation graphique est ici d'une simplicité
enfantine)
! Un et un seul quartz de 32768 Hz, les microcontrôleurs AVR-ATMEL de la série
ATMEGA ont en effet une référence-horloge interne variable de 1à 8MHz et d'une bonne
stabilité (1%)
! Un microcontrôleur "ENORME" de 32 Ko, avec 4 ports de 8 bits le ATMEGA32. Mais
nous aurions pu utiliser un 16 Ko et même un 8Ko mais dans ce dernier cas le programme
aurait été moins clair, ce n'est pas le but d'une présentation didactique.
! 3 boutons, le bouton de reset est inutile car le reset interne des ATMEGA fonctionne
parfaitement bien.
! Un programme.
Les difficultés :
! Programmation d'un afficheur graphique.
! Vectorialisation des paramètres.
! Calcul des angles en virgules flottantes.
! Utilisation des tableaux de variables.
! Travail sur les variables Date et Time.
! Utilisation des interruptions.
La réalisation:
Nous n'utilisons pas notre carte de programmation STK200+ de KANDA pour ce faire mais
une carte de développement que nous avons mis au point et qui à l'avantage d'être plus simple
et "universelle" autour de ce microcontrôleur. Fichiers Isislite® et .BMP joints
Le transfert des programmes se fait par le port parallèle de l'ordinateur vers les entrées/sorties
SPI, à travers un dongle dont le schéma est donné sur le site www.mcselec.com (voir ISP
programmer) Le tout est connecté via un switch d'imprimante pour laisser l'ensemble
opérationnel.
Analyse du besoin en I/O
L'afficheur graphique est gourmand, le port B est utilisé par les 8 I/O(entrées/sorties) de
données, le port D par les 6 I/O de commandes de ce dernier, les 2 entrées pour les boutons
de réglages, et les 2 entrées pour le quartz de 32KHz (Timer2 asynchrone) sont attribués au
port C. Le port A, non utilisé, est réservé pour les applications futures.
Ce que nous voulons faire
Une pendulette analogique qui donne l'heure sur 12 heures, avec une trotteuse, et afficher la
date, le jour, le quantième et le mois.
Nous avons besoin d'un Timer précis qui nous donne une seconde fiable. Comme le hasard
fait bien les choses, dans toutes les montres ou réveil à quartz qui tombent en panne pour des
raisons essentiellement mécanique, il y a un quartz dont la fréquence est de 32768 Hz.
Pourquoi 32768 ? Divisons ce nombre 15 fois par 2:
32768, 16384, 8192, 4096, 2048, 1024, 512, 256, 128, 64, 32, 16, 8, 4, 2, 1
Ouf ç'a tombe juste ! copiez ce tableau dans un tableur, vous pouvez constater que une
variation de 1Hz ne donnera que 3.10-5 seconde de variation!
La trigonométrie et les horloges analogiques
Le cercle trigonométrique (que c'est loin tout ça !) tourne dans le sens inverse des aiguilles
d'une "horloge analogique" et son origine est à 3 heures, ce qui n'est fait rien que pour nous
embêter…
Rappel :
figure 1
Les axes sinus, cosinus varient de -1 à +1 en passant par le centre A.Quand le point 0(zéro) se
déplace à π/2 il décrit une courbe suivant une fonction SINusoîdal (non linéaire)
Les variables résultantes de ces calculs seront donc tous des variables à virgules flottantes, ce
sont aussi des vecteurs ayant une origine (ici le centre du cadran ) et un sens.
Les cercles seront disposés en fonction de leurs coordonnées en pixel.
Dans la figure 1, aux quatre coins du rectangle, les coordonnées qui apparaissent en italique
sont les coordonnées utilisées par le texte, celles utilisées en graphique sont en pixel.
Nous disposons pour cet afficheur de 16 lignes de 40 caractères pour le texte et de :
128x 240 =30720 pixels pour les dessins. Les unités sont en radians (2 x π =360°), et nous
allons travailler en secondes, minutes et heures, jour, mois! Notre programme va convertir à
tout va !
Comment se décompose un programme BASIC-BASCOM ?
! Une en-tête (facultative mais chaudement recommandée) où sera décrite le programme,
les mises à jour, et tout ce que vous jugez nécessaire à la compréhension de l'application.
Cette partie n'entre pas dans le programme compilé ce sont des remarques - REM. ou '
! Les directives de compilation, signale au compilateur le fichier propre au microcontrôleur,
le cas échéant les bibliothèques, éventuellement la fréquence du quartz et la vitesse de
transmission etc..
! Les déclarations de constantes et variables (obligatoire) ex: Dim pression as byte
! Les déclarations de sous-routines et fonctions que vous créez dans votre programme (si
nécessaire)
! Les déclarations de CONFIG: Un des points forts majeurs de ce BASIC.
Les CONFIG sont des outils fantastiques, voici par exemple celles utilisées dans le
programme:
Config Pinc.0 = Input
' pour préparer la broche 0 du port C à recevoir un 1 ou un 0
Config Pinc.1 = Input
' idem pour la broche 1 on peut aussi configurer le port entier.
Config Graphlcd = 240 * 128 , Dataport = Portd , Controlport = Portb , Ce = 1 , Cd = 4 , Wr =
0 , Rd = 2 , Reset = 3 , Fs = 7 , Mode = 6 ' et voici notre Graphic LCD prêt à recevoir des
données, Les chiffres qui suivent les noms des broches GraphicLCD sont tout simplement les
numéros des broches du port B, sauf Mode=6 qui veut dire 40 caractères, 8=30 caractères…
Config Date = Dmy , Separator = /
' format de présentation de la date et séparateur
Config Clock = Soft
'nous utiliserons la méthode classique avec un quartz, mais il est
possible d'utiliser un timer extérieur (I2C par exemple)
! Puis suit le programme proprement dit.
Nous avons utilisé 8 subroutines et 2 boucles Do…loop imbriquées
Analyse et résolutions des difficultés
! Programmation d'un afficheur graphique.
Avec ce logiciel, il n'y a aucune difficulté à programmer un afficheur LCD graphique, à
condition qu'il soit piloté par un T6963C (il y a aussi une restriction sur la taille : soit 240*64
soit 240*128). Ensuite le texte s'écrit comme avec les LCD classiques :
Exemple : Locate Y,X : LCD "coucou"
Les graphiques se gèrent comme en Basic traditionnel :
Exemple : Line (X1, Y1)-(X2,Y2), couleur
Où couleur est une variable Byte qui n'a que 2 valeurs : 0 efface 225 écrit. Les coordonnées
doivent être des valeurs entières.
Il est possible d'insérer des images Bitmap grâce à l'instruction SHOWPIC X, Y, etiquette
Où etiquette indique l'emplacement du fichier.
! Vectorialisation des paramètres
Cette partie est plus compréhensible si on dispose du programme. Les paramètres sont tous
calculés à partir de l'origine (centreX et centreY), l'origine de l'heure est calculée comme il se
doit à 0 ou midi ! (π/2) ou 90° , l'utilisation de CONSTante facilite le programme, sans
prendre de place en mémoire RAM. Exemple Const Angle=90
! Calcul des angles en virgules flottantes.
Une routine (SUB) de 5 lignes que nous avons prise comme exemple
Sub Anglerad(W As Single)
' calcul des sin et cos des aiguilles
W=W*6
Angle_rad = Angle - W
'Le Basic Bascom ne supporte pas les multiples opérations
Angle_rad = Angle_rad * Pirad
' il faut décomposé mais…
Sinangle = Sin(angle_rad) : Cosangle = Cos(angle_rad) '…il supporte plusieurs instructions
' sur la même ligne
End Sub
! Utilisation des tableaux de variables.
Il était possible de mettre les jours de la semaine et les mois en DATA ou en EEPROM, mais
une autre solution consistait à utiliser des tableaux de variables, un autre point fort du BASIC
BASCOM.
Un tableau se dimensionne de la manière suivante:
Dim jour(7) as string * 8 pour les tableaux de string (variables composées de lettres ou signes
alphanumériques)
Ou encore Dim Temperature(24) as integer ( ou byte, long, single) pour les chiffres.
Le nombre entre parenthèse est appelé index, on parlera de variables indexées.
Elles regroupent sous un même nom des variables qui seront appelées par leur index.
Le nombre d’éléments(index) doit être inférieur ou égal à 65535, l’index 0 n’existe pas.
Par exemple la température en fonction de l’heure :
Dim temperature(24) as integer ‘ les températures peuvent être négatives
Dim J as byte
Temperature(1)=10
Temperature(2)=15
Temperature(3)=portA '
Temperature(J)=20 ‘ J (l’index) est une variable qui ne peut dépasser 24 dans cet exemple !
! Travail sur les variables Date et Time.
Dés que le compilateur rencontre la ligne Config Clock = Soft ; il crée les variables internes
_day, _month, _year, _sec, _min, _hour
Dans notre programme, il ne reste plus qu'a leur assigné la valeur de départ, puis de vérifier
leur état à chaque nouvelle seconde …
! Utilisation des interruptions
Config clock doit être accompagné de la ligne Enable interrupts, c'est à savoir
Si on utilise une ou des interruptions, il ne faut pas utiliser END mais STOP à la fin du
programme, sinon les interruptions sont suspendues ! Les sous-routines sont, par nécessité,
écrites après le END (ou STOP) c'est tout ce qu'il faut connaître.
Matériel utilisé
1 afficheur LCD graphique référence DENSITRON LWM240/128B-EW-WNB
1 Microcontroleur ATMEGA32 Atmel
1 Max232
4 condensateurs 10µF
1 condensateur 400nF
1 condensateur 400µF
2 diodes BAT 85
1 LED
1 7805
1 R 470Ω
4 R 10 KΩ
1 quartz 32768Hz
1 potentiomètre 10KΩ
1 R 15 Ω
7 connecteurs HE10 mâle
7 connecteurs HE10 Femelles
1 connecteur DB9 femelle
1 connecteur femelle (16 contacts) au pas de 2.56 pour l'afficheur
1 connecteur mâle (16 contacts) au pas de 2.56 pour l'afficheur
3 boutons (Reset du µP, Ajustage des paramètres)
Le programme et les CI sont disponibles sur le site…

Documents pareils