Écran texte 16*2 VFD en lieu et place du LCD

Certains le savent, juste derrière les leds, j’adore les écran LCD type HD44780 (lcdproc, lcd4linux, etc). Je viens de recevoir des 16T202DA1J de Samsung achetés sur eBay pour moins de 20 Euros pièces (port inclus). Certes, c’est deux fois plus cher que le LCD mais franchement, ça a une autre gueule. Comme le brochage est parfaitement compatible avec les LCD HD44780, c’est interchangeable directement sur mon module USB/série/AVR permettant un contrôle USB de l’affichage. De quoi décorer bon nombre de montages embarqués et mes serveurs…

Bon, on ne peut pas faire de PWM sur le rétro-éclairage (puisqu’il n’en en a pas) mais le rendu et la luminosité de l’ensemble compense largement.

Programmeur ISP USB pour AVR

Les programmeurs de type dapa sont économiques, efficaces et très simples. Mais ils dépendent d’un port clairement en voie de disparition sur les machines modernes : le port parallèle. Peu d’adaptateurs USB/parallèle existent, il s’agit en forte majorité d’USB/printer (lp) avec lesquels il n’est pas possible de contrôler les lignes DATA, CONTROL et STATUS individuellement.

On peut alors se tourner vers le dasa, adaptateur pour port série utilisant du bit banging mais, là encore, on rencontre des problèmes puisque tous les pilotes ne supportent pas la palette d’ioctl nécessaires.

Finalement, pour pouvoir développer et programmer un Atmel AVR via USB (sur un lappy par exemple), il ne reste pas d’autre choix simple que d’investir quelques euros (moins de 30 euros avec le port sur eBay)  dans un programmeur USB compatible STK500v2 (chercher « USB ISP-Programmer »).

(Le miens est vert fluo et livré avec un câble également vert, très bon produit, joli design, super propre)

La chose est reconnu comme ttyACM0: USB ACM device par Linux et on en profite pour ajouter une règle udev :
SUBSYSTEMS== »usb », KERNEL== »ttyACM* », ATTRS{product}== »DX-ISP », SYMLINK+= »STK500″
Ainsi, le périphérique est accessible systématiquement via /dev/STK500. On flash un AVR avec avrdude ainsi :
% avrdude -p t13 -c stk500v2 -P /dev/STK500 -i 5 -U flash:w:main.hex
A moi le développement AVR dans le TER. Luvz !

PWM 4 canaux en C sur Attiny2313

Juste un petit bout de code en passant. Pour ceux qui voudraient utiliser les 4 canaux de PWM des Amtel AVR Attiny2313, voici la configuration :
  DDRB |= (1<<PB2);               // make OC0A an output
  DDRD |= (1<<PD5);               // make OC0B an output
  DDRB |= (1<<PB3);               // make OC1A an output
  DDRB |= (1<<PB4);               // make OC1B an output

  TCCR0B = 0;                     // stop timer 0
  TCCR0A = (1<<WGM00)|(1<<WGM01); // select fast pwm mode 3
  TCCR0A |= (1<<COM0A1);          // Clear OC0A on Compare Match when up-counting.
                                  // Set OC0A on Compare Match when down-counting.
  TCCR0A |= (1<<COM0B1);          // Clear OC0B on Compare Match when up-counting.
                                  // Set OC0B on Compare Match when down-counting.
  OCR0A = 0x00;                   // duty cycle
  OCR0B = 0x00;                   // duty cycle
  TCCR0B |= (1<<CS00);            // no prescaling, timer on

  TCCR1B = 0;                     // stop timer 1
  TCCR1A = (1<<WGM12)|(1<<WGM10); // Fast PWM, 8-bit mode 5
  TCCR1A |= (1<<COM1A1);          // Clear OC1A on Compare Match when up-counting.
                                  // Set OC1A on Compare Match when down-counting.
  TCCR1A |= (1<<COM1B1);          // Clear OC1B on Compare Match when up-counting.
                                  // Set OC1B on Compare Match when down-counting.
  OCR1A = 0x00;                   // duty cycle
  OCR1B = 0x00;                   // duty cycle
  TCCR1B |= (1<<CS10);            // no prescaling, timer on
Il ne reste, ensuite qu’à changer la valeur de OCR0A, OCR0B, OCR1A ou OCR1B pour modifier le rapport de phase.

Ecran LCD 2*16 série/USB via AVR Attiny2313

Décidément aujourd’hui je n’arrête pas ! Cela faisait longtemps que j’avais cette idée en tête : monter un afficheur LCD alpha-numérique sur USB/série. Voilà chose faîte avec un petit AVR Attiny2313.

La connectique est simple :
LCD (1 ) : Masse
LCD(2) : Vcc +5V
LCD(3) : Contraste ((connecté à Masse)
LCD(4) : RS (1=data, 0=commande) : AVR Port D PD5
LCD(5) : RW (1=read, 0=write) : AVR Port D PD4
LCD(6) : Enable : AVR Port D PD3
LCD(7-14) : data 0-7 : AVR Port B PB0-PB7

L’Attiny2313 est configuré pour la communication série à 19200 avec un quartz à 14.7456 Mhz.

Le code n’est qu’un début mais il permet déjà d’afficher du texte sur les deux lignes de l’afficheur. Quelques essais montrent qu’il est relativement facile de créer les 8 caractères programmables si on respecte bien la datasheet et les timings. Le code est, pour l’instant, relativement bouillon. C’est normal ;)
serialint.c
makefile
common.mk

Le but n’est pas vraiment d’obtenir un firmware complet permettant toutes les opérations possibles comme ce qui existe déjà dans les boutiques sur le Web (quoi que, si j’ai le temps). Il s’agit d’avoir un périphérique d’affichage simple pouvant se connecter en TTL, RS232 et/ou USB sur un système embarqué comme une Fonera, Fonera+ ou Fonera 2. Je pourrai alors voir en temps réel les connexions Wifi et autres informations de base pour un AP.

Décidément, j’adore le 2313, c’est vraiment mon microcontrôleur préféré.

Quelques liens :
http://www.quinapalus.com/hd44780udg.html
http://home.iae.nl/users/pouweha/lcd/lcd0.shtml
http://www.geocities.com/dinceraydin/lcd/custom.htm

Base de travail pour différents projets à base d'AVR en C

Je travail sur différentes choses autour des microcontrôleurs Atmel AVR à l’heure actuelle. Je n’en dirai pas trop pour le moment, mais cela touche à la PWM et aux leds (comme souvent) ainsi qu’aux ports séries/USB. Dans le tas, il y a une signalisation lumineuse pour notre salle de réunion (dans la GLMFcave), le projet coccilight et un projet secret (tant qu’il sera pas terminé) qui manque encore d’éléments de décoration (bricoler un truc laid plein d’epoxy et de soudure c’est facile, arriver à quelque chose de présentable c’est une autre affaire).

Quoi qu’il en soit, j’ai dernièrement joué un peu avec un de mes vieux codes en assembleur Atmel que j’ai réimplémenté en C pour un AVR Attiny13 : la pulsation d’une led en PWM utilisant des valeurs sinusoïdales stockées dans la Flash du microcontrôleur.

Le stockage à proprement parler prend cette forme :
const uint8_t dasin[] PROGMEM = {
255,255,255,255,255,254,254,253,252,252,251,250,249,248,247,246,
245,243,242,240,239,237,236,234,232,230,228,226,224,222,220,218,
216,213,211,209,206,204,201,199,196,193,191,188,185,182,179,176,
174,171,168,165,162,159,156,152,149,146,143,140,137,134,131,128,
124,121,118,115,112,109,106,103,99,96,93,90,87,84,81,79,
76,73,70,67,64,62,59,56,54,51,49,46,44,42,39,37,
35,33,31,29,27,25,23,21,19,18,16,15,13,12,10,9,
8,7,6,5,4,3,3,2,1,1,1,1,0,0,0,0,
0,0,0,0,1,1,1,2,3,3,4,5,6,7,8,9,
10,12,13,15,16,18,19,21,23,25,27,29,31,33,35,37,
39,42,44,46,49,51,54,56,59,62,64,67,70,73,76,79,
81,84,87,90,93,96,99,103,106,109,112,115,118,121,124,127,
131,134,137,140,143,146,149,152,156,159,162,165,168,171,174,176,
179,182,185,188,191,193,196,199,201,204,206,209,211,213,216,218,
220,222,224,226,228,230,232,234,236,237,239,240,242,243,245,246,
247,248,249,250,251,252,252,253,254,254,255,255,255,255,255,255
};
Après quelques define préalables et autres choses indispensables en début de code…
#define F_CPU 2000000UL

#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include <avr/eeprom.h>
#include <avr/interrupt.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <avr/sleep.h>
#include <avr/wdt.h>
#include <util/delay.h>

#define PWMDDR     DDRB
#define PWMOUT     PB0
#define MCUCSR     MCUSR
#define DELAY      5

uint8_t mcucsr __attribute__((section(« .noinit »)));
…on peut s’attaquer à la fonction main :
int main (void) {
volatile uint8_t j;

TCCR0A = _BV(WGM00) | _BV(WGM01) | _BV(COM0A1) | _BV(COM0A0);
TCCR0B = _BV(CS00);

OCR0A = 0;

PWMDDR |= _BV(PWMOUT);

while (1) {
for(j=0;j<255;j++) {
OCR0A = pgm_read_byte(dasin+j);
_delay_ms(DELAY);
}
}
}
Voilà, c’est tout. La table des valeurs est le résultat d’un calcul détaillé dans un précédent billet. Rien d’extraordinaire dans tout cela, certes, mais comme j’ai un peu creusé dans le code d’autres personnes et sur Google, donc je fais tourner…

Adaptateur USB/Série TTL

Enfin, enfin mes amis bulgares m’ont expédiés ma commande sur eBay. L’objet ? Un sympathique adaptateur USB/série (FTDI) vers TTL. En clair, on entre en USB, Linux voit un port série supplémentaire, mais l’interface se fait en TTL (5V) ou 3.3V. Fini les adaptateurs USB/Série RS232 en +/-12V puis RS232/console TTL. Je peux, à présent, connecter directement un microcontrôleur AVR Attiny2313 via son UART avec une box Linux USB (ou une Fonera 2.0).

C’est tout petit et ça simplifie grandement les choses. Je suis maintenant en mesure de développer des périphériques USB (sans consommer la majorité de la Flash de l’AVR).

Que voit Linux ? Ceci :

[862432.095490] usb 5-3.4: FTDI USB Serial Device converter now attached to ttyUSB1
[862432.096332] usb 5-3.4: New USB device found, idVendor=0403, idProduct=6001
[862432.096336] usb 5-3.4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[862432.096340] usb 5-3.4: Product: FT232R USB UART
[862432.096343] usb 5-3.4: Manufacturer: FTDI
[862432.096345] usb 5-3.4: SerialNumber: A90066ac

Et en plus c’est tout choupy :

Ça vaut 15€/pièce, mais quel gain d’espace, de ressources et de temps ! Viens, Fonera 2.0 ! Je vais te faire parler avec le monde du dehors !

Nouveau (tout petit) jouet : Atmel Attiny13

Il est tout petit (DIP8) mais c’est un costaud. Ce microcontrôleur Atmel AVR ressemble fortement au classique Attiny15L mais il y a quelques différences, dont une de taille.

La datasheet dit « 64K Bytes Internal SRAM » (note, en fait il y a 64 octets de SRAM, la datasheet a une typo). Ah aaahhh ! Vous savez ce que ça veut dire ? Tout simplement que la stack est en SRAM, il faut donc la configurer (en assembleur AVR) mais surtout, nous ne sommes plus limité comme avec l’attiny15 à 3 ridicules niveaux de sauts. Et surtout, surtout… ce petit bijou peut être programmé en C avec AVR-GCC et l’AVR-libc.

Donc :
6 GPIOs
64o SRAM + 32 registres
64o EEPROM
Timer 8bits
2 canaux PWM
ADC 10bits 4 canaux
Watchdog
ICSP

Il ne manque que l’UART. Mais on ne va pas chipoter pour un AVR qui coûte 1,50 € et qu’on peut programmer avec un adaptateur « maison » sur port parallèle qui revient à quelques euros (ou à rien du tout avec des composants de récupération). Les montages suivront d’ici peu si je trouve des bonnes idées et du temps.