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…