Comparaison Calm – C – Basic
Transcription
Comparaison Calm – C – Basic
CH-1092 Belmont, Switzerland Tel +41 21 728-6156, Fax 728-6157 Email [email protected], www.didel.com www.didel.com/pic/CompareCalmCBasic.pdf Comparaison Calm – C – Basic Quel est l’objectif ? Découvrir la programmation ? Se préparer pour des applications, et de quel type ? L’apprentissage d’un langage facilite pour apprendre le suivant. Quel microcontrôleur ? Le choix du microcontrôleur influence-t-il le langage ? Quel coût pour démarrer, pour faire une application complexe ? Quel équipement annexe ? Choix du microcontrôleur C’est avant tout un choix affectif, qui dépends de ses amis, de la facilité pour se procurer l’environnement de développement. Microchip PIC Atmel AVR Basic Stamp, 8051, HC11, Z80, ARM, MSP420 Famille très large pour les très Famille large avec les TinyAvr et petites applications avec les les AVR. Architecture plus riche Le Stamp est facile à mettre en familles 12F et 16F, et des que pour le PIC, donc œuvre et très facile à programmer. performances intéressantes avec assembleur plus difficile à Mais il est relativement cher. les familles 18F, 24F, 33 maîtriser. Le C est exclusivement Les familles 8051, HC11 et Z80 ont L’assembleur CALM permet de utilisé, et l’insertion de modules encore leurs fans, mais il y a peu de programmer efficacement les en assembleur délicate. modèles. Le MSP430 est très apprécié pour 12F 16F. Le compilateur C de Microchip est gratuit et préféré sa faible consommation et une jolie avec les familles 18F etc. architecture. Choix du langage et de l’outil de développement Tous les langages et outils ont des avantages et inconvénient. Sans expérience d’outils similaires, il faut choisir des outils connus par des amis prêt à répondre à vos questions. Le Stamp n’est pas mentionné dans la liste ci-dessous. L’environnement et la documentation est parfaite, mais le domaine d’application est trop limité pour le prix. L’environnement de développement Basic MicroCode Studio est très bien, mais sa version d’évaluation est trop limitée. Il existe plusieurs compilateurs basic. Les exemples ci-dessous sont fait avec le logiciel libre GCBasic, voir gcbasic.sourceforge.net/ Calm, SmileNG et Pickit2 AVR-Studio, Dragon, Arduino Microchip C et ICD voir www.didel.com/picg/smileng/ voir www.atmel.com studio4 voir www.microchipc.com Cet environnement est trop Le compilateur professionnel est L’environnement SmileNG et complet pour un débutant sans maintenant gratuit. Apprécié par l’assembleur CALM, développé aide extérieure. Les erreurs sont ceux qui le connaissent bien, pour l’enseignement, est très relativement difficile pour un facile et efficace. Couplé avec le difficiles à interpréter. Un seul projet peut être ouvert à la fois. débutant. Pickit2, les cycles de correction Le programmateur ICD permet de Le dévermineur est très utile d’erreurs et ajustement des paramètres sont très rapides. pour les applications sans faire de l’In-Circuit Emulation et programmer le PIC. Le Pickit2 est Les erreurs sont clairement contraintes de temps réel. aussi utilisable. mises en évidence. Idéal pour Programmateur Dragon oblige des petites applications en temps aussi à beaucoup de click pour réel, et pour comprendre les programmer (65.-) microcontrôleurs en profondeur. Les cartes Arduino sont Plusieurs programmes peuvent supportée par un C qui connaît la être en travail simultanément. Le programmateur Pickit2 est carte, ce qui facilite la mise en très facile et efficace (65.-). Il œuvre (www.arduino.cc/) joue aussi le rôle d’un adaptateur USB-UART et celui d’analyseur logique à 3 canaux. Analyse comparative Pour se faire une idée des points communs et différences (dans les notations et la philosophie), deux exemples sont traités ci-dessous. Les exemples pour AVR doivent se transporter sur Microchip-C sans trop de modifications. Programme 1 : clignoter une LED Titre et description du programme /* Fichier Clignote.c Clignote la LED du Bimo */ SmileNG reconnaît 10 ordres de // Commentaire d’une ligne mise en page qui augmentent /*************************** considérablement la lisibilité. Commentaire de L’impression sur 1-4 colonnes plusieurs lignes permet d’avoir un gros ***************************/ programme sur quelques pages et de repérer un module facilement ' Fichier Clignote.txt ' BUT: ' Clignoter la LED du Bimo Déclaration du processeur et de sa configuration (oscillateur, watch-dog, etc) Calm AVR-C et Arduino Basic .Proc 16F630 Le processeur se déclare lors de #chip 16F630, 4 #config , wdt_off, pwrte_off, .Ref 16F630 la création du projet. ; La configuration est donnée a la La configuration est donnée lors boden_off fin du programme, elle sera de la programmation. On ne peut utilisé par le programmateur pas déclarer l’un et l’autre dans ‘ tout au début, c’est le plus simple .Loc 16’2700 le source du programme – il est sage de le mettre toutefois en .16 16'3F94 commentaire. MicrochipC déclare tout dans le programme (comme dans le Basic à droite). Selon le langage et les habitudes du programmeur, l’ordre des déclaration n’est pas toujours celui donné ci-dessous, choisi pour faciliter les comparaisons. Déclaration des variables // Variables \var; A déclarer au début CX1 = 16'20 ; Compteurs pour int duree=1000 ; // déclare et assigne Les variables sont souvent ; le délai déclarées dans le programme CX2 = 16'21 CX3 = 16'22 Déclaration des ports et constantes \const:PortA // Constantes Rouge = 2'010000 #define Rouge 0b000001 Vert = 2'100000 #define Vert 0b000010 Eteint = 2'000000 #define Eteint 0b000000 DirA = 2'001111 #define DirB 0b111111 Initialisations .Loc 0 Move #DirA,W Move W,TrisA #include <inttypes.h> #include <avr/io.h> 'Déclaration des variables dim delai as Word ' décompte la durée clignotement ‘ Ports et constantes ! en décimal Vert = 32 Rouge = 16 Eteint = 0 DirA = b'000000' ‘(exceptionellement en binaire) Dur = 500 'durée 500 us TRISA = DirA Sur microchip @include "inpic.h" int main () { DDRB = DirB ; Programme principal Loop: Move #Vert,W Move W,PortA Move #DureeOn,W while (1) { PORTB = Rouge; Loop: PortC=Vert Pause Dur ' durée en ms Call Delai Move #Rouge,W Move W,PortA Move #DureeOn,W Call Delai Move #Eteint,W Move W,PortA Move #DureeOn,W Call Delai Jump Loop Routines \rout;Delai en 0.1 sec \in;W délai de 0.1s à 25s \mod: W CX1 CX2 CX3 Delai: Move W,CX3 B$: Move #100,W ; pour 100ms= 0.1s Move W,CX2 A$: Nop ; Boucle de 1ms DecSkip,EQ CX1 Jump A$ DecSkip,EQ CX2 Jump B$ DecSkip,EQ CX3 Ret Binaire delay(Duree); PORTB = Eteint; delay (Duree); } } PortC=Rouge Pause Dur PortC= Eteint Pause Dur Goto Loop Avec l’environnement Arduino, il suffit d’écrire une procédure setup, qui s’exécute une fois au début, et une procédure loop, qui s’exécute en permanence. La procédure delay existe dans l’environnement Arduino, sinon il faut l’écrire, par exemple : pause est une routine du compilateur avec comme délai une valeur de 1 à 65000 millisecondes. void Delai (int duree) { unsigned int i; volatile int j; for (i=0; i<duree; i++) { for (j=0; j<500; j++); } } Avec la compilation, en mode Os, le programme a 284 bytes : -162 pour les indirections des Le programme a 16’18 =24 bytes interruptions et la gestion des variables (toujours présent) - 86 pour la procédure Delai (!) - 36 pour le programme principal. Le programme a environ 170 bytes Erreurs Les erreurs de syntaxe et fautes d’orthographe (et de casse sous GNU/Linux) sont fréquentes. Les compilateurs signalent ces erreurs et donne parfois des avertissement qui ne sont pas des erreurs, mais sont signes d’une programmations inexpérimentée. SmileNG est vraiment confortable en signalant les erreurs dans le source. Le message d’erreur n’a pas besoin d’être effacé après correction de l’erreur. Cacher le bas niveau Enmettant dans un ou plusieurs fichiers des définitions, macros, procédures, qui sont importées, la programmation est beaucoup plus claire. On importe des fichiers dont la complexité est cachée, mais la fonctionnalité dans le programme principalest mise en évidence par des noms bien choisis. Le programm ci-dessus peut s’écrire : .Ins BimoDef.asi L’environnement Arduino cache ?? .Ins BimoVar.asi .Loc 0 Call Init Loop : Vert Delai 5 Rouge Delai 5 Eteint Delai 5 Jump Loop .Ins le bas niveau: // Le projet s’appelle Bimo #define Rouge 0b000001 #define Eteint 0b000000 #define DirA 0b111111 void setup () { DDRB = DirB; } BimoRout.asi void loop () { unsigned int Duree = 500; PORTB = Rouge; delay (Duree); PORTB = Eteint; delay (Duree); } A noter que si le programme se complique, on garde un programme principal très simple et lisible. Le nombre et la complexité des modules insérés augmente, et la modularité permet de réutiliser des modules insérés dans d’autres programmes. -------------- sera supprimé ( ?) -------------- Programme 2 : faire tourner deux moteurs pas-à-pas Titre et description du programme \prog ;Polygone.asm /* Fichier Polygone.h \b ;Dessine un polygone Fait avancer le robot puis le fait tourner sur lui-même */ .Proc 16F870 .Ref 16F870 ; al la fin ' Fichier Polygone.txt ' Fait avancer le robot puis ‘ le fait tourner sur lui-même #chip 16F870, 4 #config xt_osc, wdt_off, pwrte_off, boden_off, lvp_off, cpd_off, wrt_enable_on ‘ Variables dim du as Word dim i as Word ‘décomptage ‘ durée des pas 'nbre pas de ‘ la boucle dim b0 as Byte ' --- temp ne doit pas être déclaré ?? ‘ Constantes du = 1500 'durée entre les pas Init: TRISC = b'00000000' PortC = 0 main: Gosub marche_av pause 500 Gosub pivot_droite pause 500 goto main END StepAv: Inc PtStep Move #-6,W Add PtStep,W Skip,NE Clr PtStep Move PtStep,W Add W,PCL tt _Pos1 tt _Pos2 tt _Pos3 tt _Pos4 tt _Pos5 tt _Pos6 3–B–8–C- 4–7 int Toto[10] = {1, 2, 6, 5, 2, 1, 9, 8, 1, 5}; int Indice; for (Indice = 0; Indice < NB_ELEMENT_TOTO; Indice++) { Toto[Indice] = 0; } marche_av: For i = 1 To du For b0 = 1 To 6 'table lue première valeur en premier ReadTable av_ar, b0, Temp PORTC = Temp wait 1 ms Next b0 Next du Return pivot_droite: For i = 1 To du For b0 = 6 To 1 step - 1 'table lue derniére valeur en premier ReadTable ga_dr, b0, Temp PORTC = Temp wait 1 ms Next b0 Next du Return ‘ Les deux moteurs dans le ‘ même sens Table av_ar 153 ' 16'99 2'10011001 187 ' 16'BB 34 ' 16'22 102 ' 16'66 68 ' 16'44 221 ' 16'DD End Table ‘ Les deux moteurs en ‘ sens inverse Table ga_dr 157 180 38 98 75 217 End Table jdn 090210