Atelier du 15 janvier 2008
La programmation c'est si simple
Préface:
Dans la vie de tous les jours, les êtres vivants prennent des décisions en fonction de leur besoins, de leurs connaissances et de leur habilités. Ce mécanisme est bien différent pour chacun; on peut donc dire que tous ces individus sont "programmés" individuellement. Il existe aussi des fonctions communes à tous; comme respirer, boire, dormir… Ces fonctions produiront le même résultat pour tout les genres d'êtres vivants et seront communes pour une même espèce. Par contre la méthode utilisée par cette fonction sera différente d'une espèce à l'autre. Pour les ordinateurs, les mêmes principes s'appliquent. Nous pourrons leur demander d'accomplir des tâches semblables, comme par exemple, additionner des nombres, mais la méthode utilisée sera différente, d'une famille d'ordinateur à l'autre. (PC, MAC, PIC, logique câblée)
Introduction:
La plupart des ordinateurs, possèdent des unités d'entrée, qui nous permettras de leur transmet- tent nos informations. Ces unités d'entrée varient de la carte perforée, du clavier, du port série, parallèle ou USB. Ces machines sont aussi équipées d'unité de sortie, pour nous transmettent les résultats, comme l'écran cathodique, le port série, parallèle ou USB. Ces deux unités sont appelés I / O (input / output), ou si vous préférer, l'interface usager GUI (graphic user interface). Le programme que nous allons concevoir, devra gérer toutes ces unités, selon le cas et réagir en accord avec notre programme. Ce programme sera chargé et maintenu dans des cases mémoires accessibles par l'unité arithmétique (ALU) qui prendra contrôle de ces unités I / O. La logique ne s'applique pas seulement aux ordinateurs, comme par exemple un thermostat; un contact électrique (bilame) sera programmé mécaniquement pour réagir à la température (unité d'entrée)
et produiras une commande pour actionner un calorifère (unité de sortie). Il tiendra aussi compte de l'ajustement auquel l'utilisateur aura demandé (autre unité d'entrée). Ce programme simple sera facile à dépanner, advenant un problème. Par exemple si le
radiateur ne fonctionne pas; il sera facile de trouver la cause. Est-ce que l'alimentation électrique est présente? Est-ce que le thermostat est réglé adéquatement? Est-ce que la température de la pièce excède l'ajustement? Est-ce que le problème se situe au calorifère? Est-ce que les branchements sont conformes? Cinq questions qui nous permettrons de diagnostiquer le problème et de corriger la situation.
Il s'agit ici d'un exemple simple, pourtant il est essentiel de comprendre la logique derrière ce circuit pour pouvoir le dépanner. Quand vous réaliserai des programmes avec plusieurs I / O , il sera important de bien comprendre les mécanismes en cause et d'écrire vos modules ou partie de programme, en pensant qu'un jour ou l'autre vous devrez le dépanner!!!

                                Tableau 1                                                       Tableau 2

La Logique:

La logique est le mécanisme qui nous permet de prendre des décisions en fonctions des informa- tions que nous possédons. Nous utilisons cet outil inconsciamment dans nos activités de tout les jours. Voici un exemple; vous roulez sur l'autoroute et vous faites une crevaison.

Tableau 3

Comme vous pouvez constater dans le diagramme de la page précédente, chaque élément est considéré, c'est-à-dire que peu importe qui conduit la voiture, où est la crevaison réellement et si vous avez un pneu de rechange! Il est important quand on formule un programme de tenir compte de toutes les éventualités. Ce programme "roule" inconsciemment dans notre tête et les résultats sont les mêmes; la crevaison est réparée. Il est à noter qu'un jeune conducteur, n'ayant jamais été confronté avec ce problème, n'auras sans doute pas cette partie de programme emmagasinée.
La plupart des taches que nous effectuons dans une journée, pourrais être représenté de cette façon. Chacun de nous au travail avons reçu une formation pour effectuer les tâches connexes à notre emploi. Le menuisier à reçu une "programmation" différente du boulanger et du plombier. Cette formation est spécialisée et normalement devrait permettre à l'individu de faire toutes les tâches inclues dans sa spécialisation. Si une tâche nouvelle s'ajoute à ses activités, normalement une période de formation (mise à jour) devrait être effectuée. Il sera de même pour nos programmes, si une condition s'ajoute, si on doit ajouter un tâche nous devrons effectuer une mise à jour du programme. Cette mise à jour peut nous obliger de réécrire le programme entier, ou peut seulement demander l'addition d'un module (fonctions ou sous-routines)
Il est toujours préférable de concevoir nos programmes de façon modulaire, ils seront plus faciles à modifier si le besoin se présente. Si ont prends comme exemple le système d' exploitation DOS (Disk Operating System), il est composé essentiellement de petites parcelles de code machine, qui effectuent une seule et unique tache, comme lire le clavier, afficher à l'écran, lire ou écrire sur le disque dur. Un programme écrit pour ce système d'exploitation, utilisera les fonctions et sous-routines incluses dans ce système. Si on change le système d'exploitation il est possible que le programme refuse de fonctionner, car il appelle des fonctions modifiées ou inexistantes. Depuis l'introduction du DOS dans les années quatre-vingt, plusieurs version se sont succédées 2.0, 3.0, 3.2, 3,3, 6.2 et dans la série Windows qui se voulait une réponse à MacIntosh (Apple) on a Windows 3.1, 4.11, Win 95, Win 98, Win 2000, Win ME, Win XP et Win Vista. Chacune de ces versions étaient plus ou moins "compatibles", c.-à-d. que certains programmes pouvaient être utilisés avec plusieurs versions, mais éventuellement ils devaient être réécrits. Les routines incluses dans les versions DOS étaient compatibles entre elles, donc un programme écrit pour DOS 3.0 pouvait rouler sur DOS 6.2, mais l'inverse n'est pas garanti. Cela s'explique par le fait que les nouveaux programmes écrit spécifiquement pour DOS 6.2, avait besoin de certaines fonctions incluses seulement dans DOS 6.2. Les systèmes d'exploitation qui arrive à maturité, sont généralement plus volumineux que leurs prédécesseurs, car ils contiennent plus de fonctions. La première version était contenue sur une disquette de 360 kilo-octets et les dernières prenait près de quatre méga-octets. Nos programmes suivront le même processus, un programme simple sur PIC utiliseras quelques centaines d'octets et éventuellement quelques kilo-octets.
Nous verrons dans les chapitres qui suivent comment générer des programmes de façon modulaire et comment les adapter à nos besoins.
Le Matériel:
Chaque ordinateur, microprocesseur, PIC est composé d'un minimum d'organes internes.
     - Une unité d'entrée
     - Une unité de contrôle CPU
     - Une banque de mémoire
     - Un Accumulateur (calculs)
     - Une unité de sortie
Ces unités sont essentielles pour communiquer avec nous et accomplir un travail. Si on retourne à la petite école, votre enseignant vous demande d'aller au tableau et d'additionner 147 et 332, vous inscrivez les deux nombres au tableau, un en dessous de l'autre, en prenant soin d'aligner les centaines, les dizaines et les unités et vous tracez une ligne sous le deuxième chiffre. Vous procéder ensuite à l'addition elle-même, en commençant comme on vous l'a appris par les unités, 7 + 2 = 9, vous inscrivez donc 9 sous la colonne des unités. Vous faites la même opération avec les dizaines et les centaines et vous obtenez le résultat, soit 479, il ne vous reste qu'a donner le résultat à votre enseignant; 479.
Regardons en détails les opérations que vous avez accomplies. En premier lieu vous avez écouté, dès que votre nom à été mentionné, vous avez commencé à "enregistrer" ce que votre enseignant vous demandait, Additionner (une instruction), 147 (une donnée) et 332 (autre donnée). Pour réussir cet exploit, vous vous êtes servi de vos oreilles, une unité d'entrée. Par la suite vous vous êtes souvenu comment traiter l'instruction "Addition", vous avez inscrit les nombres au tableau en colonnes et tracé une ligne sous le deuxième chiffre. L'ordinateur doit effectuer la même tâche, additionner des nombres, il doit donc savoir comment, ces instructions seront accomplies par l'unité de contrôle (CPU). Le tableau dans ce cas ci peut-être vu comme une unité mémoire, il conservera les données pour une utilisation ultérieure. Ensuite vous avez effectué l'addition des nombres dans votre cerveau, l'ordinateur aura besoin aussi d'une unité de calcul; c'est l'accumulateur. Les résultats des trois additions ont étés inscrites au tableau, donc dans une case mémoire. Finalement, fier de votre exploit, vous avez donné la réponse à votre enseignant, et lisant a haute voix le résultat 479, notre ordinateur aura besoin aussi d'une unité de sortie pour nous communiquer le résultat.
Vous remarquerai que l'instruction "Additionner" était déjà connue par l'unité centrale (CPU), il savait donc comment effectuer cette opération. En effet les systèmes ordinés ont déjà quelques fonctions de base programmée à l'intérieur de leurs circuits. L'addition est une de ces fonctions, comme la soustraction et des fonctions logique incluant le ET, OU, INVERSE pour ne nommer que ceux-là. Les instructions plus complexes comme la multiplication et la division ne sont que rarement incluses, nous devront donc écrire ces fonctions nous même, selon nos besoins.
Si vous regardez la figure 1 (page 1), vous verrez l'agencement des unités composant un
système ordiné. À gauche vous remarquerez l'unité d'entrée qui est relié par une flèche unidirectionnelle vers l'ALU. Cette flèche représente un "BUS" de données qui peut contenir 8, 16, ou 32 "bits" d'information. Le même type de "BUS" relie l'ALU et l'unité de sortie. Ces flèches sont unidirectionnelles car l'information circule dans une seule direction. Par contre le "BUS" qui relie la mémoire et l'ALU est bidirectionnel, car nous auront besoin de lire et d'écrire dans la mémoire.
Au diagramme de la figure 1, l'unité de contrôle CPU n'est pas représenté, car il contrôle chacun des autres unités, il fait donc partie, de l'unité d'entrée, de l'unité de sortie et de l'ALU. Il contrôle aussi les "BUS" internes et conserve des informations sur le système dans des cases mémoires spéciales appelées registres. Le CPU peut aussi avoir un "BUS" de contrôle plus large que le "BUS" de donnée, par exemple dans un PIC, le "BUS" de contrôle est de quatorze bits au lieu de huit.
Des Maths:
Nous utilisons pour nos calculs le système décimal (base 10), probablement à cause que nous possédons dix doigts! Nous avons des symboles pour représenter la valeur que peut prendre un "digits" soit ; 0, 1, 2, 3, 4, 5, 6, 7, 8 et 9. Les ordinateurs eux ne peuvent que représenter que deux états stable; 0 ou 1. Ce système est appelé binaire (base 2) et la plus petite information est appelé "bits". Quand ces bits sont combinés par paquets de huit, la largeur d'un "BUS", ces paquets porte le nom d'octets (bytes). Si le "BUS" est plus large ces paquets s'appelleront mots (16 bits, "word") ou double (32 bits, "double"). Il existe aussi un terme anglais pour désigner un ensemble de quatre bits ; "nibble" qui se traduirait par "small bite" ou grignoter dépendamment du dictionnaire utilisé! Cet ensemble de 4 bits est la base du système hexadécimal, (base 16) qui utilisera les symboles;        0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E et F.
Dans notre système décimal, la position occupé par un "digit" changeras sa valeur, comme par exemple dans le chiffre 147, le un représente les centaines 10², le quatre représente les dizaines 10¹ et le sept les unités 10°. Il est sera de même pour les autres systèmes. Donc si ont écris 101 en binaire, le premier un représente 4 (2²) le zéro représente 0 (2¹) et le dernier un représente 1 (2°) donc le chiffre 5 (4+0+1). Voici un petit tableau récapitulatif;

Tableau 4

Si dans notre système décimal, un nombre de trois "digits", peut avoir 1000 (10³) valeurs différentes soit de 000 à 999, il en sera de même pour les autres systèmes de numérotation. Un octet composé de huit "bits" aura 256 valeurs possible; de 00000000 à 11111111 ou si vous préférez de 0 à 255. Comme dans le système décimal, les zéros précédents la valeur ne sont pas obligatoires, donc ils peuvent être omis. En d'autres mots si vous avez gagné $ 0000000000000010.00 à la loterie, il serait préférable de garder votre emploi!
Voici un petit tableau indiquant quelques valeurs utiles: Il indique le nombre de combinaisons possibles en utilisant, un nombre déterminé de "bits", ou largeur de "BUS".
Si nous prenons l'exemple d'un bus de 16 bits, il y a 65536 possibilités, nous pourrons représenter des valeurs atteignant 65535, le zéro étant une des 65536 combinaisons.
Les variables que l'on utilisera dans nos programmes seront affectés par ces valeurs maximums. Nos variables doivent aussi représenter des nombres négatifs, donc une partie de ces combinaisons doivent représenter des nombres négatifs. La plupart des systèmes ordinés utilisent le "bit" de gauche, appelé MSB (most significant bit) pour indiquer que nous somme en présence d'un nombre négatif. Cette variable de seize bits pourra prendre des valeurs de -32768 à +32767. Nous reviendrons sur ce sujet quand nous étudierons les variables.
Quand nous écrivons des chiffres binaires, nous sommes obligés de placer une série de uns et de zéros, dans une suite logique, qui sont difficile à lire, c'est pourquoi nous
utiliseront la notation hexadécimale pour nous faciliter la tâche. Prenons un chiffre au hasard, 10940 en binaire il s'écrirait; 10101010111100, vous avouerez que ce n'est pas très pratique et qu'il peut se glisser facilement une erreur. La représentation hexadécimale nous permettras de grouper ces bits de façon plus conviviale. Commençons par les bits moins significatifs LSB (least significant bit), situé à l'extrême droite de notre nombre binaire. Nous trouvons 1100 , ce "nibble" peut être écrit en hexadécimal  "C". Nous continuons cette méthode jusqu'au MSB pour obtenir finalement 2ABC.
Cette façon de représenter les nombres sont tous équivalentes, mais certaines sont plus faciles à lire que d'autres. Comme la plupart du temps nous utilisons des "BUS" de huit bits dans nos ordinateurs, nous utiliserons la forme hexadécimale majoritairement.
00 - 00
01 - 01
02 - 02
03 - 03
04 - 04
05 - 05
06 - 06
07 - 07
08 - 08
09 - 09
10 - 0A
11 - 0B
12 - 0C
13 - 0D
14 - 0E
15 - 0F
16 - 10
17 - 11
18 - 12
19 - 13
20 - 14
21 - 15
22 - 16
23 - 17
24 - 18
25 - 19
26 - 1A
27 - 1B
28 - 1C
29 - 1D
30 - 1E
31 - 1F
32 - 20
33 - 21
34 - 22
35 - 23
36 - 24
37 - 25
38 - 26
39 - 27
40 - 28
41 - 29
42 - 2A
43 - 2B
44 - 2C
45 - 2D
46 - 2E
47 - 2F
48 - 30
49 - 31
50 - 32
51 - 33
52 - 34
53 - 35
54 - 36
55 - 37
56 - 38
57 - 39
58 - 3A
59 - 3B
60 - 3C
61 - 3D
62 - 3E
63 - 3F
64 - 40
65 - 41
66 - 42
67 - 43
68 - 44
69 - 45
70 - 46
71 - 47
72 - 48
73 - 49
74 - 4A
75 - 4B
76 - 4C
77 - 4D
78 - 4E
79 - 4F
80 - 50
81 - 51
82 - 52
83 - 53
84 - 54
85 - 55
86 - 56
87 - 57
88 - 58
89 - 59
90 - 5A
91 - 5B
92 - 5C
93 - 5D
94 - 5E
95 - 5F
96 - 60
97 - 61
98 - 62
99 - 63
100 - 64
101 - 65
102 - 66
103 - 67
104 - 68
105 - 69
106 - 6A
107 - 6B
108 - 6C
109 - 6D
110 - 6E
111 - 6F
112 - 70
113 - 71
114 - 72
115 - 73
116 - 74
117 - 75
118 - 76
119 - 77
120 - 78
121 - 79
122 - 7A
123 - 7B
124 - 7C
125 - 7D
126 - 7E
127 - 7F
128 - 80
129 - 81
130 - 82
131 - 83
132 - 84
133 - 85
134 - 86
135 - 87
136 - 88
137 - 89
138 - 8A
139 - 8B
140 - 8C
141 - 8D
142 - 8E
143 - 8F
144 - 90
145 - 91
146 - 92
147 - 93
148 - 94
149 - 95
150 - 96
151 - 97
152 - 98
153 - 99
154 - 9A
155 - 9B
156 - 9C
157 - 9D
158 - 9E
159 - 9F
160 - A0
161 - A1
162 - A2
163 - A3
164 - A4
165 - A5
166 - A6
167 - A7
168 - A8
169 - A9
170 - AA
171 - AB
172 - AC
173 - AD
174 - AE
175 - AF
176 - B0
177 - B1
178 - B2
179 - B3
180 - B4
181 - B5
182 - B6
183 - B7
184 - B8
185 - B9
186 - BA
187 - BB
188 - BC
189 - BD
190 - BE
191 - BF
192 - C0
193 - C1
194 - C2
195 - C3
196 - C4
197 - C5
198 - C6
200 - C8
201 - C9
202 - CA
203 - CB
204 - CC
205 - CD
206 - CE
207 - CF
208 - D0
209 - D1
210 - D2
211 - D3
212 - D4
213 - D5
214 - D6
215 - D7
216 - D8
217 - D9
218 - DA
219 - DB
220 - DC
221 - DD
222 - DE
223 - DF
224 - E0
225 - E1
226 - E2
227 - E3
228 - E4
229 - E5
230 - E6
231 - E7
232 - E8
233 - E9
234 - EA
235 - EB
236 - EC
237 - ED
238 - EE
240 - F0
241 - F1
242 - F2
243 - F3
244 - F4
245 - F5
246 - F6
247 - F7
248 - F8
249 - F9
250 - FA
251 - FB
252 - FC
253 - FD
254 - FE
255 - FF

Tableau 7