dimanche 27 décembre 2015

convertisseur numérique/analogique

La majorité des microcontrôleurs possèdent au moins un périphérique de conversion analogique/numérique. Par contre les convertisseurs numérique/analogiques sont moins répandus. Dans cette article je fais une présentation des différentes méthodes utilisées pour convertir un signal numérique en signal analogique.

PWM

Comme presque tous les MCU possèdent au moins 1 périphérique PWM l'utilisation de celui pour convertir un signal numérique en analogique est très répandu. Son principe de fonctionnement est basé sur l'intégration du signal ou si vous préférez la moyenne. Voici une illustration.

On a donc un signal numérique qui varie entre Vcc et 0 volt à la sortie d'une broche du MCU. Cependant le rapport cyclique de ce signal varie selon l'amplitude du signal analogique qu'on veut reproduire. Le filtre passe-bas composé d'une résistance R et d'un condensateur C sert d'intégrateur. L'onde rectangulaire du PWM est envoyée à l'entrée du filtre et à la sortie on retrouve un voltage dont la valeur et directement proportionnelle au rapport cyclique. En effet lorsque le signal est à Vcc le condensateur se charge à travers la résistance et lorsque le signal et à 0 volt le condensateur se décharge à travers la résistance. Lorsque le rapport cyclique est de 50% le voltage moyen est de Vcc/2. En fait le voltage moyen à la sortie est


Vout=Vcc/Rcy*100
où Rcy est le rapport cyclique exprimé en pourcentage du cycle. Pour que ce convertisseur fonctionne bien il faut que la fréquence de coupure Fc calculée par la formule:

  Fc=1/2*PI*R*C
soit beaucoup plus basse que la fréquence du PWM. Avec un filtre simple pôle comme celui illustré ici Fc doit-être au moins un dixième la fréquence PWM. Par exemple si on veut convertir un signal audio avec une fréquence maximale de 10Khz la fréquence PWM doit-être au minimun 20Khz et le filtre devrait avoir une valeur Fc de 2Khz ou plus bas. En remplaçant ce filtre simple par un filtre actif multipôles la fréquence de coupure du filtre peut-être au maximum la moitié de la fréquence PWM. Par exemple un filtre 8 pôles avec une fréquence de coupure 10Khz atténue la fréquence PWM de 48db. Alors que le filtre passif 1 pôle ne l'atténue que de 6db.

Cette méthode de conversion est simple et économique. On peut obtenir un résultat satisfaisant avec un filtre passif à 2 pôles. C'est à dire 2 filtres bout à bout. Mais dans ce cas On calcul Fc du premier filtre au double de la valeur de 2ième filtre en tenant compte de la charge du second filtre. Une façon simple de procéder est d'utiliser la même valeur pour R mais d'utiliser 2*C pour le deuxième filtre. L'impédance de sortie doit-être d'au moins 10 fois l'impédance de sortie du filtre pour ne pas le charger. exemple:


  Fpwm=20khz
  Fc=10Khz  et 1Kohm
  C=1/2*PI*R*FC ->> C= 1/2*PI*1000*10000=159nF 
la valeur standard la plus proche est de 150nF

Avec ce filtre il faut utiliser une fréquence PWM d'au moins 20Khz pour de l'audio jusqu'à 10Khz.

Conversion delta-sigma

Le convertisseur delta-sigma fonctionne sur le même principe d'intégration d'une onde rectangulaire sauf qu'il ne n'agit pas d'une fréquence constante dont le rapport cyclique varie selon l'amplitude du signal analogique. Les échantillons numériques n'ont qu'un seul bit. Pour représenter un voltage plus élevé on fait suivre plusieurs bit à 1 et pour représenter un signal de faible amplitude on fait suivre plusieurs bit à zéro. Les bits se succèdent à une fréquence beaucoup plus rapide que pour le PWM. On peut utiliser un périphérique SPI pour sortir les bits.

Plus il y a de 1 qui se succèdent plus le voltage monte à la sortie du filtre. Plus il y a de zéro qui se succèdent plus le voltage descend vers zéro. Pour que ça fonctionne il faut que les échantillons représentent une densité d'impulsion plutôt qu'une amplitude.

Conversion par diviseur de tension

Il y a 2 méthodes.

Première méthode: utilisation de résistances croissantes.

Ce convertisseur à 4 bits et chaque bit doit donner en tension en sortie qui est le double de celle du bit de poids précédent. Lorsque tous les bits en sortie sont à 1 on doit avoir une tension en sortie de:

  Vout=15*Vin/16
Supposons que la valeur de la résistance Ro est de 1Kohm. On doit avoir en sortie

Vout=1*Vin/16=Rb0*Vin/(Rb0+Ro) 
Rb0 doit-être de 15Kohm.
Rb1 doit-être de 15Kohm/2=7,5Kohm
Rb2 doit-être de 15Kohm/4=3,75Kohm
Rb3 doit-être de 1Kohm/8=1,875Kohm
Ces valeurs ne sont valides que si on met les bits qui ne sont pas à 1 en haute impédance et non à zéro volt. Car si on met c'est bits à zéro volt ça modifie la valeur de la branche basse du diviseur de tension. exemple si b0-b2 sont à zéro alors que b3 est à Vcc la valeur équivalente de Ro1 est de:

Ro = 1/(1/Ro+1/Rb0+1/Rb1+1/Rb2)= 682 ohm
donc la tension en sortie serait de

Vout = 1,875*Vin/(1,875+0,682)
au lieu de

Vout=1,875*Vin/(1,875+1)

Cette méthode n'est pas pratique car elle donne des valeurs de résistances non standard et oblige à mettre les bits qui ne sont pas à Vcc en haute impédance.

méthode R/2R

Heureusement il y a une méthode beaucoup plus simple. Le diviseur de tension R/2R n'utilise que 2 valeurs de résistances dont l'une est le double de l'autre d'où son nom.

Cette arrangement de résistances fait en sorte que quel que soit la valeur des bits en sortie la branche basse du diviseur de tension vue par les bits de poids plus faible garde une valeur constante de R. De plus on peut choisir 2 valeurs standards ou une seule valeur standard en utilisant 2 résistances en série pour les 2R. Le seul inconvénient c'est que ça demande plus de résistances.


  1. La valeur équivalente de résistances en parallèle est l'inverse de la somme de leur conductance.

lundi 14 septembre 2015

interface I2C

Dans cet article je présente le protocole i2C. qui est un bus de communication entre circuits intégrés. Ce type d'interface sérielle est utilisés avec de nombreux capteurs et aussi par certaines mémoires sérielles.

Inter-Integrated Circuit

I2C est l'abréviation pour Inter-Integrated Circuit. Il s'agit d'un protocole de communication sériel et synchrone utilisé pour la communication entre des circuits intégrés. Comme le SPI il s'agit d'un protocole bus, c'est à dire que plusieurs dispositifs peuvent-être connectés sur les même lignes de communication. Contrairement au protocole SPI il peut y avoir plusieurs maître sur le bus, c'est un bus Multi-maîtres, multi-esclaves. Il n'utilise que 2 fils pour la communication SDA et SCL par contre le débit est plus lent que pour un bus SPI. De plus la communication est semi-duplex, c'est à dire que la transmission et la réception se font en alternance.

Puisque les lignes de communication SDA et SCL peuvent-être contrôlées par plus d'un dispositifs il faut qu'elles soient configurées en drain ouvert. Il y a donc une résistance pull-up sur chaque ligne.

Seul un dispositif maître peut initier une communication. Mais puisqu'il peut y avoir plusieurs maître sur le bus, avant de débuter une transaction un maître doit vérifier l'état du bus. Évidemment s'il n'y a qu'un seul maître cette vérification peut être omise.

Dans cet introduction on ne verra que l'utilisation la plus simple soit un MCU utilisant une mémoire EEPROM et deux sondes de température branchés sur le même bus I2C.

Disons que ce dispositif sert à lire deux températures et à enregistrer les données dans la mémoire EEPROM. Les lignes A0-A2 sont branchées soit à Vdd ou Vss pour sélectionner l'adresse du périphérique. Ainsi l'EEPROM est à l'adresse 0 (b000), la sonde 1 à l'adresse 2 (b010) et la sonde 2 à l'adresse 4 (b100).

Adressage

Puisqu'il y a plusieurs dispositifs sur le même bus et qu'il n'y a pas de ligne Slave Select il faut une autre méthode pour distinguer les différents périphériques. Le protocole I2C utilise un adressage via le canal de données. Le maître procède de la manière suivante pour communiquer avec un périphérique esclave.

  1. Envoie du START bit.
  2. Envoie de l'octet d'adresse.
  3. Envoie du bit écriture(0)/lecture(1)
  4. Si un dispositif sur le bus reconnait l'adresse il répond par un ACK bit.
  5. Si le maître reçoit un ACK bit il peut continuer à transmettre ou recevoir en utilisant la ligne SCL pour cadencer les bits.
  6. Une transmission se termine par un STOP bit.

Lorsque le bus est inactif les 2 lignes sont à 1. Pour signaler un START le maître garde la ligne SCL à 1 et fait passer la ligne SDA de 1 à 0. Pour un STOP c'est l'opposé, la ligne SCL toujours à 1 et la ligne SDA passe de 0 à 1. Toutes les autres transitions de la ligne SDA se font lorsque la ligne SCL est à 0.

Le maître contrôle la ligne SCL et après l'envoie de chaque octet il doit envoyer un cycle supplémentaire sur la ligne SCL pour lire le bit ACK envoyé par l'esclave. Notez que ce bit ACK n'est envoyer pendant la phase d'adressage qu'après le bit WRITE/READ. Le maître doit lire le bit ACK pour s'assurer que l'octet a bien été reçu. On a donc 9 périodes du signal clock par octet envoyé. Lorsque le maître est en mode réception c'est lui qui doit envoyer un bit ACK pour chaque octet reçu. Cependant il ne doit pas envoyer de ACK pour le dernier octet reçu. Dans ce cas l'esclave cesse la transmission et attend le stop bit. Les octets sont transmis en commençant par le bit le plus significatif.

extrait du feuillet de spécification du 24LC512

Dans le cas des dispositifs Microchip utilisés dans le montage ci-haut l'octet d'adressage se compose de 5 bits de contrôle et de 3 bits d'adressage.

extrait du feuillet de spécifications du 24LC512

La signification des 5 bits les plus significatifs dépend du dispositif et on en retrouve la description dans le feuillet de spécification. Les 3 bits A0-A2 sont comparés à la valeur des broches de même nom et servent à sélectionner le dispositif.

Puisqu'un ACK doit-être envoyé à chaque octet transmis le MCU doit reconfiguré la ligne SDA en conséquence. Par exemple lorsqu'il transmet il doit configuré la broche qui sert de SDA en mode entrée pour recevoir le ACK et la remettre en mode sortie autrement. Lorsqu'il reçoit c'est le contraire il doit garder cette broche configurée en entrée et la mettre en sortie pour transmette le ACK.

Mette en application une interface I2C en logiciel es plus complexe que pour une interface SPI à cause du changement continuel de direction de la ligne SDA. Pour un exemple concret d'utilisation vous pouvez consulter le projet sonnette d'entrée sur ce blog.

Conclusion

Le seul avantage de l'interface I2C par rapport au SPI est le nombre réduit de broches requises sur le MCU. Autrement la vitesse de communication est plus lente et la mise en oeuvre plus complexe au niveau logiciel s'il n'y a pas de périphérique I2C intégré au MCU. Les périphériques I2C intégrés au MCU sont plus rares que les périphériques SPI. Donc plus souvent qu'autrement on doit le faire en bit bang.

vendredi 11 septembre 2015

interface SPI

Dans cet article j'explique ce qu'est une interface SPI sans faire référence à un MCU en particulier. Il s'agit simplement de comprendre le fonctionnement de ce protocole de communication.

Serial Peripheral Interface

voici un schéma représentant cette interface.

Il s'agit donc d'un protocole de communication sériel. C'est à dire que les bits d'information circulent à la queue leu leu sur 1 seul fil. Cependant contrairement au protocole RS-232 il y a un signal clock sur un autre fil qui sert à synchroniser l'information.

Description des signaux

  • SCLK, Serial CLOCK est un signal de synchronisation qui détermine la position des bits.
  • MOSI est l'acronyme de Master Output Slave Input. Ce fil sert à transmettre les bits d'information du maître vers l'esclave.
  • MISO est l'acronyme de Master Input Slave Output. Ce fil sert à transmettre les bits d'information de l'esclave vers le maître.
  • SS est l'acronyme de Slave Select. Sur un bus SPI il peut y avoir plusieurs périphériques esclaves. Ce signal permet de sélectionner lequel est actif pour la communication. Notez la présence d'une barre au dessus du SS sur le schéma. Cette barre signifie que ce signal est actif lorsque le voltage est à zéro. Donc on sélectionne un esclave en mettant sa ligne SS à zéro. Les signaux de sorties d'un esclave non sélectionné sont en haute impédance et il ignore les signaux SCLK et MOSI.

A l'interne

A l'interne une interface SPI possède un seul registre à décalage1 pour la transmission et la réception.

Le maître comme son nom l'indique contrôle la communication. Les étapes de la communication sont les suivantes:
  1. Mettre à zéro la ligne SS de l'esclave.
  2. Envoie d'un octet de commande. En inscrivant l'octet dans le registre à décalage.
  3. Lecture de l'octet reçu de l'esclave
  4. Envoie des arguments de la commande
  5. Lorsque l'échange est terminé remettre la ligne SS à Vdd.

Le bit le plus significatif est envoyé en premier. Si vous regardez le schéma du transfert de donnée vous voyez que le maître comme l'esclave n'ont besoin que d'un seul registre à décalage pour recevoir et transmettre. La transmission et la réception se font en simultané. A chaque cycle du signal SCLK les registres de chacun sont décalés vers la gauche et reçoivent un bit d'information dans le bit de droite qui vient d'être libéré par le décalage vers la gauche.

Pour un octet, après 8 périodes du signal SCLK les registres de décalage du maître et de l'esclave contiennent un nouvel octet reçu de l'autre partie. Si besoin est le maître qui est habituellement un MCU peut lire le registre pour récupérer cet octet avant de l'écraser avec le prochain octet à transmettre.

Phase et polarité

Avant d'utiliser une interface SPI sur MCU ont doit déterminer les paramètres suivants:

  • Est-ce que le MCU est le maître ou l'esclave?
  • Quel est la fréquence du signal SCLK?
  • Quel est la phase du signal SCLK, paramètre CPHA
  • Quel est la polarité du signal SCLK, paramètre CPOL

Dans la majorité des cas le MCU sera le maître et la fréquence de SCLCK dépend des capacités du MCU, du périphérique SPI et de l'application.

La phase CPHA et la polarité CPOL de SCLK dépend du périphérique SPI utilisé. Ces paramètres sont configurés par l'état d'un bit dans un registre de configuration de l'interface SPI sur le MCU. Puisqu'il y a 2 bits il y a 4 combinaisons possibles:

MODECPOLCPHAdécalageéchantillonnage
000Tr desc.Tr mont.
101Tr mont.Tr desc.
210Tr mont.Tr desc.
311Tr desc.Tr mont.

CPOL détermine simplement à quel niveau logique doit-être la ligne SCLK lorsque l'interface est au repos. Lorsque ce bit est à zéro ça signifie que la ligne SCLK est à zéro au repos sinon elle est à 1.

CPHA détermine sur quelle transition le registre est décaler, i.e. envoie du bit sur la ligne. L'autre transition et utilisée pour échantillonner le bit sur la ligne de réception.

Le tableau ci-haut indique l'influence de ces 2 paramètres sur le moment du décalage et de l'échantillonnage.

exemple de périphérique SPI

Microchip vend des mémoires à interface SPI. Nous allons prendre pour notre exemple un 23LC512 qui est une mémoire RAM sérielle de 64Ko.

La procédure de communication est celle indiquée ci-haut. Supposons qu'on veut écrire un octet dans la RAM. Le diagramme suivant indique le timing sur l'entrée SPI du 23LC512.

Sur ce diagramme le signal SI correspond au signal MOSI de l'interface SPI. On voit donc que le 23LC512 échantillonne la ligne MOSI sur la transition montante. On voit aussi que le signal SCK est à zéro lorsque l'interface est inactive. Donc Sur le MCU on va configurer CPOL=0 et CPHA=0 c'est à dire le mode 0 selon la table ci-haut.

Si on regarde le diagramme du timing de la ligne SO (MISO du SPI) du 23LC512 on a ceci.

Les chiffres sur ces diagrammes réfère à une ligne de la table AC CHARACTERISTICS. La 12 de cette table nous dit que le signal sur la ligne SO est valide au maximum 25nsec (nanosecondes) après la transition descendante de SCK. Donc le maître peu lire en toute confiance cette ligne sur la transition montante à condition que le temps entre la transition descendante et la transition montante de SCK soit d'au moins 25nsec. Ce qui correspond à une fréquence maximale pour le signal SCLK de l'interface SPI de 20Mhz2.

Conclusion

Pour utiliser une interface SPI sur un MCU le plus important est de comprendre la relation entre CPOL et CPHA et de connaître les paramètres des signaux du périphérique utilisé. Le protocole SPI est utilisé entre autre par des mémoires sérielles RAM, EEPROM et FLASH. Aussi par certains affichages LCD ainsi que pour les carte SD. Vos profiterez donc d'une bonne connaissance de ce protocole dans vos projets MCU.


Notes

  1. Un registre à décalage permet de sérialiser un bloc de bits. Il peut s'agit d'un octet ou d'un mot plus long. Le mot est inscris dans le registre ensuite un signal clock permet de décaler les bits dans le registre un bit à la fois vers une sortie unique (1 bit). Dans le cas du protocole RS-232 les bits sont sérialisés en sortant le bit de poids faible en premier. Pour le protocole SPI c'est le bit de poids fort qui est sortie en premier. Un registre à décalage peut aussi faire l'inverse. Sois recevoir un train de bits sur une entrée et par le même principe de décalage recouvrer le mot complet dans le registre. En anglais on parle de SerDes c'est à dire Serialiser/Deserialiser. Dans le protocole SPI c'est le même registre qui accompli les 2 fonctions.
  2. On suppose que le signal SCLK est une onde carrée et que Thigh=Tlow donc pour Tlow=Thigh=25nsec on a une période pour SCLK de 50nsec donc 20Mhz. C'est bien selon les spécifications du 23LC512 la fréquence maximale pour SCK.

mardi 18 août 2015

NTSC et Parkinson

Dans l'article précédent intitulé téléviseur conformiste je présentait un problème et sa solution concernant la génération d'un signal NTSC sur ATmega328P. Mais la solution présentée n'était pas optimum, il y avait un tremblement dans l'image. Aujourd'hui j'ai réglé ce problème et dans cet article j'explique la cause de ce tremblement et la solution que j'ai apportée.

Vidéo avant la correction du problème on voit le tremblement de l'image surtout apparent sur la ligne verticale à droite de l'écran.

Vidéo après correction du problème. Maintenant l'image est très stable. Il n'y a plus de Parkinson.

La gigue d'interruption

J'ai tapé dans google search: traduire: interrupt jitter et c'est la traduction que j'ai obtenu!

Le générateur de signal NTSC utilise une interruption pour modifier les paramètres du signal PWM qui génère la synchronisation mais aussi pour déterminer quand il est temps d'envoyer les pixels vidéo pour chaque ligne visible à l'écran. En ce qui concerne la synchronisation l'interrupt jitter n'affecte pas son fonctionnement puisque cette synchronisation utilise le compteur TCNT1 dont le fonctionnement est indépendant des interruptions. Par contre pour l'envoie des pixels vidéo il y a une influence. Il est primordial que l'envoie du signal vidéo débute toujours au même instant à chaque ligne ainsi qu'à chaque répétion de frame.

Le problème est que le temps de réponse de l'interruption est variable car il est influencé par la durée de l'exécution de l'instruction machine en cours au moment où se produit l'interruption. En effet le MCU doit attendre la fin de l'instruction en cours avant de répondre à l'interruption. Hors sur les AVR le temps d'exécution d'une instruction varie entre 1 et 4 cycles. La durée d'un pixel dans ce générateur vidéo est de 6 cycles machines. Donc une fluctuation de 4 cycles sur le départ de la ligne vidéo c'est 2/3 de pixel en largeur. C'est cette fluctuation qu'on perçoit dans l'image.

Comment régler ce problème

Comme je l'ai dit le fonctionnement du compteur TCNT1 est indépendant des interruptions on peut donc se fier à son fonctionnement pour avoir l'heure juste, si je peut dire. Dans cette application le compteur est cadencé à la même fréquence que le coeur du MCU. Donc lorsqu'il est temps de générer les pixels vidéo d'une ligne sa valeur est toujours la même à 4 cycles près. Le code assembleur que j'ai ajouté lit l'octet faible de TCNT1 qui est un compteur de 16 bits et ne garde que les 2 bits les plus faibles, donc cette valeur peut variée de 0 à 3 du au jitter. Je prends pour cible la valeur 3 et si le compte est inférieur à 3 on ajoute autant d'instruction NOP que nécessaire pour que lorsque le programme arrive au code qui génère le vidéo le compte de TCNT1 soit toujours le même. Puisque c'est TCNT1 qui détermine le début de la ligne vidéo, à compte égal de celui-ci on est à la même position sur la ligne vidéo.

Pour obtenir un timing précis j'ai du écrire le code en embedded assembly. Voici le code ajouté à la routine d'interruption vidéo TIMER1_COMPB_vect dans tvout.c.


 asm(// élimination de la gigue d'interuption (jitter)
 "ldi r30,lo8(jit)\n"
 "ldi r31,hi8(jit)\n"
 "clc\n"
 "ror r31\n"
 "ror r30\n"
 "lds r24,0x84\n"
 "andi r24,3\n"
 "add r30,r24\n"
 "adc r31,r1\n"
 "ijmp\n"
 "jit:"
 "nop\n"
 "nop\n"
 "nop\n"
 "nop\n"
 );
Ce code fonctionne de la façon suivante. l'adresse de l'étiquette jit (Just In Time) est chargée dans le registre d'index Z qui est en fait la concaténation des registres R31:R30 pour former un pointeur de 16 bits. Les 3 instructions suivantes divisent cette valeur par 2 parce que cette adresse est celle d'un octet mais le compteur ordinal du ATmega328P lui pointe sur des mots de 16 bits. Autrement dit si l'adresse de jit est 21590 en mémoire flash, pour que le PC pointe cette adresse il doit contenir 10795. Une fois le pointeur Z ajusté à la valeur désirée. On fait la lecture de l'octet faible de TCNT1 qui se trouve à l'adresse 0x84 et on met cette valeur dans le registre R24. L'instruction andi r24,3 à pour but de mettre tous les bits de R24 à zéro sauf les 2 plus faibles. On a maintenant dans R24 un nombre entre 0 et 3. On additionne ce nombre à la valeur dans le registre d'index Z. L'instruction ijmp prend la valeur dans Z et la transfert dans PC (le pointeur d'instruction). Si R24 contenait 0 l'instruction qui sera exécutée après le ijmp sera celle exactement à l'adresse jit. Si R24 contenait 1 l'instruction qui sera exécutée après le ijmp sera à l'adresse jit+2, etc. jit+2 parce que n'oubliez pas que le PC adresse des mots de 16 bits et non des octets et comme chaque instruction NOP occupe 2 octets on a le bon alignement.

Au bout du compte lorsque le PC arrive à l'instruction qui suis le dernier NOP, le compteur TNCT1 a toujours la même valeur puisqu'il est incrémenté au même rythme que le compteur ordinal (pointeur d'instruction).

routine TIMER1_COMPB_vect

Voici la routine d'interruption au complet. Je rappelle que ceci fait parti du projet open sourde CHIPcon v2.

jeudi 13 août 2015

Tétéviseur conformiste

J'ai conçu plusieurs projets générant un signal NTSC monochrome et les ai branchés sur 3 téléviseurs différents avec succès. Mais voilà que dernièrement j'ai du remplacer mon téléviseur par un de modèle RCA. Comme cette semaine j'ai repris le projet CHIPcon dans le but de remplacer le clavier hexadécimal par un joystick Atari 2600. Je branche CHIPcon v2 sur mon téléviseur RCA... pas de vidéo! Pourtant il fonctionne très bien sur mon petit moniteur de développement. Je n'ai pas été long à figurer d'où provenait le problème.

Standard NTSC

En fait la sortie NTSC que j'utilise n'est pas conforme au standard. Il s'agit d'une version simplifiée appellée balayage progressif sans alternance de champ (field). De plus la synchronisation verticale est aussi simplifiée et consiste à simplement rallonger l'impulsion de synchronisation pour les lignes 1 à 3.

Le standard NTSC lui définie une alternance de field pair et impair. Chaque field ayant chacun 262,5 lignes pour un total de 525 lignes par image puisque les lignes des champs pair et impaire sont inter-lacées. Ceci a pour but d'éviter le scintillement de l'image tout en réduisant la bande passante requise par le signal vidéo puisqu'il n'y a que 262,5 lignes de transmise par champ. Chaque champ n'est affiché que 30 fois par seconde en alternance pair/impair même si le balayage vertical est à la fréquence de 60 fois par seconde. Astucieux!

Dans la version que j'utilise il n'y a que 262 lignes répétées 60 fois par secondes sans inter-lacement.

Solution au problème

Heureusement la solution à ce problème était simple et consistait à une modification de la routine d'interruption vidéo ISR(TIMER1_COMPB_vect) située dans le fichier tvout.c Voici la version originale présentée dans CHIPcon et la version conforme à NTSC corrigée pour CHIPcon v2.

NTSC balayage progressif

NTSC conforme

Notez que ceci n'augmente pas la résolution verticale qui demeure à 2621 lignes puisque le même video_buffer est utilisé pour les 2 champs pair et impair.

conclusion

La morale de cette histoire est que si vous voulez que votre projet fonctionne sur tous les téléviseurs il vaut mieux qu'il se conforme au standard NTSC, car on ne sais jamais quand on aura affaire à un téléviseur pointilleux.


NOTES:

  1. Les 262 lignes ne sont pas toutes visibles, 21 de ces lignes font partie du vertical retrace. De plus sur les téléviseurs que j'ai essayé il y a environ 230 lignes visibles en balayage progressif. En respectant le standard et en utilisant l'entre-lacement on obtiendrait donc 460 lignes au coup d'un buffer vidéo 2 fois plus grand.
  2. m.à.j. 2015-08-18, j'avais oublié le break; pour le case 272:. De plus j'ai supprimé le test if(!even) qui était inutile car si even est vrai line_counter est mis à -1 avant d'atteindre 272.

jeudi 6 août 2015

trivia

Combien coûtait un disque dur de 26Mo en 1980?

réponse: 4995US$

Cette information me viens d'une publicité parue à la page 53 de BYTE édition du mois d'août 19801. La publicité qualifie ce prix de HARD BARGAIN. Toute une aubaine! Et ce sont des dollars de 1980. Si on tiens compte de l'inflation en me fiant à l'information trouvé ici, ça ferais en dollars d'aujourd'hui 14 350US$2.


notes

  1. Cette édition de BYTE consacré à FORTH peut-être téléchargée à partir de ce lien.
  2. Pour l'année 1980 j'ai utilisé le ratio <inflation ajusted $>/<nominal $> * 4995

mercredi 5 août 2015

Arduino sketch et C++

Cette Article est une réaction à l'article d'Elliot Williams paru sur Hackaday.com le 28 juillet 2015. La question est la suivante: est-ce qu'un sketch Arduino est un programme C++?

L'argument d'Elliot Williams est que derrière la scène, l'environnement Arduino est basé sur C++ et que la syntaxe des sketch Arduino est la même que la syntaxe de C++. Un sketch Arduino est simplement pré-traité pour y apporter les éléments manquants pour en faire un programme C++ compilable par GCC.

Arduino refence

Jetons un coup d'oeil au manuel de référence du langage Arduino. En effet tous les éléments de la syntaxe sont les même que ceux du C++. Mais est-il question ce classes, objets, etc? non.

Le langage Arduino est un sous-ensemble du langage C++. Un sous-ensemble d'un ensemble n'est pas l'ensemble lui-même.

Si on ajoute des éléments du C++ qui ne sont pas dans la référence du langage Arduino comme par exemple des classes d'objets et des instances d'objets, le script va compiler correctement donc c'est du C++ dit M. Williams.

Personnellement je considère que tout fichier qui a besoin d'être pré-traité avant d'être compiler avec gcc n'est pas du C++ à proprement parler même si les éléments manquant peuvent-être ajoutés manuellement dans le fichier sketch. par exemple les prototypes de fonctions ne sont pas requis dans la référence du langage Arduino mais ils le sont par C/C++. Arduino utilise donc un pré-traitement qui lui est propre et qui sert entre autre à ajouter ces prototypes de fonctions ainsi qu'à ajouter un #include pour la librairie Arduino.

exemple

Voici un exemple d'un sketch Arduino auquel j'ai ajouter une classe C++. le pré-traitement Arduino transforme le sketch en fichieer .cpp suivant:

On voit que le pré-traitement ajoute des directives #line ainsi que la directive #include "Arduino.h" ainsi que les prototypes void setup(); et void loop();

Pourquoi est-ce que j'insiste sur ces détails? A cause de la philosophie d'Arduino. Arduino a été créé pour simplifier l'utilisation des microcontrôleurs pour les rendre accessibles aux non spécialistes. C'est ce qui fait tout l'intérêt d'Arduino. Les spécialistes n'utilisent généralement pas Arduino, car ils n'en ont tout simplement bas besoin et pour eux l'IDE Arduino est d'une utilisation frustrante car cet environnement simplifié n'offre pas les outils auxquels ils sont habituer.

Donc lorsque certains comme M. Williams, veulent expliquer aux utilisateurs d'Arduino qu'en fait ceci c'est du C++ alors moi je dis qu'ils non pas compris l'objet du projet Arduino: garder ça le plus simple possible pour que les amateurs puisse utiliser la plateforme avec une difficulté d'apprentissage minimisée. Si éventuellement ces amateurs deviennent des professionnels ils n'auront plus besoin d'Arduino.

mardi 4 août 2015

comprendre les pointeurs

Lorsque j'ai appris le langage C il y a longtemps l'un des concepts qui m'a donné le plus de difficulté est celui concernant l'usage des variables pointeurs. Cet article est à l'usage de ceux qui débutent en C est qui auraient la même difficulté.

coup d’œil sur les registres interne d'un MCU

Prenons un MCU quelconque, par exemple un PIC12F1822. Si on regarde le modèle de programmation du cœur de ce MCU on voit ceci.

Les registres FSR0 et FSR1 sont ce qu'on appelle des registres d'index, c'est à dire des variables pointeurs. Supposons qu'on écris un programme en mpasm et qu'on veut initialiser la RAM commune à zéro que fait-on?


;sous-routine pour effacer ram commune 0x70-0x7f
clear_common_ram:
;initialistion du pointeur
    clrf FSR0H
    movlw H'70'
    movwf FSR0
    clrf WREG 
clear_loop:
    movwi, FSR0++ ; adressage indirect avec post-incrément
    btfss FSR0,7
    bra clr_loop
    return ; terminé car FSR0==0x80
On pourrais aussi faire ceci sur un PIC baseline:

;sous-routine pour effacer ram commune 0x70-0x7f
clear_common_ram:
    movlw H'70'
    movwf FSR0
clear_loop:
    clrf FSR0 ; adressage indirect
    incf FSR0,F ; incrémente le pointeur
    btfss FSR0,7
    bra clr_loop
    return ; terminé car FSR0==0x80
On a mis 0 dans le registre WREG et on transfert cette valeur dans toutes les localisations RAM entre 0x70 et 0x7F. Pour ce faire on se sert du registre d'index FSR0. FSR0 est une variable pointeur. FSR0 ne contient pas un entier mais une adresse et cette adresse indique où on veut mettre la valeur de WREG. l'instruction movwi FSR0++ effectue 2 opérations. D'abord elle transfert le contenu de WREG qui est zéro à l'adresse RAM indiquée par le contenu de FSR0 et deuxièmement incrémente de 1 la valeur de FSR0 pour pointé à l'adresse suivante. Le programme boucle sur clear_loop tant que le bit 7 de FSR0 est à 0 car si le bit 7 est à 1 c'est que FSR0 pointe sur une adresse après 0x7F.

la même chose en C

répétons le même programme en C


void clear_common_ram(){
    char *p;
    p=(char*)0x70;
    while(((int)p&0x80)==0){
        *p++=0; 
    }           
}

variable pointeur

Dans tout langage de programmation une variable est une adresse en mémoire dans laquelle une information est conservée. Dans l'exemple ci-haut p ne fait pas exception, c'est une adresse mémoire dans laquelle on va garder une information mais cette information n'est pas un char mais une adresse qui indique un autre endroit en mémoire ou est conservé une donnée de type char. Ça a peut-être l'air plus compliqué que la version mpasm mais c'est presque la même chose. Lorsqu'on déclare la variable p l'étoile * avant le p informe le compilateur que cette variable va contenir une autre adresse et non un char.

l'instruction *p++=0; indique qu'on veut modifier le contenu de l'adresse pointée par p et non le contenu de p lui-même. Ici l'étoile * n'a pas la même signification que lorsqu'on déclare la variable. Elle signifie plutôt un adressage indirect. Dans de nombreux assembleurs l'adressage indirect (par pointeur) est indiqué par le nom du registre qui sert de pointeur entre crochet comme ceci:


    LOAD R0,[R15]
Ce qui signifie met la valeur qui se trouve à l'adresse indiquée par le contenu de R15 dans R0. Donc ici R0 est une variable ordinaire tandis que R15 est une variable pointeur (registre d'indexation ou d'indirection).

Quand le programme compilé va s'exécuter, il va aller chercher la valeur de p et la mettre dans FSR0 ou FSR1. ensuite il va mettre WREG à zéro et effectuée une boucle très semblable à celle d'écrite ci-haut dans la version mpsasm.

J'ai fait un test dans MPLAPX en compilant avec XC8 free (pas d'optimisation) voici le résultat dans le disassembly listing


11:            void clear_common_ram(){
12:                char *p;
13:                p=(char*)0x70;
07ED  3070     MOVLW 0x70
07EE  00F0     MOVWF __pcstackCOMMON
07EF  3000     MOVLW 0x0
07F0  00F1     MOVWF 0x71
14:                while(((int)p&0x80)==0){
07F1  1BF0     BTFSC __pcstackCOMMON, 0x7
07F2  0008     RETURN
07FC  2FF1     GOTO 0x7F1
15:                    *p++=0;
07F3  0870     MOVF __pcstackCOMMON, W
07F4  0086     MOVWF FSR1
07F5  0871     MOVF 0x71, W
07F6  0087     MOVWF FSR1H
07F7  0181     CLRF INDF1
07F8  3001     MOVLW 0x1
07F9  07F0     ADDWF __pcstackCOMMON, F
07FA  3000     MOVLW 0x0
07FB  3DF1     ADDWFC 0x71, F
16:                }
17:            }
Ça a l'air plus compliqué sans optimisation! __pcstackCOMMON est une pseudo-pile créé par le compilateur. On peut s'en passer et simplifier ça. Il n'est pas nécessaire non plus de stocker le pointeur FSR1 sur la pile __pcstackCOMMON.

clear_common_ram:
; initialisation du pointeur p
; le compilateur a choisi FSR1 comme pointeur
; les FSR du PIC12F1822 sont de 16 bits
    movlw 0x70
    movwf FSR1L
    movlw 0
    movwf FSR1H
clear_loop:
    btfsc FSR1L,7
    return
    clrf INDF1
    ; fsr1 a 16 bits, incrément par addition de 1
    movlw 1
    addwf FSR1L
    movlw 0
    addwfc FSR1H
    goto clear_loop

Lorsqu'on déclare un tableau en C i.e. char tableau[10];, le compilateur va aussi utiliser un registre d'index pour atteindre les éléments de ce tableau, i.e. b=tableau[2]; se traduis en assembleur par:


;initialise le pointeur
   movlw LOW tableau
   movwf FSR0L
   movlw HIGH tableau
   movwf FSR0H
;va cherché la valeur dans le 3ième élément du tableau.
   moviw 2[FSR0]; WREG=indirection:[FSR0+2]
   movwf  b  ; assigne cette valeur à b

adresse d'une variable ordinaire

Si l'étoile avant le nom d'un pointeur sert à indiquer une indirection,on dit déréférencer, comment fait on pour obtenir l'adresse mémoire où est stocké le contenu d'une variable ordinaire:


int b=0, *p;

   p=&b;
   *p=34; // que contient b?
Le symbole & est utilisé pour indiquer l'adresse de la variable et non son contenu. donc dans cette exemple p contient l'adresse de la variable b. Et lorsqu'on déréférence p pour y assigner la valeur 34 et bien la valeur de la variable b devient 34 car p pointe vers b.

Que ferais-je sans toi

En effet comment ferait-on sans pointeurs pour adresser un tableau ou n'importe qu'elle étendu de mémoire? J'espère donc que cette présentation a clarifié la question des pointeurs.

mercredi 29 juillet 2015

3D xpoint

Depuis 10 ans Intel et Micron travaillent conjointement sur un projet commun et voilà qu'ils on annoncés hier la mise en marché prochaine de cette nouvelle technologie. Il s'agit d'une mémoire persistance appellée 3D xpoint qui offre des performances nettement supérieure à la mémoire flash. Pour le moment cette mémoire n'est disponible que pour les manufacturiers pour essais et développement de produits. Mais elle devrais-être disponible chez les distributeurs de composants dès 2016.

De quoi s'agit-il?

Il n'y a pas grand détail mais à la lecture de l'annonce faites par Intel et cet article sur le site de la BBC, je crois comprendre qu'il s'agit d'une technologie de type memristor. Il n'y a pas de transistors ce qui permet une plus grande densité. Chaque bit de mémoire est constitué simplement d'un certain type de cristal dont la résistance varie lorsqu'un courant passe à travers celui-ci. Cette variation de résistance persiste après que le courant a cessé. Il s'agit donc d'une mémoire permanente.

Avantages

Par rapport à la mémoire flash cette mémoire a plusieurs avantages.

  • 1000 fois plus rapide que la mémoire flash NAND. Donc un MCU qui utiliserais ce type de mémoire pour stocker son programme ne serait pas limité à 40Mhz comme c'est le cas actuellement. Actuellement les MCU dont le core fonctionne au delà de 40Mhz utilisent des wait state et une forme de mémoire cache pour l'accès programme.
  • 1000 fois plus durable que la mémoire flash NAND. Donc un MCU qui utiliserais cette mémoire au lieu de la flash pourrait être reprogrammé un nombre illimité de fois sans crainte d'user la mémoire programme. Donc une application pourrait utiliser la mémoire programme pour stocker des données.
Donc en pratique sur un MCU il ne serait plus nécessaire de faire la distinction entre mémoire programme et mémoire RAM. En utilisant un coeur de type Von Neumann et seulement de la mémoire 3D xpoint on obtiendrais une mémoire totalement unifiée pour le MCU et l'état du système serait conservée en cas de rupture d'alimentation.

J'ai hâte de voir si les manufacturiers de MCU vont adopter cette technologie sous licence pour leur MCUs. Déjà Texas Instruments offre quelque chose dans le même genre avec sa propre technologie FRAM. La FRAM (Ferro Magnetic RAM) est une technologie différente du 3D xpoint mais qui est elle aussi persistance, plus endurante et plus rapide que la FLASH.

Il reste à voir à quel coût cette technologie sera disponible. Si c'est le même coût que la mémoire FRAM de TI les MCUs l'utilisant seront plus coûteux que ceux utilisant la mémoire NAND FLASH.

vendredi 24 juillet 2015

ionisation et fluorescence

Dans l'article précédent sur les DEL j'expliquais le fonctionnement des DEL par la quantisation des niveaux d'énergies dans les couches électroniques des atomes. Dans cet article je vais expliquer 2 autres phénomènes utilisés en électronique qui sont aussi des phénomènes quantiques. L'ionisation et la fluorescence.

enseigne au néon

Vous connaissez surement ces enseignes lumineuses qu'on appelle communément néon. On peut aussi se procurer sur le marché de petites ampoules au néon servant comme indicateur bien que celles-ci ont largement été remplacées par les DEL. Enseigne ou ampoule le principe de fonctionnement est le même, l'ionisation d'un gaz. Dans une tube ou une ampoule sous vide on introduit un gaz sous faible pression. Dans ce tube il y a 2 électrodes isolées l'une de l'autre. Si on applique un voltage suffisant à ces électrodes il y a production de lumière. Le phénomène est le suivant, le champ électrique arrache les électrons de l'atome. On dit d'un gaz dont les atomes perdu 1 ou plusieurs électrons qu'il est ionisé1. Mais les lois de la physique font en sorte que la matière cherche à se stabiliser au plus bas niveau d'énergie. Les atomes ionisés possèdent un charge positive qui attire les électrons. Ceux-ci retombent donc dans leur position initiale en émettant un photon. l'énergie de se photon donc sa longueur d'onde dépend de la différence d'énergie entre l'électron libre et l'électron capturé par l'atome. Un gaz ionisé n'émet pas une seule fréquence lumineuse mais plusieurs on appelle ces différentes fréquences lumineuse le spectre. Chaque élément chimique possède son propre spectre lumineux qui l'identifie de façon unique. C'est en faisant cette analyse spectrale que les astronomes parviennent à identifier les éléments chimiques qui composent les étoiles et l'atmosphère des autres planètes. Le néon semble orange ou rouge à l’œil parce que c'est la longueur d'onde dominante de son spectre. Si on remplace le néon par un autre gaz la couleur sera différente. Une enseigne au néon qui n'est pas rouge n'est pas en réalité une enseigne au néon mais contient plutôt un autre gaz et l'intérieur du tube est recouvert d'une substance chimique fluorescente. Les petites ampoules néon émettent une lumière orange mais si on augmente le voltage elle deviennent rouges. Si vous alimenter une ampoule néon en courant direct la luminosité sera centrée autour d'une seule des 2 électrodes, la plus positive car les électrons émis par l'autre électrode doivent avoir suffisamment d'énergie cinétique pour ionizer le gaz. Les électrons gagnent en vitesse en se déplaçant vers l'électrode positive. En courant alternatif la luminosité est centrée autour des 2 électrodes car les électrons se déplacent alternativement dans les 2 directions.

Neon light.jpg
« Neon light ». Sous licence CC BY-SA 3.0 via Wikimedia Commons.

indicateur neon A1A

Fluorescence

La première calculatrice que j'ai acheté dans les années 70 était de marque Rockwell et avait un affichage VFD Vacuum Fluorescent Display. A l'intérieur d'un tube de verre dans lequel on a fait le vide il y a plusieurs électrodes. Une cathode qui émet des électrons et des anodes recouvertes d'une substance chimique fluorescente. Entre la cathode et les anodes il y a aussi une grille. Cet agencement est semblable au tube électronique appelé triode sauf qu'il n'est pas conçu pour amplifier un signal mais pour émettre de la lumière. Donc un voltage positif sur une anode attire les électrons générés par la cathode ces électrons accélérés viennent frapper la substance chimique qui est sur l'anode. L'énergie de ces électrons ce communique aux électrons de la substance chimique qui sautent à un niveau d'énergie supérieur. Mais comme dans le cas d'un gaz ionisé les électrons retombent à leur niveau d'énergie initiale en émettant un photon.

Dans un VFD il y a une anode par segment d'affichage. Par exemple s'il s'agit d'une calculatrice on a 8 segments par chiffre en incluant le point pour les décimales. Chaque anode doit-être contrôlée individuellement. En fait l'affichage est multiplexée. C'est à dire qu'il y a une cathode par chiffre et seulement 8 électrodes partagées par tous les chiffres. Un seul chiffre est allumé à la fois. La persistance rétinienne nous fait croire qu'ils sont tous allumés simultanément. La grille elle sert a contrôler l'intensité de l'affichage. Si on applique un voltage négatif sur la grille il y aura moins d'électrons qui passeront de la cathode aux anodes.

Tube fluorescent

Qu'il s'agisse de fluo-compact ou de tube fluorescent le principe est le même et combine 2 principes l'ionisation d'un gaz et la fluorescence/phosphorescence2.

Leuchtstofflampen-chtaube050409.jpg
« Leuchtstofflampen-chtaube050409 » par Christian Taube. Sous licence CC BY-SA 2.0 de via Wikimedia Commons.

02 Spiral CFL Bulb 2010-03-08 (black back).jpg
« 02 Spiral CFL Bulb 2010-03-08 (black back) » par Sun LadderTravail personnel. Sous licence CC BY-SA 3.0 via Wikimedia Commons.

Dans le tube il y a une faible pression de vapeur de mercure. Le champ électrique ionise le gaz mercure. Le gaz ionisé a un spectre qui émet principalement dans le violet et l'ultraviolet. l'intérieur du tube, comme pour les enseignes au néon de couleur variées, est recouvert d'une substance chimique fluorescente. Cette substance capte les photons ultraviolet et réémet dans le visible. Le spectre lumineux émis dépend de(s) substances utilisé(es). En passant les DEL blanches sont en fait des DEL bleues recouverte elle aussi d'une substance fluorescence. Lorsqu'on achète des tubes fluorescent ou des fluocompacte l'embalage spécifie le spectre d'émission par une température, 2700°, 3000°, etc. Cette température correspond à un autre concept de la mécanique quantique appelé émission du corps noir. Une basse température correspond à un éclaire plus jaune (doux) et une haute température à un éclairage plus bleu (dur). Un éclairage daylight correspond à un spectre d'émission qui se rapproche de celui-du soleil.

notes

  1. Lorsqu'un gaz contient suffisamment d'atomes ionisés pour devenir un conducteur électrique on parle alors de plasma. C'est ce qui se produit lors d'un orage électrique.
  2. Pour comprendre la différence entre fluorescence et phosphorescence voir l'article wikipédia.

vendredi 10 juillet 2015

DEL

DEL acronyme de Diode ElectroLuminescente. La plupart du temps j'utilise l'acronyme anglophone LED. Quel est la différence entre une DEL et une diode rectificatrice? Dans le principe de fonctionnement il n'y en a pas, les deux fonctionnent selon le même principe de mécanique quantique. Dans cet article j'explique la similitude et la différence entre ces deux types de diode.

A la jonction de P et N

A la jonction de semi-conducteurs P et N il se passe un phénomène mystérieux décris par la théorie de la mécanique quantique. Lorsque les électrons traversent cette jonction ils tombent dans des trous et émettent à ce moment un photon. Ces trous ne sont pas des "nids de poules" comme on appelle les trous dans l'asphalte au Québec. Pour que vous puissiez comprendre je vais expliquer ce qu'est une jonction bipolaire dans un semi-conducteur.

Commençons par le tableau périodique. Au dessus de chaque colonne il y a un chiffre romain suivit de la lettre A ou B. Ce chiffre romain correspond au nombre d'électrons de valence. Les électrons de valence sont les électron d'un atome qui participe aux liaisons chimiques. Ces électrons sont faiblement liés au noyau de l'atome et peuvent être libérés de l'emprise de celui-ci facilement. Il y a 3 colonnes qui intéressent les ingénieurs qui fabriquent des composants électroniques à base de semi-conducteurs: 13, 14 et 15. Dans la colonne 14 on retrouve le silicium et le germanium. Dans la colonne 13 le gallium et dans la colonne 15 l'arsenic.

Le silicium a 4 électrons de valence et est utilisé pour fabriquer la majorité des composants semi-conducteurs. Le gallium a 3 électrons de valence et l'arsenic en a 5. Si on forme un cristal avec de l'arséniure de gallium GaAs on obtient un semi-conducteur qui a en moyenne 4 électrons de valence. Les diodes rectificatrices sont fabriquées avec du silicium et les LED qui émettent dans le visible avec de l'arséniure de gallium.

Un semi-conducteur de type P est un semi-conducteur dans lequel a été ajouté un élément qui n'a que 3 électrons de valence. Ce qui a pour effet de créé des trous dans le réseau cristallin. C'est à dire qu'il manque des électrons pour assurer les liaisons atomiques. Le bore et l'indium sont souvent utilisés pour ce rôle.

Un semi-conducteur de type N est un semi-conducteur dans lequel a été ajouté un élément qui possède 5 électrons de valence. Dans ce cas on a un réseau cristallin qui a un surplus d'électrons. Le phosphore est souvent utilisé pour ce rôle.

Les semi-conducteurs de type P sont donc des capteurs d'électrons et les type N sont des donneurs d'électrons.

Dans une chambre à vide ou la galette de silicium ou d'arséniure de gallium est installée on bombarde celle-ci avec des atomes d'impureté, mettons des atomes de bore pour créer un semi-conducteur de type P. Ces atomes de bore s'installent dans le réseau cristallin. Ensuite on bombarde la galette avec des atomes de phosphore mais avec moins d'énergie pour qu'ils s'enfoncent moins profondément. On obtient ainsi une jonction bipolaire PN. C'est à dire une diode1.

Lorsqu'on applique une tension électrique positive sur l'anode par rapport à la cathode les électrons traversent la jonction et viennent combler le manque d'électron. Lorsqu'un électron comble l'absence d'un électron dans le réseau cristallin de type P il perd de l'énergie. En terme quantique il passe à un niveau d'énergie inférieur. Comme l'énergie ne se perd pas cette énergie libérée est émise sous forme de photon, c'est à dire de lumière. La longueur d'onde de ce photon ou si vous préférez sa couleur dépend de la différence d'énergie entre les 2 niveaux.

bandes d'énergie

Dans les conducteurs il y a toujours des électrons dans la bande de conduction. Dans cette bande l'énergie des électrons est plus élevée que dans la bande de valence. dans un semi-conducteur les électrons dans la bande de conduction sont plus rare, c'est pourquoi ils conduisent mal l'électricité. C'est lorsqu'un électron passe de la bande de conduction à la bande de valence qu'il libère le surplus d'énergie sous forme de photon. Dans les diodes au silicium l'énergie est plutôt libérée sous forme de phonon. Un phonon est une vibration qui se propage dan le réseau cristallin.

Barrière de potentiel et niveaux d'énergies

Dans la région à la jonction de la zone P et N il y a une zone appauvrie. Une zone ou l'influence du phosphore et du bore s'annule mutuellement. Cette zone forme une barrière qui empêche le courant de circuler à travers la jonction. Il faut que les électrons possèdent une énergie minimale pour franchir cette barrière. Cette valeur correspond au voltage minimum nécessaire pour que la diode conduise. Pour une diode au silicium c'est environ 0,65 volt. Pour les DEL ça dépend du type de DEL, pour les rouges c'est environ 2,1 volt, 2,4 pour les vertes et 3,4 pour les bleues.

La valeur de cette barrière de potentiel est lié à l'énergie nécessaire pour arracher les électrons au réseau cristallin. Pour les faire sortir de leur trou. L'énergie d'un photon est inversement proportionnel à sa longueur d'onde donc une DEL qui émet de photons bleus a une barrière de potentiel plus élevée qu'une DEL qui émet des photons rouges.

photo-sensibilité

On a dit que lorsqu'un électron tombe dans un trou il émet un photon dont l'énergie égale la différence d'énergie que l'électron dans la bande de conduction avait et celle qu'il a une fois coincé dans le réseau cristallin (bande de valence). Cette différence d'énergie s'appelle bande interdite ou band gap en anglais. Bande interdite parce que l'électron ne peut occupé un niveau d'énergie intermédiaire entre ces 2 niveaux. C'est ça la nature quantique de l'univers subatomique.

Si un électron émet un photon lorsqu'il tombe dans un trou le contraire est aussi vrai. Un photon peut déloger un électron de son trou en lui communiquant son énergie. En conséquence toute DEL est photo-sensible. Connectez un voltmètre aux électrodes d'une DEL et exposez celle-ci à la lumière. vous constaterez qu'il y a un voltage aux bornes de la DEL. couvrez la DEL et le voltage disparait. La jonction absorbe les photons et déloge des électrons du réseau cristallin. Il va sans dire que la DEL est particulièrement sensible à la même longueur d'onde qu'elle émet.

Sens unique

Au fait pourquoi une diode ne conduit que dans un sens? C'est simple les trous n'ont pas de mobilité se sont les électrons qui se déplacent dans le réseau. Si on applique le voltage positif sur la cathode les électrons s'éloignent de la jonction plutôt que de la traverser. la zone appauvrie s'élargie au lieu de se rétrécir. Cependant si le voltage est suffisamment élevé les électrons peuvent-être arrachés du réseau dans la partie P de la diode et traverser la jonction. le voltage ou ce phénomène se produit est la tension de claquage ou breakdown voltage en anglais. Lorsque cette tension est atteinte il se produit un phénomène d'avalanche. C'est à dire que les électrons ainsi délogés du réseau cristallin possèdent suffisamment d'énergie pour à leur tour déloger d'autres électrons. Le courant augmente donc rapidement et si le phénomène n'est pas contrôlé il conduit à la destruction de la diode. Les diodes zener utilisent ce principe d'avalanche.

notes

  1. Notez que bien que j'ai indiqué le bore dans le dessin comme impureté pour le côté P de la jonction en ce qui concerne les DEL l'aluminium et l'indium sont plutôt utilisés. Le bore lui est utilisé avec le silicium. Si vous consultez les feuillets de spécifications des DEL vous verrez des compositions du genre InAlGaP, InGaN/GaN ou GaAlAs. In pour indium colonne 13 donc 3 électrons de valence. Al pour Aluminium aussi dans la colonne 13 donc aussi 3 électrons de valence. N pour azote, colonne 15 donc 5 électrons de valence. As pour Arsenic colonne 15. Le choix des éléments dépend du niveau d'énergie entre la bande de conduction et la bande de valence, ce qui détermine la longueur d'onde.

jeudi 9 juillet 2015

CMOS

De nos jours les circuits intégrés logiques sont fabriqués sur des galettes de silicium monocristallin d'une pureté de 99,999 999 99% en utilisant la technologie appellée CMOS. Dans cette article j'explique ce qu'est la technologie CMOS.

Transistor à effet de champ

Le composant actif de l'électronique moderne est le transistor. Les premiers transistors mis en marché étaient basés sur le germanium et étaient de type bipolaires. Mais rapidement le silicium a remplacé le germanium et les transistors à effet de champ ont remplacé les bipolaires. Plus spécifiquement il s'agit de transistors MOSFET ce qui est un acronyme anglophone pour Metal Oxide Semiconductor Field Eeffect Transistor. Il y a 2 types de transistors MOSFET, P-MOSFET et N-MOSFET. Ensemble ils forment une paire complémentaire d'ou l'acronyme anglophone CMOS qui signifie Complementary Metal Oxide Semiconductor.

Complémentaire

Un transistor MOSFET a 3 électrodes, le Drain, la Source et le Gate. Le G est l'électrode de contrôle, c'est à dire qu'elle permet de contrôler le courant qui circule entre le drain et la source. Le semi-conducteur de silicium situé entre le drain et la source s'appelle Channel (canal). Ce canal est séparé du gate par une mince couche d'oxyde de silicium qui est un isolant électrique. Il n'y a donc pas de courant qui circule entre le gate et la source ou le drain. Le contrôle est assuré par le champ électrique entre le gate et le canal créé par la tension appliquée sur le gate.

structure d'un transistor MOSFET

Les transistors MOSFET utilisés dans les circuits logiques sont de type enrichi. Les transistors à enrichissement ne conduisent pas lorsqu'il n'y a aucun voltage entre le gate et la source. C'est parfait pour les circuits logiques, pas de voltage le courant ne passe pas, on applique un voltage et le courant passe, c'est naturellement binaire.

Dépendant de l'élément chimique utilisé pour enrichir1 le canal, le transistor sera de type P ou N. les symboles électroniques sont les suivants:

Les transistors N-MOSFET fonctionnent avec le drain à un voltage positif par rapport à la source et il faut appliquer un voltage positif sur le gate par rapport à la source pour les mettre en conduction.

Les transistor P-MOSFET fonctionnent avec le drain à un voltage négatif par rapport à la source et il faut appliquer un voltage négatif sur le gate par rapport à la source pour les faire conduire.

Une paire complémentaire est contruite comme ceci:

Lorsque l'entrée est au voltage Vss le transistor N-MOSFET est bloqué tandis que le P-MOSFET conduit on a donc à la sortie Vdd. L'inverse se produit lorsque l'entrée est à Vdd, on a donc un inverseur. Ce montage complémentaire est la base de toutes les portes logiques qui construisent un microprocesseur. A titre d'exemple voici le montage d'un NOR GATE:

Tenant que de ce qui est écris au paragraphe précédent vous pouvez comprendre le fonctionnement de ce circuit.

On pourrait très bien construire un ordinateur en utilisant des transistors élémentaires complémentaires comme le 2N700 qui un N-MOSFET et le TP0606N3 qui est un P-MOSFET. Cependant il en faudrait des milliers. James Newman a d'ailleurs entrepris un tel travail, sauf qu'il n'utilise pas de paires complémentaires, seulement des NMOS. Le premiers MCU comme le 6502 du Apple II était construit en NMOS. Mais les 6502 d'ajourd'hui frabriqués par Western Design Center sont en CMOS d'ou le C dans W65C02.

L'avantage du CMOS est la faible consommation de courant. En effet s'il n'y a pas de charge de branchée à la sortie aucun courant ne passe à travers le transistor qui est en conduction. Le courant ne circule entre les 2 transistors qu'au moment de la commutation. Pendant un bref instant les 2 transistors sont en conduction partielle lorsque le voltage sur le gate est à mi-chemin entre Vss et Vdd. Comme le circuit d'un MCU est construit de portes logiques dont les sorties sont branchées sur des entrées d'autres portes logiques, le seul courant qui circule à l'intérieur du MCU est le courant de transition entre 2 états. C'est pour cette raison que lorsqu'on met un MCU en sommeil profond, c'est à dire lorsque le signal clock est arrêté, il ne consomme que des nanoampères.

Ceci explique aussi pourquoi les manufacturiers nous disent de ne pas laisser les entrées flottantes. En effet ces entrées étant à très haute impédance réagissent à tous les champs électromagnétiques environnant ce qui fait commuter les portent d'entrées rapidement de façon aléatoire d'où une consommation accru du micro-contrôleur.


notes

  1. Pour avoir un semi-conducteur de type N on introduit dans le silicium des atomes qui ont 5 électrons de valence comme le phosphore, l'arsenic et l'antimoine. Pour obtenir un semi-conducteur de type P on introduit dans le silicium des atomes qui ont 3 électrons de valence comme le bore et l'indium. Ces éléments sont introduits en très faible quantité .

mardi 19 mai 2015

Tuteur de code morse

Cet article décris un tuteur de code morse, c'est à dire un petit circuit qui aide à l'apprentissage du code morse.

code morse

Le code morse est un code à rythme, c'est à dire que l'information est encodée dans la durée relatives des éléments, aussi bien la durée des sons que le silence entre ceux-ci porte une signification. Ainsi un son court appelé DIT est l'unité de base du tempo, tous les temps sont relatif à la durée du DIT.

Il y a deux durées sonores et 3 durées de silence.

  • DIT est un son court.
  • DAH est un son long dont la durée est 3 fois celle du DIT.
  • A l'intérieur d'un caractère le silence entre les sons dure 1 DIT.
  • Entre les caractères d'un mot le silence dure 3 DIT.
  • Entre chaque mot le silence dure 5 (Amérique) ou 7 (Europe) DIT.
Le nombre de symboles varie d'un caractère à l'autre. Les caractères les plus utilisés sont plus courts et les moins utilisés plus long.

En Amérique du nord l'apprentissage du MORSE n'est plus requis pour obtenir une licence radio-amateur. Mais lorsque c'était requis un appliquant devait-être en mesure de lire et de produire un message en morse à la vitesse de 5 mots par minute pour obtenir la licence de base. Ce tuteur émet et lit à la vitesse correspondant à 5 mots par minute. C'est la constante DIT définie au début du fichier source qui détermine le tempo, en diminuant sa valeur on accélère le tempo.

Le circuit

Le circuit est réalisé avec un PIC10F322. Il utilise une LED bicolore rouge/verte pour signaler différents états et un petit haut-parleur pour émettre les codes. La clé morse est branchée sur l'entrée RA3. Il s'agit d'une clé simple (straight key).

Le fonctionnement est le suivant, le tuteur émet un caractère et l'élève doit reproduire celui-ci. Si l'élève échoue parce qu'il n'a pas le bon rythme la LED clignote 3 fois en rouge avant de réémettre le même caractère. Si le rythme est bon mais que la séquence n'est pas bonne la LED clignote 4 fois en rouge. Si l'élève réussi à reproduire correctement le code morse la LED allume brièvement en vert avant que le tuteur n'émette le caractère suivant. Pendant l'émission du caractère la LED allume orange et l'élève doit attendre que la LED éteigne avant de commencer à reproduire le code.

Il y a 4 groupes de caractères et le tuteur passe de l'un à l'autre lorsqu'un groupe est complété.

  1. lettres 'A' - 'Z'
  2. chiffres '0' - '9'
  3. ponctuations '!' - '/'
  4. ponctuations ':' - '@'
A l'intérieur de chaque groupe l'ordre est celui de la table ASCII. Si l'élève n'arrive pas à reproduire un caractère il peut sauter au suivant en tenant la clé enfoncée jusqu'à ce que la LED allume rouge. À ce moment l'élève doit relâcher la clé, à la suite de quoi le caractère suivant est émis.

le code source

Une clé fait maison

Après avoir fait des recherches dans l'internet et constater qu'une clé morse même la plus simple de type Straight key coûte plus de 50US$ j'ai décidé d'en fabriquer une avec les matériaux que j'avais sous la main.

Fabrication:
  • base: chêne 60mm x 120mm x 20mm
  • levier: chêne, longueur 90mm, épaisseur 5mm, hauteur 10mm.
  • Un bouton collé avec de la colle chaude à l'extrémité du levier.
  • Appui du levier: petit bloc de chêne, hauteur 22mm, largeur 18mm, profondeur 15mm. Découpé en U.
  • contacts: 2 boulons chromés. Celui vissé dans la base a la tête limée pour formé une surface plate. Les fils son bobiné 3 tours sur ces boulons et soudés.
  • Le ressort de rappel proviens d'un stylo à bille à pointe rétractable. Un trou est percé dans la base pour le maintenir et un petit boulon passe à travers le levier et glisse à l'intérieur du ressort.
  • Un autre boulon à l'autre extrémité du levier passant à travers celui-ci permet d'ajuster la distance entre les contacts. Son extrémité est appuyé sur un autre petit bloc de chêne collé à la base.
  • 2 petites équerres disponibles dans n'importe quelle quincaillerie servent de support aux prises jack 4mm.
  • On ne peut le voir sur la photo mais les points de pivot du levier sont constitués de 2 têtes de vis que j'ai d'abord limé et ensuite rendu concave en utilisant un foret. l'extrémité des vis qui passent à travers le bloc supportant le levier appuient dans la cavité des têtes de vis pour former un pivot stable.

séance d'apprentissage

On ne voit pas correctement les différentes couleurs de la LED indiquant l'état, mais on peut voir que la LED clignote lorsque j'échoue à répéter correctement le code entendu. Au départ j'avais mis une tolérance de 25% sur les durées mais je l'ai augmenter à 50% car c'était trop difficile à 25%. C'est la fonction symb_len qui contrôle la valeur des durées.


références

  1. code morse
  2. alphabet morse
  3. codes Q