Outils pour utilisateurs

Outils du site


issue128:tutoriel2

In the first article, I introduced Great Cow BASIC and how you can flash an LED just by switching it on and off in a loop and let the microcontroller do nothing more. This time, I want to show a more elaborate version – how to get the LED to flicker or fade. If I can manage the software pieces together by the end of all these articles, I will present a version of a light reactive night light with power-saving techniques. But, before this. I want to get a text editor with syntax highlighting for ease of use. Geany is a lightweight text editor with syntax highlighting, and, in my opinion, is very comfortable to use with Great Cow BASIC. Install it with: sudo apt install geany Now, open it from your start menu. First, we get Geany to handle Great Cow BASIC code as FreeBASIC code. Most of the Great Cow BASIC syntax then gets highlighted. This works good for me. Edit the filetype_extensions.conf under “tools - configuration files”, lookup the entry for FreeBASIC, and add “;*.gcb” (line 32 in the image above).

Dans le premier article, j'ai présenté Great Cow BASIC et comment vous pouvez faire clignoter une LED en l'allumant et en l'éteignant dans une boucle et en ne donnant rien de plus à faire au microprocesseur.

Cette fois-ci, je veux montrer une version plus élaborée : comment obtenir qu'une LED vacille ou s'estompe. Si je peux regrouper les morceaux de logiciels à la fin de ces articles, je présenterai une version d'un éclairage de nuit réactif à la lumière avec des techniques d'économie d'énergie.

Mais, avant cela, je veux obtenir un éditeur de texte avec la coloration syntaxique pour la facilité d'utilisation. Geany est un éditeur de texte léger avec la coloration syntaxique qui, à mon avis, est très confortable à utiliser avec Great Cow BASIC. Installez-le avec :

sudo apt install geany

Maintenant, ouvrez-le à partir de votre menu démarrer. D'abord, vous obtenez de Geany qu'il gére Great Cow BASIC comme du code FreeBASIC. La plupart de la syntaxe de Great Cow BASIC sera alors colorée. Ceci fonctionne bien pour moi. Éditez filetype_extensions.conf sous « Outils - Fichiers de configuration », cherchez la ligne pour FreeBASIC et ajoutez « ;*.gcb » (ligne 32 dans l'image ci-dessus).

Afterwards, open up the menu “build - set build commands”, and change the compile command to gcbasic /O:”%e”.hex /A:GCASM /V /NP “%f” which then compiles the input file (%f means file with file extension, e. g. blink.gcb) to the output file blink.hex (%e means filename without file extension). If the verbose output from the compiler bothers you, you can safely omit the “/V” parameter. The “/NP” parameter means that the Great Cow BASIC compiler does not wait for user input and is important for its use with geany, otherwise the compiler gets stuck. To flash the compiled programs to your microcontroller (assuming the ArduinoISP is used) from geany, you could change the build command to flash AVR: avrdude -p t13 -c avrisp -P /dev/ttyACM0 -b 19200 -U flash:w:”%e”.hex This way, the compiled program gets right into your microcontroller. Beware: After those steps, the build parameters for FreeBASIC are overwritten, maybe it would be a good idea to save the original parameters somewhere to recover. Just in case you are about to write FreeBASIC source code in Geany as well.

Ensuite, ouvrez le menu « Construire - Définir les commandes de construction » et changez la commande de compilation pour :

gcbasic /O:”%e”.hex /A:GCASM /V /NP “%f”

qui compile alors le fichier d'entrée (%f signifie fichier avec une extension, par exemple blink.gcb) vers le fichier de sortie blink.hex (%e indique un nom de fichier sans extension). Si la sortie verbeuse du compilateur vous ennuie, vous pouvez sans risque omettre le paramètre /V. Le paramètre « /NP » signifie que le compilateur de Great Cow BASIC n'attend pas de saisie de l'utilisateur et c'est important dans son utilisation avec geany, autrement le compilateur se bloque. Pour flasher les programmes compilés sur votre microcontrôleur (en supposant que l'ArduinoISP soit utilisé) à partir de geany, vous pourriez changer la commande de construction pour flasher l'AVR :

avrdude -p t13 -c avrisp -P /dev/ttyACM0 -b 19200 -U flash:w:”%e”.hex

De cette façon, le programme compilé ira immédiatement dans votre microprocesseur. Attention : après ces étapes, les paramètres de construction pour FreeBASIC sont écrasés ; aussi, c'est une bonne idée de sauvegarder quelque part les paramètres d'origine pour pouvoir les restaurer. Juste au cas où vous écririez aussi du code source FreeBASIC dans Geany.

Dimming LED As a starting point, I introduced source code for a merely flickering LED. If you plan to create a program for a morse flasher or some kind of indicator light, this would be all there is to do. But, to fade a LED there is a bit more work to do. As the microcontroller only delivers digital signals which mean on / off - a different method is necessary to dim a LED. The LED has to be driven with fast and short pulses of current which tricks the human eye so that it recognize the LED brighter or darker (see ref. No. 2 for a detailed explanation). ‘Out of the box’ Great Cow BASIC offers 3 different Pulse Width Modulation (PWM) methods for Atmel AVR: • a software PWM , • a fixed mode PWM, and • a hardware PWM based on the Atmel AVR Timer0. We can use either the software PWM or the hardware PWM modes. To set the hardware PWM for yourself, you would have to set the registers of the microcontroller yourself, at this time this is out of scope - maybe at a later point it could be necessary to squeeze out the last byte of the microcontroller's flash memory. If you have instant demand for tweaking please refer to the datasheet.

LED à éclairage variable

Pour commencer, j'ai présenté le code source pour une LED qui ne fait que vaciller. Si vous envisagez la création d'un programme pour une lampe flash pour le morse ou pour un indicateur lumineux, ce sera tout ce qu'il y aura à faire. Mais faire varier la luminosité d'une LED nécessite un peu plus de travail. Comme le microcontrôleur ne délivre que des signaux digitaux, c'est-à-dire allumé/éteint, une méthode différente est nécessaire pour faire s'estomper l'éclairage d'une LED. La LED devra être pilotée avec des impulsions de courant rapides et courtes qui abusent l'œil humain de sorte qu'il voit la LED plus ou moins brillante (voir la ref. n° 2 pour une explication détaillée). Dès l'installation, Great Cow BASIC offre 3 méthodes différentes de Modulation de largeur d'impulsion (PWM - Pulse Width Modulation) pour l'AVR Atmel.

• un PWM logiciel, • un PWM en mode fixe, et • un PWM matériel basé sur le temporisateur Timer0 de l'AVR d'Atmel.

Nous pouvons utiliser les modes PWM, soit logiciel, soit matériel. Pour paramétrer le PWM matériel pour vous-même, vous devrez régler les registres du microcontrôleur ; ceci est en dehors de notre sujet actuellement , mais, peut-être à un moment futur, il pourrait être nécessaire de supprimer le dernier octet de la mémoire flash du microcontrôleur. Si vous avez une demande pressante, référez-vous à la feuille de données.

The software PWM switches the given channel with the required amount of current for the given number of cycles (called the duty cycle). Since the duty cycle is defined as a byte value, the duty cycle would be between 0 and 255, think of it like this: 255 means 100 % current, 127 would be around 50 % current and so on. The number of cycles defines the number of pulses of the software PWM and defines how long the LED is dimmed. Although instantly repeated while in the main loop, the higher the cycles the smoother it will look. With the software PWM you can light up an arbitrary number of LEDs – contrary to the hardware PWM which is limited to the channels it is linked to. But it’s at the cost that all is software calculated, and the microcontroller is busy while the LED is lit. With the following code you can set up a randomly flickering LED with software PWM. The Setup of the software PWM is easy; you define one or more PINs used as a PWM channel. Then, the LED lights up at random brightness and goes off after the delay. This first result looks like an unsteady flickering candle; with refinements to the code it will look a bit smoother. We will come back to this point later.

Le PWM logiciel commute le canal donné avec la quantité requise de courant pour un nombre défini de cycles (appelé le rapport cyclique). Comme le rapport cyclique est défini par une valeur en octets, il sera entre 0 et 255 ; pensez à ceci : 255 signifie 100 % du courant, 127 sera environ 50 % du courant et ainsi de suite. Le nombre de cycles définit le nombre d'impulsions du PWM logiciel et définit le niveau d'éclairement de la LED. Bien qu'il soit répété en permanence dans la boucle principale, plus les cycles sont hauts, plus la lumière paraît douce. Avec le PWM logiciel, vous pouvez éclairer un nombre arbitraire de LED, contrairement au PWM matériel qui est limité aux canaux auxquels il est relié. Mais le prix en est que tout est calculé dans le logiciel, et le microcontrôleur est occupé tant que la LED est allumée. Avec le code suivant, vous pouvez paramétrer une LED à clignotement aléatoire par un PWM logiciel.

Le paramétrage du PWM logiciel est facile : vous définissez une ou plusieurs bornes utilisées comme canaux PWM. Puis, la LED s'allume à une luminosité aléatoire et s'éteint après un délai. Le premier résultat ressemble à une bougie à la flamme tremblotante ; avec des améliorations du code, elle semblera un peu plus calme. Nous reviendrons sur ce point plus tard.

The hardware PWM, on the other hand, works similarly but uses hardware circuitry within the microcontroller to generate the required on/off pulses. The frequency and the duty cycle of the fixed mode PWM (ref. No. 6) can be set only once in the program out-of-the-box. This mode could be useful for applications where you want to light a LED at a constant level , or for other purposes which need a constant powerage. This can be changed, but you must change it within the source code. For dimming the LED, we want to change at least the duty cycle. Instead of calculating the timings in software, there is an oscillator in the Atmel microcontroller which gives the timing for the pulses. The attiny13a has one 8-bit Timer with 2 channels for hardware PWM. One channel ‘ OC0A’ is not available for hardware PWM because it is sacrificed for other usages, eg, the pseudo random number generator. But the channel ‘OC0B’ can be used for hardware PWM and thus for dimming a LED. The hardware PWM that comes predefined with Great Cow BASIC uses the fast PWM mode of the attiny13a (see chap. 11.7.3 in ref. No. 5 for details). In short: it means the timer counts from 0 to 255, falls back to 0, and repeats until the timer is stopped. The frequency of the oscillator is calculated from the internal frequency of the attiny13a. The microcontroller frequency is actually set to 1.2 MHz, which means the hardware PWM can be driven at frequencies of 1.2 MHz, 150 kHz, 18 kHz, 4 kHz and 1 kHz (rounded to full kHz). The speed is dependent of the microcontroller’s frequency. When using the hardware PWM, the microcontroller drives the LED independently which means that other tasks can be processed virtually in parallel. If you want a fixed PWM for the LED, then you can set up the PWM this way (top right).

En revanche, le PWM matériel fonctionne d'une façon similaire, mais utilise les circuits matériels du microcontrôleur pour générer les impulsions marche/arrêt nécessaires. La fréquence et le rapport cyclique du mode PWM fixe (ref n° 6) ne peut être paramétré qu'une seule fois dans le programme disponible à l'installation. Ce mode peut être utile pour des applications où vous voulez allumer une LED à un niveau constant, ou pour d'autres usages qui nécessitent une alimentation constante. Ceci peut être modifié, mais vous devez le changer dans le code source.

Pour régler la luminosité d'une LED, mous voulons au moins changer le rapport cyclique. Plutôt que de calculer les temps dans le logiciel, un oscillateur existe dans le microcontrôleur Atmel qui donne le tempo pour les impulsions. Le attiny13a a un temporisateur 8-bit avec 2 canaux pour du PWM matériel. Un canal « OC0A » n'est pas disponible pour le PWM matériel car il est consacré à d'autres utilisations, par ex., la génération de nombre aléatoire. Mais le canal « OC0B » peut être utilisé pour du PWM matériel et donc pour faire varier une LED. Le PWM matériel qui arrive prédéfini avec Great Cow BASIC utilise la mode de PWM rapide du attiny13a (voir le chap. 11.7.3 de la ref. n°5 pour les détails). En bref : cela signifie que le temporisateur compte de 0 à 255, revient à 0 et recommence jusqu'à ce qu'il soit arrêté. La fréquence de l'oscillateur est calculée à partir de la fréquence interne du attiny13a. La fréquence réelle du microcontrôleur est réglée à 1,2 MHz, ce qui signifie que le PWM matériel peut être piloté à des fréquences de 1,2 MHz, 150 kHz, 4 kHz et 1 kHz (arrondi au kHz entier). La vitesse dépend de la fréquence du microcontrôleur. En utilisant le PWM matériel, le microcontrôleur pilote la LED indépendamment, ce qui signifie que d'autres tâches peuvent être théoriquement réalisées en parallèle. Si vous voulez un PWM fixe pour la LED, alors vous pouvez paramétrer le PWM de cette manière (en haut à droite).

The fixed mode hardware PWM is easy to set up, but somewhat limited; the only manipulation that can be made during the execution of the program code is by switching the ON-OFF states with the WAIT statement. This first version looks like a candle in heavy wind conditions. Next, we will see that the setup of the fast mode PWM needs some more lines to define the hardware PWM parameter (bottom right). To set up the Timer, the corresponding PWM channel must be set. With the attiny13a, you have only the Timer0 with channel B (constant AVRCHAN2 in Great Cow BASIC) for the fast mode PWM, and can use only PIN PB1 for the blinking or fading LED. The hardware PWM of this version looks like a candle where the wind has subsided, and, as such, looks much smoother than the fixed mode PWM version.

Le PWM matériel en mode fixe est facile à paramétrer, mais un peu limité ; la seule manipulation qui peut être faite pendant l'exécution du programme est de basculer les états ON-OFF avec la déclaration WAIT. Cette première version ressemble à une bougie dans des conditions de vent fort. Ensuite, vous verrez que le paramétrage de mode PWM rapide nécessite quelques lignes de plus pour définir le paramètre du PWM matériel (en bas à droite).

Pour paramétrer le temporisateur, le canal PWM correspondant doit être défini. Avec le attiny13a, vous n'avez que le temporisateur Timer0 avec le canal B (constante AVRCHAN2 dans Great Cow BASIC) pour le mode PWM rapide ; seule la borne PB1 peut être utilisée pour faire clignoter ou varier la LED. Le PWM matériel de cette version ressemble à une bougie où le vent a molli et semble ainsi plus douce que dans la version du mode PWM fixe.

Comparison Hint: Install binutils-avr via apt to get the tool avr-size; with it you can get the size of a hexfile in a human readable manner. Type: avr-size name-of.hex The software PWM needs some calculations and further program code to work, but the corresponding executable for one channel is rather small: Program Memory: 217/512 words (42.38%), RAM: 11/64 bytes (17.19%). The corresponding .hex file has a size of 440 KByte. The fixed and the fast mode hardware PWMs need a specific PIN of the microcontroller to work, which limits the number of LEDs you can use. But, once started, the PWM can operate independently (the plan is to prove that this is true for the idle mode, we will see this in a later part). The size of the code differs. For the version of the code with fixed mode PWM, it uses Program Memory: 244/512 words (47.66%), RAM: 9/64 bytes (14.06%). Or around 488 KByte. The fast mode PWM uses Program Memory: 478/512 words (93.36%) RAM: 15/64 bytes (23.44%). Or around 936 KByte.

Comparaison

Astuce : installez binutils-avr via apt pour obtenir l'outil avr-size ; avec lui, vous pouvez récupérer la taille d'un fichier hexa d'une manière lisible.

Tapez : avr-size name-of.hex

Le PWM logiciel nécessite quelques calculs et du code programme supplémentaire pour fonctionner, mais l'exécutable correspondant pour un canal est plutôt petit : Mémoire programme : 217/512 mots (42,38 %), RAM: 11/64 octets (17,19 %). Le fichier hexa correspondant a une taille de 440 Koctets. Les PWM matériel en mode fixe ou rapide ont besoin d'une borne spécifique du microcontrôleur pour fonctionner, ce qui limite le nombre de LED que vous pouvez utiliser. Mais, une fois lancé, le PWM peut opérer indépendamment (il est prévu de montrer que c'est vrai pendant le mode inactif, nous verrons cela dans une partie prochaine). La taille du code diffère. Pour la version de code du mode PWM fixe, il utilise 244/512 mots (47,66 %) de mémoire programme, 9/64 octets (14,06 %) de RAM. Soit environ 488 Koctets. Le mode PWM rapide utilise 478/512 words (93,36 %)de mémoire programme et 15/64 bytes (23,44 %) de RAM. Soit environ 936 Koctets.

Conclusion All three types of the PWM will work out-of-the-box and are useful on their own. The software PWM gives the possibility to drive LEDs (or motors, or other analogue driven things) without much hassle, but at the cost that other code has to be optimized to be run somehow (thus the microcontroller has so called interrupts, we will briefly introduce this topic later). Secondly, the microcontroller must be in an active state, and cannot be set to the idle sleep mode while using the PWM. The hardware PWM of the attiny13a is limited due to the few Timers (exactly one) on board, and the resulting code with random numbers will soon get too big to add more functionality. PWM on the tiny13a can look a little odd because of the low timer resolution of the attiny13a and the gaps from the random values. So there is some space left for optimisation. Bring it all together For fun (above), here is one example of a smoother fade effect, if you know ‘Dr Who’, it looks familiar - like the light on top of the TARDIS.

Conclusion

Ces trois types de PWM fonctionnent dès l'installation et ont chacun leur utilité.

Le PWM logiciel donne la possibilité de piloter des LED (ou des moteurs, ou d'autres choses pilotées en analogique) sans beaucoup de travail, mais au prix de ce que tout autre code soit optimisé pour tourner d'une façon quelconque (ainsi le microcontrôleur a ce qu'on appelle des interruptions ; nous présenterons brièvement le sujet plus tard). Deuxièmement, le microcontrôleur doit être dans un état actif, et ne peut pas être mis en inactivité pendant que le PWM tourne.

Le PWM matériel du attiny13a est limité par le peu de temporisateurs intégrés (en fait, un), et le code résultant avec des nombres aléatoires deviendra bientôt trop gros pour ajouter d'autres fonctionnalités. Le PWM sur le attiny13a peut paraître un peu bizarre à cause de la faible résolution du temporisateur et des trous entre les valeurs aléatoires. Aussi, il y a de la place pour une optimisation.

Faisons la synthèse

Pour le plaisir (ci-dessus), voici un exemple d'un effet de baisse de luminosité en douceur ; si vous connaissez « Dr Who », cela va vous paraître connu, comme la lampe en haut du TARDIS.

issue128/tutoriel2.txt · Dernière modification : 2018/01/13 14:14 de andre_domenech