dimanche 6 janvier 2013

introduction aux MCU ATtiny, partie 2

Maintenant que Atmel studio est installé ainsi que le programmmeur Pololu USB AVR, on peut commencer. tous les documents concernant cette série de chroniques seront enregistrés ici. Mais avant de programmer un MCU il faut évidemment étudier sa strcuture interne. Le core AVR 8 est très différent de celui des PIC mais il ressemble à celui de la majorité des microcontrolleur moderne, que ce soit les MSP430, ARM, MIPS en ce sens qu'il utilise un bloc de registres appellé en anglais general purpose register file alors que les PIC n'ont que le registre W. Toutes les opérations arithmétiques et logiques utilisent le contenu d'au moins 1 de ces registres comme argument et le résultat est retourné dans l'un de ces registres. Cependant comme les PIC l'ARV core est basé sur une architecture Harvard, c'est à dire que la mémoire programme est séparée de la mémoire des données. Le register file du AVR8 contient 32 registres de 8 bits pour la majorité des ATtiny sauf pour les petits ATtiny4,5,9 10 qui n'ont que 16 registres. Voici une représentation interne du AVR core 8.


À gauche c'est la structure général et à droite c'est la représentation du register file avec ces 32 registres. Notez que les 6 registres R26 à R31 ont une fonction spéciale. Utilisés par paire ils forment 3 registres d'indexation de 16 bits, X, Y et Z. C'est l'équivalent des registres FSR des PIC mais en plus puissant. D'abord parce qu'ils ont 16 bits il peuvent pointés jusqu'à 64K de RAM et deuxièmement parce qu'ils permmettent des modes d'adressage indexé, indexé relatif et incrémentation automatique. Chez les MCU PIC on ne retrouve ce genre de fonctionnalité que dans les familles enhanced mid-range (PIC12F1xxxx/PIC16F1xxxx) et extended (PIC18Fxxxx).

Ces registres peuvent aussi être utilisés comme registres d'usage général mais ce n'est pas recommendé à moins que vous n'ayez pas besoin de 3 registres d'indexation.

Autre différence avec les PIC la pile des retours est en RAM et non un mémoire dédiée comme c'est le cas avec les PIC. La dimension de la pile est donc limité seulement par la mémoire RAM disponible et de plus le pointeur de pile peut-être manipulé et on dispose d'instructions push et pop. Cette architecture facilite grandement la création d'un compilateur pour les languages de haut niveau comme le 'C' et permet donc un compilation plus facilement optimisée.

En ce qui concerne l'accès au périphérique c'est le même principe que sur tous les MCU que je connais, c'est à dire que dans l'espace d'adressage RAM il y a des registres spéciaux qui contrôlent la configuration des périphériques. Rien pour être dépaysé. Comme on va programmer en 'C' l'accès aux registres spéciaux se fera par affectation à des variables. C'est à dire que chaque SFR (Special Function Register) a un nom symbolique et que lorsqu'on veut écrire dans un registre on utilise simplement une affectation du genre:
CLKPR = 0 ; // désactivation du diviseur
et pour lire un SFR on fait comme si c'était une variable:
if (PORTB & 1<<4 == 1<<4)... // est-ce que le bit 4 du PORT B est à 1?

Modification au circuit

J'ai légèrement modifié le circuit présenté en partie 1:

Création d'un nouveau projet

J'ai préparé un document au format OpenOffice 3 expliquant les étapes pour la création d'un nouveau projet dans Atmel studio.

Lorsque vous branchez le programmeur Pololu au port USB si le pilote est installé correctement, dans le gestionnaire de périphérique de Windows vous verrez 2 nouveaux ports COM. Celui qui nous intéresse s'appelle Pololu USB AVR programmer Programming Port (COMx). Notez le nom du port COM. Il faut configuré Atmel studio pour l'utilisation de ce PORT.

Dans la barre de menu d'Atmel studio vous verrez l'item tools et dans le menu déroulant de celui-ci il y a add STK500.... Cliquez dessus, sélectionnez le port de votre programmeur Pololu et faite apply.

Maintenant si vous suivez les instructions du document pour créer un nouveau projet GCC vous devriez vous retrouver face à la fenêtre de l'éditeur avec le squelette de l'application en place. On peut maintenant écrire le code.

Pour cette première version de notre application ce sera très simple, on va utiliser le bouton pour allumer et éteindre le LED. A chaque pression du bouton l'état du LED va basculer.

code source
J'ai commenté le code pour que chaque étape soit limpide.

compilation et programmation du MCU

Pour compiler le code pressez la touche F7 ou encore cliquez l'icône build solution ou encore allez dans le menu build et cliquer le premier item. Le résultat s'affiche dans le fenêtre output en bas de l'éditeur. Cliquer sur un message d'erreur nous ramène à la ligne en faute dans le texte.

Lorsqu'il n'y a plus d'erreur on programme l'ATtiny en utilisant l'icône device programming qui est représenté par un C.I. avec un éclair par dessus. On peut aussi aller dans le menu tools.


Dans la fenêtre device programming
  1. Sélectionnez votre programmeur dans la liste déroulante sous tool
  2. cliquez apply
  3. cliquez read sous device signature
  4. allez dans memories et sélectionnez le fichier .hex qui correspond à votre programme.
  5. finalement cliquez sur program. L'état de l'avancement apparait plus bas dans la fenêtre. Si tout est ok il n'y a rien d'autre à faire.

ATTENTION!

Ne faites pas ça. Si vous programmez le fusible RSTDISBL le programmeur Pololu ne pourra plus utiliser ce chip. Seul un programmeur haute-tension peut reprogrammer un chip dont le RESET a été désactivé. C'est pour ça que j'ai modifié le circuuit et mis le bouton sur PORTB3 plutôt que PORTB5.

Ce que j'ai appris

Voici ce que j'ai appris dans cette deuxième étape.

  • Ne pas programmer RSTDISBL quand on utilise un programmeur basse tension comme le Pololu USB AVR. OOPS!
  • Comment désactivé le Watchdog timer
  • Un AVR ce n'est pas un PIC pour connaître l'état d'une entrée on ne lit pas le registre PORTx mais le registre PINx.
  • #include <interrupt.h> ne fonctionne pas. Le compilateur ne trouve pas le fichier... C'est pourquoi j'ai réécris les macros, plutôt que de perdre mon temps à chercher la solution. A voir plus tard.
  • Trop de clicks pour flasher le MCU. Dans MPLABX il suffit d'un seul.
  • Même si on cré un nouveau projet, le fichier HEX qui est indiqué dans device programming, section memories est le dernier sélectionné dans un projet précédent. ARGH!!

prochaine étape

Contrôler l'intensité du LED en utilisant le périphérique PWM.

  1. LED éteint on pèse sur le bouton, le LED allume à 100%
  2. on repèse l'intensité baisse à 75%
  3. A chaque pression l'intensité devra diminuner de 25% jusqu'à l'instinction.

jeudi 3 janvier 2013

Introduction aux MCU ATtiny, partie 1

Cette chronique est la première d'une série consacrée à un tutoriel d'introduction au microcontrôleurs ATtiny d'Atmel. Dans cette première partie je vais décrire les logiciels et le matériel nécessaire pour réaliser les expériences décrites dans cette série. En fait il va s'agir d'un seul projet auquel je vais ajouter des fonctionnalités à chaqe chronique. Toute la progammation va se faire en C.

Environnement de travail

L'environnement de travail sera le même que celui que j'ai utilisé pour ma chronique intitulée premiers pas avec MCU Atmel AVR.

Logiciels

Bien sur vous pouvez utiliser un autre programmeur que celui de Pololu. Mais celui de Pololu a l'avantage de pouvoir être contrôlé directement à partir d'Atmel studio.

Liste de matériel requis

Les liens vers les sites de Digikey et Robotshop ne sont que des suggestions.

Schéma électronique

Voici le montage qui sera utilisé pour toute la série.

installation d'Atmel Studio

Je n'ai rien trouvé en français sur l'installation d'Atmel studio 6.0 seulement ce vidéo en anglais produit par Atmel. En fait il y a plusieurs vidéo sur l'utilisation du studio. Je n'ai pas l'intention de faire une présentation sur la configuration et l'installation de l'environnement de travail. Vous devrez vous débrouiller par vos propre moyens pour ça.

Dans la prochaine crhonique je vais présenter le core AVR 8 et la première expérience que nous ferons avec l'ATtiny13A.

sonnette d'entrée

Je voulais remplacer la sonnette d'entrée que je trouve trop bruyante, j'ai donc décidé d'en fabriquer une électronique. Étonnant tout ce qu'on peut faire avec le PIC10F322 qui n'a que 3 entrée/sortie et 1 entrée, 512i de flash et 64 Octets de RAM. Malgré tout on peut lui faire jouer un fichier WAV à condition de lui donner de la mémoire supplémentaire. Microchip fabrique justement le type de mémoire eeprom dont j'avais besoin. Il s'agit des eeprom à interface I2C. Ce type de mémoire à interface sérielle ne nécessite que 2 E/S. Il me restait donc 1 sortie pour le son et 1 entrée pour le bouton de la sonnette.

Schéma électronique



Ce schéma peut semblé un peut compliqué mais j'y ai dessiné 2 options pour la partie analogique (sortie audio). Si on ne garde que l'option B c'est plutôt simple. J'utilise le transformateur existant dont je branche la sortie 14VAC sur un pont redressseur. Les condensateurs C4 et C5 filtrent les ondulations et le régulateur de tension U4 donne 5VDC pour alimenter le circuit. Le PIC10F322 est interfacé avec l'eeprom par RA1 et RA2 et la sortie PWM1 sur RA0 est la sortie audio. L'entrée RA3 est utilisée pour le bouton de la sonnette. Le signal PWM est à 22Khz.

Si on regarde la partie analogique maintenant. Commençons par l'option B la plus simple. C'est l'option que j'ai utilisé pendant le développement car je n'avais pas en main tous les composants pour l'option A. Finalement ce circuit simple fonctionne si bien que je crois que je vais le garder au montage final. Le transistor Q1 est simplement monté en emetteur follower ou si vous préférez en collecteur commun. le condensateur C3 sert à atténuer la fréquence de la porteuse PWM et les autres bruits haute fréquence générés par le procédé de numérisation.

L'option A est un peut plus sophistiquée. J'utilise un amplicateur opérationnel double MCP6002 de Microchip comme filtre passe-bas avec un atténuation de 12DB/octave. L'opamp A est utilisé pour créer un virtual ground à mi-chemin entre Vdd et Vss et l'opamp B est configuré en filtre Butterworth.
La sortie audio est assurée par l'amplificateur LM386. tous les circuits intégrés de ce projet sont disponible en format PDIP8 et l'ensemble peut-être fabriqué à faible coût.

Firmware PIC10F322

Seulement 253 instructions et 9 octets de RAM. Le plus complexe étant l'interface I2C générée en bitbang puisqu'il n'y a pas de périphérique i2c intégré. Cette partie du logiciel est une copie presque conforme de celle que j'ai programmée dans le projet précédent. Ce sont les mêmes macros et les sous-routines ee_set_address, ee_send_byte, ee_rcv_byte n'ont étées que légèrement modifiées car il n'y pas pas d'utilisation d'une pile pour les arguments.

l'opération est la suivante:

  1. Attendre que le bouton de la sonnette soit enfoncé.
  2. appeller playsound` qui initialise le PWM et l'eeprom. Le PWM fonctionne à 22050Hz alors que le fichier WAV utilisé est à 11025. Donc on ne remplace la valeur dans les registres PWM1DCH, PWM1DCL qu'aux 2 cycles. Le timer 2 est configuré pour générer une interuption à la fin de chaque cycle. La routine d'interruption bascule l'indicateur F_RATE2 à chaque cycle et ne charge le PWM que le lorsque le bit est à 1. Ce faisant elle indique à la routine playsound qu'il est temps de lire l'échantillon suivant en mettant l'indicateur F_NEXT à 1. la routine playsound est responsable de lire les échantillons dans l'eeprom et de les compter. Lorsque tous les échantillons ont été lus l'interruption est désactivée ainsi que le PWM et on retourne à la procédure principale.
  3. Pour éviter une lecture en boucle de l'enregistrement, la procédure principale attend que le bouton soit relâché avant de retourner à l'étape 1. Pas de désagrément au cas ou le bouton resterait collé.

code source
L'ensemble des fichiers est disponible ici. Çi trouve une version modifiée du programme i2cprog.py. Si vous utilisez i2cprog.py pour programmer une eeprom dans le but de fabriquer cette sonnette seule cette version enregistre correctement le fichier .WAV dans l'eeprom.
Choisissez un fichier WAV monophonique non compressé encodé en 8 bits PCM non signé avec un taux d'échantillonnage de 11025. Le logiciel open source Audacity permet de transformer un fichier WAV d'un autre format en celui-là en l'exportant. Voici une procédure au format open office 3.

Mise à jour 2013-01-05
J'ai reçu ce qui me manquait pour faire le montage final. C'est maintenant fait et la sonnette est en fonction. J'ai modifié le circuit électronique.



matériel requis
  • 1 MCU PIC10F322
  • 1 eeprom 64k/i2c 24LC512
  • 1 ampli audio LM386
  • 1 haut-parleur 6cm/8ohm/0,5Watt
  • 1 platine de montage seeed studio STR125C2B
  • 4 diodes 1N4004
  • 1 fusible picofuse 1A/fastblow
  • 1 régulateur de tension 12Volt LM7812
  • 1 régulateur de tension 5Volt LM7805
  • 1 LED vert 3mm
  • 1 résistance 10 ohm/0,25Watt
  • 3 résistances 510 ohm/0,25Watt
  • 2 résistances 2Kohm/0,25Watt
  • 1 résistance 33Kohm/0,25Watt
  • 1 potentiomètre PC mount 10Kohm
  • 1 condensateur céramique 22nF
  • 2 condensateurs céramique 47nF
  • 3 condensateurs céramique 100nF
  • 1 condensateur électrolytique 220mF/16Volt
  • 1 condensateur électrolytique 1000uF/25Volt
  • 1 bornier à vis 4 positions PC mount, espacement 100mil.
  • 1 petit bouton momentané.
  • 3 embases pour IC au format DIP 8

Mise à jour 2015-03-27

Je n'avais jamais penser à filmer un démo de ce projet en action mais à la demande d'un lecteur le voici. J'ai installé mon montage dans le boitier original d'un carillon à lame métallique préalablement retiré du boitier.


Le fichier que j'ai utilisé s'appelle theetone.wav