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

Documents pareils