Récepteur Infra-rouge USB

Dans un précédent billet j’ai détaillé l’utilisation d’AVRlirc de Paul Fox. Voici un petit hack permettant consistant à le lier avec un adaptateur série/USB pour en faire un ensemble IR/USB.

Il n’y a pas grand chose à dire si ce n’est qu’on récupère directement le +5V sur le câble USB juste avant l’adaptateur. Une fois connecté le périphérique est vu comme un /dev/ttyUSB* qu’il suffit d’utiliser avec avrlirc2udp. Un peu de configuration Lirc et c’est un total bonheur pour des présentations ou toutes autres choses.

J’utilise ce montage pour palier au manque de sensibilité du capteur IR de mon ThinkPad x31 pourtant utilisable avec Lirc. La portée est impressionnante même avec des petites télécommandes comme celles qu’on peut trouvez pour quelques Euros sur ebay :

Fonera en récepteur infrarouge

Dans un précédent article, je vous parlais de la nouvelle solution pour mettre en place un récepteur IR compatible Lirc sous GNU/Linux sans utiliser de module kernel via un petit montage utilisant un AVR Attiny2313. Utilisant une simple ligne RX en TTL il devient possible de l’utiliser sur un système embarqué disposant d’un port série simple (RX/TX en TTL 0/5V), j’ai nommé : La Fonera !

La solution est toute simple. Puisque le montage AVRLirc utilise une ligne RX il est possible de le connecter au port série normalement utilisé pour la console série de La Fonera. Le connecteur dans le routeur se présent ainsi :

Il suffit de connecter la patte 3 de l’AVR sur RX sans oublier la masse et récupérer l’alimentation +5V sur le circuit du routeur, tout près du connecteur d’alimentation. Le Vcc du connecteur console ne délivre qu’une tension de 3.3V.

Il faut ensuite construire un firmware OpenWRT et le configurer pour ne plus utiliser la console série. Plusieurs éléments de configuration doivent être changés.
Configurer le kernel via make kernel_menuconfig puis retirer des arguments par défaut passés au kernel la mention de la console série (Kernel Hacking / Default kernel command string).
Toujours dans la configuration du kernel, supprimer la console série : Device Drivers / Character devices / Serial drivers / Console on 8250/16550 and compatible serial port doit être désactivé.
Désactiver la console série dans l’inittab du firmware. Il suffit de supprimer la ligne concernant ttyS0 dans package/base-files/files/etc/inittab.

Une fois le firmware construit et installé sur La Fonera, le seul moyen de contacter le système est Telnet. Laissez démarrer le système (la première fois cela met un peu de temps en raison de l’effacement de la Flash non utilisée), connectez-vous en Telnet et définissez un mot de passe pour l’utilisateur root. Ceci aura pour effet d’activer le serveur SSH et de désactiver telnetd.

Configurez le système pour qu’ipkg puisse être utilisé correctement puis installer avrlirc2udp, le client. Voici un paquet binaire pour Kamilaze 7.09 et un tarball des sources à placer dans le répertoire package de l’arborescence OpenWrt :
Paquet IPKG
Tarball sources

Il ne vous reste plus qu’à configurer Lircd sur la machine hôte de votre choix en réception UDP (comme dans le billet précédent sur le sujet) et, sur le routeur d’utiliser :
avrlirc2udp -H -t /dev/ttyS0 -h 192.168.0.1
Vous disposez maintenant d’un routeur capable de recevoir des signaux IR et de les transmettre au serveur Lirc via une liaison filaire ou Wifi.

RedBoot reste utilisable au démarrage du routeur et le fait qu’il envoi des données sur le port série n’est pas un problème. La ligne TX du port du routeur n’est pas connecté. Il en va tout autrement s’il s’agit d’utiliser ce port série pour autre chose comme un modem ou un afficheur LCD. Sans doute la prochaine étape du voyage dans le hack de La Fonera.

PS : Si, comme moi, vous avez reconfiguré RedBoot pour un délai plus important (10s) il est possible de se passer du port série. Au moment du démarrage du routeur, RedBoot est en attente de connexion sur le port 9000 (à condition qu’il soit configuré correctement, IP, masque, etc). 10 secondes laissent largement le temps de se connecter avec un telnet. Malheureusement, je n’ai pas trouvé d’autre moyen pour envoyer un ^C que de faire :
% cd /tmp
% cat > break
[CTRL+V][CTRL+C][Entrée]
[CTRL+D]
puis
% nc -vvv 192.168.0.12 9000 < break; telnet 192.168.0.12 9000
C’est pas beau, il y a sûrement mieux, mais ça marche.

Télécommande Infrarouge

Il y a quelque temps déjà, j’avais écrit un article dans GLMF à propos du projet Lirc permettant d’utiliser n’importe quelle télécommande infrarouge pour contrôler des applications sous GNU/Linux. Le montage principal proposé par le projet est fort simple : un récepteur TSOP1736 connecté via quelques composants sur un port série. Malheureusement, le montage utilise directement la ligne DCD du port série via un module kernel. Ceci rend la chose impossible à utiliser via un convertisseur USB/série ou un système ne disposant pas de la ligne en question. De plus, l’utilisation d’un module rend difficile le portage sur un autre système. En cherchant un peu, je suis tombé sur le projet avrlirc de Paul Fox. Un pur bonheur…

Comme son nom l’indique la solution proposée par Paul utilise un microcontrôleur Atmel AVR. Un Attiny2313 pour être précis (mon préféré).

Côté hardware, le montage est simpliste. L’AVR est tout simplement utilisé avec un quartz de 14.7475 Mhz afin de pouvoir communiquer sans erreur avec un port série en 115200bps (voir page 140 du datasheet Attiny2313) . D’autres configuration, même sans quartz sont possibles. Le récepteur TSOP1736, le même que pour le montage série Lirc, est directement connecté à la broche 11 du microcontrôleur. La led connectée sur 9 est optionnelle, elle permet de visualiser une réception IR. Le reste relève de la mise en oeuvre classique de l’Attiny2313.

Attention toutefois, il ne faut en aucun cas connecter directement RX/TX sur le port série d’un PC, les tensions sont totalement incompatibles et cela risque de fumer et sentir mauvais très rapidement. Il existe plusieurs solutions pour ajuster les niveaux de tensions. La mise en oeuvre d’un MAX232 en est une. Pour ma part, j’ai tout simplement utilisé le montage permettant d’accéder à la console de la Fonera. Mon propre montage d’interface TTL/RS232.

Côté software nous avons deux éléments. D’une part le firmware pour l’AVR. Ecrit en C et compilable avec GCC. Il ne nécessite qu’une petite modification concernant la vitesse du port série (macro FOSC). On compile et on charge dans l’AVR via AVRdude (n’oubliez pas de configurer les fuses pour l’utilisation du quartz).

Enfin, nous avons un sympathique code, avrlirc2udp. C’est la partie cliente écoutant le port série et envoyant les données au démon lircd.

Une fois tout cela joyeusement assemblé on installe, avec Debian, le paquet lirc. Pour enregistrer une télécommande on utilisera :
% ./avrlirc2udp -H -t /dev/ttyUSB0 -h localhost
Puis :
% sudo irrecord –driver=udp mon_fichier
Il suffit ensuite de suivre les indications et on obtient un fichier contenant les associations bouton/code pour la télécommande en question. On copie simplement de fichier sous /etc/lirc/lircd.conf puis on configure /etc/lirc/hardware.conf en spécifiant :
LOAD_MODULES=false
DRIVER= »udp »
DEVICE= »none »
Et voilà. Il ne reste plus qu’à configurer son ~/.lircrc pour associer les boutons aux actions des applications supportant Lirc (xmms, mplayer, etc). Chose intéressante, comme tout se passe en UDP il est parfaitement possible de mettre le récepteur sur un machine différente de celle qui est pilotée. Mieux encore, comme l’utilisation du port série est devenu parfaitement normale (utilisation de RX et non de DCD) ceci devient utilisable sur, par exemple, une Fonera. C’est la prochaine étape pour moi : le portage d’avrlirc2udp sur la fonera et la configuration du port série, non plus pour une console mais comme un port standard pour la connexion du montage. Au final, ma Fonera sera donc en mesure de recevoir des codes IR/RC5 et, soit les utiliser, soit les forwarder à une autre machine en UDP via Wifi.

PWM logicielle sur Atmel AVR Attiny2313

Travaillant sur un projet de présentoire lumineux, j’ai eu besoin de disposer de plus que les quelques canaux de PWM que n’en proposent généralement les microcontrôleurs. En particulier les petits AVR comme l’Attiny2313. La seule solution restante était donc de se passer de ces fonctionnalités et d’implémenter la PWM en logiciel de manière à pouvoir piloter un minimum de 6 leds via les port E/S standards.

Le principe de fonctionnement est simple. En réglant l’un des timers de manière à obtenir le maximum de tops d’horloge possible, la plus haute fréquence donc, on peut implémenter, sous la forme d’un compteur et d’une poignée de comparaisons une PWM acceptable. Le début du code est tout ce qu’il y a de plus classique :
.device attiny2313

.def T1 = r1
.def T2 = r2
.def temp = r16
.def truc = r17
.def cpt = r18
.def savestatus = r20
.def zlow = r21
.def zhigh = r22
.def pwm1 = r19
.def pwm2 = r23
.def pwm3 = r24
.def pwm4 = r25
.def pwm5 = r26
.def pwm6 = r27

.org 0x0000
rjmp RESET
.org 0x000D
rjmp TIM0A_CMP
.org 0x0013
Vient ensuite la routine d’interruption correspondant à la comparaison de timer. Ici on trouve cpt, le compteur. Il est incrémenté à chaque interruption puis sa valeur est comparée aux variables réglant le PWM pour chaque sortie. Tant que le compteur est en dessus de la valeur d’une variable la sortie correspondante est active. Si le compteur est au delà, la sortie est à la masse. Notez qu’il faut penser à sauvegarder le registre d’état car les comparaisons successives risquent de perturber les drapeaux et donc de nuire au bon fonctionnement du reste du code :
TIM0A_CMP:
in savestatus,SREG
inc cpt

cp cpt,pwm1
brlo lowrouge
cbi PORTB,PB4
rjmp vert
lowrouge:
sbi PORTB,PB4
vert:
cp cpt,pwm2
brlo lowvert
cbi PORTB,PB3
rjmp bleu
lowvert:
sbi PORTB,PB3
bleu:
cp cpt,pwm3
brlo lowbleu
cbi PORTB,PB2
rjmp uv
lowbleu:
sbi PORTB,PB2
uv:
cp cpt,pwm4
brlo lowuv
cbi PORTB,PB1
rjmp blanc
lowuv:
sbi PORTB,PB1
blanc:
cp cpt,pwm5
brlo lowblanc
cbi PORTB,PB0
rjmp jaune
lowblanc:
sbi PORTB,PB0
jaune:
cp cpt,pwm6
brlo lowjaune
cbi PORTB,PB5
rjmp fin
lowjaune:
sbi PORTB,PB5
sbi PORTB,PB5
fin:
out SREG,savestatus
reti
On définit également deux petites routines de retardement :
mini:
clr T1
hop:
dec T1
brne hop
dec temp
brne hop
ret

micro:
dec temp
brne micro
ret
Enfin, on arrive au reste où il faut, dans l’ordre, définir la pile, utiliser l’octet de calibration propre à chaque AVR, placer les ports en sortie, définir l’effacement du timer en comparaison, le prescaling, le niveau de référence pour la comparaison et le déclenchement d’une interruption en comparaison :
RESET:
ldi temp, 0x70
out SPL, temp

ldi temp,0x52
out OSCCAL,temp
ldi temp,0xf0
rcall mini

sbi DDRB,PB0
sbi DDRB,PB1
sbi DDRB,PB2
sbi DDRB,PB3
sbi DDRB,PB4
sbi DDRB,PB5

ldi temp,(1<<WGM01)
out TCCR0A,temp

ldi temp,(1<<CS00)
out TCCR0B,temp

ldi temp,0x02
out OCR0A,temp

ldi temp,(1<<OCIE0A)
out TIMSK,temp

sei
Arrive ensuite la boucle principale où l’on pioche dans la mémoire flash les valeurs des variables pwm*. Cette boucle sera interrompue par les interruptions du timer. Cela manque de précision mais est largement suffisant pour faire pulser des leds proprement :
loop: ldi ZH, high(tbpwm1*2)
ldi ZL, low(tbpwm1*2)
add ZL, zlow
adc ZH, zhigh
lpm
mov pwm1,r0

ldi ZH, high(tbpwm2*2)
ldi ZL, low(tbpwm2*2)
add ZL, zlow
adc ZH, zhigh
lpm
mov pwm2,r0

ldi ZH, high(tbpwm3*2)
ldi ZL, low(tbpwm3*2)
add ZL, zlow
adc ZH, zhigh
lpm
mov pwm3,r0

ldi ZH, high(tbpwm4*2)
ldi ZL, low(tbpwm4*2)
add ZL, zlow
adc ZH, zhigh
lpm
mov pwm4,r0

ldi ZH, high(tbpwm5*2)
ldi ZL, low(tbpwm5*2)
add ZL, zlow
adc ZH, zhigh
lpm
mov pwm5,r0

ldi ZH, high(tbpwm6*2)
ldi ZL, low(tbpwm6*2)
add ZL, zlow
adc ZH, zhigh
lpm
mov pwm6,r0

inc zlow
inc zlow

ldi temp,0x50
rcall micro
rcall mini

rjmp LOOP
Enfin, pour terminer, nous avons les valeurs stockées. Ici 6 sinus identiques légèrement décalés les uns par rapport aux autres :
tbpwm1:
.db 128,131,134,137,140,144,147,150,153,156,159,162,165,168,171,174
.db 177,179,182,185,188,191,193,196,199,201,204,206,209,211,213,216
.db 218,220,222,224,226,228,230,232,234,235,237,239,240,241,243,244
.db 245,246,248,249,250,250,251,252,253,253,254,254,254,254,254,254
.db 254,254,254,254,254,254,254,253,253,252,251,250,250,249,248,246
.db 245,244,243,241,240,239,237,235,234,232,230,228,226,224,222,220
.db 218,216,213,211,209,206,204,201,199,196,193,191,188,185,182,179
.db 177,174,171,168,165,162,159,156,153,150,147,144,140,137,134,131
.db 128,125,122,119,116,112,109,106,103,100,97,94,91,88,85,82
.db 79,77,74,71,68,65,63,60,57,55,52,50,47,45,43,40
.db 38,36,34,32,30,28,26,24,22,21,19,17,16,15,13,12
.db 11,10,8,7,6,6,5,4,4,4,4,4,4,4,4,4
.db 4,4,4,4,4,4,4,4,4,4,5,6,6,7,8,10
.db 11,12,13,15,16,17,19,21,22,24,26,28,30,32,34,36
.db 38,40,43,45,47,50,52,55,57,60,63,65,68,71,74,77
.db 79,82,85,88,91,94,97,100,103,106,109,112,116,119,122,125

tbpwm2:
.db 11,12,13,15,16,17,19,21,22,24,26,28,30,32,34,36
.db 38,40,43,45,47,50,52,55,57,60,63,65,68,71,74,77
.db 79,82,85,88,91,94,97,100,103,106,109,112,116,119,122,125
.db 128,131,134,137,140,144,147,150,153,156,159,162,165,168,171,174
.db 177,179,182,185,188,191,193,196,199,201,204,206,209,211,213,216
.db 218,220,222,224,226,228,230,232,234,235,237,239,240,241,243,244
.db 245,246,248,249,250,250,251,252,253,253,254,254,254,254,254,254
.db 254,254,254,254,254,254,254,253,253,252,251,250,250,249,248,246
.db 245,244,243,241,240,239,237,235,234,232,230,228,226,224,222,220
.db 218,216,213,211,209,206,204,201,199,196,193,191,188,185,182,179
.db 177,174,171,168,165,162,159,156,153,150,147,144,140,137,134,131
.db 128,125,122,119,116,112,109,106,103,100,97,94,91,88,85,82
.db 79,77,74,71,68,65,63,60,57,55,52,50,47,45,43,40
.db 38,36,34,32,30,28,26,24,22,21,19,17,16,15,13,12
.db 11,10,8,7,6,6,5,4,4,4,4,4,4,4,4,4
.db 4,4,4,4,4,4,4,4,4,4,5,6,6,7,8,10

tbpwm3:
.db 38,36,34,32,30,28,26,24,22,21,19,17,16,15,13,12
.db 11,10,8,7,6,6,5,4,4,4,4,4,4,4,4,4
.db 4,4,4,4,4,4,4,4,4,4,5,6,6,7,8,10
.db 11,12,13,15,16,17,19,21,22,24,26,28,30,32,34,36
.db 38,40,43,45,47,50,52,55,57,60,63,65,68,71,74,77
.db 79,82,85,88,91,94,97,100,103,106,109,112,116,119,122,125
.db 128,131,134,137,140,144,147,150,153,156,159,162,165,168,171,174
.db 177,179,182,185,188,191,193,196,199,201,204,206,209,211,213,216
.db 218,220,222,224,226,228,230,232,234,235,237,239,240,241,243,244
.db 245,246,248,249,250,250,251,252,253,253,254,254,254,254,254,254
.db 254,254,254,254,254,254,254,253,253,252,251,250,250,249,248,246
.db 245,244,243,241,240,239,237,235,234,232,230,228,226,224,222,220
.db 218,216,213,211,209,206,204,201,199,196,193,191,188,185,182,179
.db 177,174,171,168,165,162,159,156,153,150,147,144,140,137,134,131
.db 128,125,122,119,116,112,109,106,103,100,97,94,91,88,85,82
.db 79,77,74,71,68,65,63,60,57,55,52,50,47,45,43,40

tbpwm4:
.db 177,174,171,168,165,162,159,156,153,150,147,144,140,137,134,131
.db 128,125,122,119,116,112,109,106,103,100,97,94,91,88,85,82
.db 79,77,74,71,68,65,63,60,57,55,52,50,47,45,43,40
.db 38,36,34,32,30,28,26,24,22,21,19,17,16,15,13,12
.db 11,10,8,7,6,6,5,4,4,4,4,4,4,4,4,4
.db 4,4,4,4,4,4,4,4,4,4,5,6,6,7,8,10
.db 11,12,13,15,16,17,19,21,22,24,26,28,30,32,34,36
.db 38,40,43,45,47,50,52,55,57,60,63,65,68,71,74,77
.db 79,82,85,88,91,94,97,100,103,106,109,112,116,119,122,125
.db 128,131,134,137,140,144,147,150,153,156,159,162,165,168,171,174
.db 177,179,182,185,188,191,193,196,199,201,204,206,209,211,213,216
.db 218,220,222,224,226,228,230,232,234,235,237,239,240,241,243,244
.db 245,246,248,249,250,250,251,252,253,253,254,254,254,254,254,254
.db 254,254,254,254,254,254,254,253,253,252,251,250,250,249,248,246
.db 245,244,243,241,240,239,237,235,234,232,230,228,226,224,222,220
.db 218,216,213,211,209,206,204,201,199,196,193,191,188,185,182,179

tbpwm5:
.db 245,244,243,241,240,239,237,235,234,232,230,228,226,224,222,220
.db 218,216,213,211,209,206,204,201,199,196,193,191,188,185,182,179
.db 177,174,171,168,165,162,159,156,153,150,147,144,140,137,134,131
.db 128,125,122,119,116,112,109,106,103,100,97,94,91,88,85,82
.db 79,77,74,71,68,65,63,60,57,55,52,50,47,45,43,40
.db 38,36,34,32,30,28,26,24,22,21,19,17,16,15,13,12
.db 11,10,8,7,6,6,5,4,4,4,4,4,4,4,4,4
.db 4,4,4,4,4,4,4,4,4,4,5,6,6,7,8,10
.db 11,12,13,15,16,17,19,21,22,24,26,28,30,32,34,36
.db 38,40,43,45,47,50,52,55,57,60,63,65,68,71,74,77
.db 79,82,85,88,91,94,97,100,103,106,109,112,116,119,122,125
.db 128,131,134,137,140,144,147,150,153,156,159,162,165,168,171,174
.db 177,179,182,185,188,191,193,196,199,201,204,206,209,211,213,216
.db 218,220,222,224,226,228,230,232,234,235,237,239,240,241,243,244
.db 245,246,248,249,250,250,251,252,253,253,254,254,254,254,254,254
.db 254,254,254,254,254,254,254,253,253,252,251,250,250,249,248,246

tbpwm6:
.db 218,220,222,224,226,228,230,232,234,235,237,239,240,241,243,244
.db 245,246,248,249,250,250,251,252,253,253,254,254,254,254,254,254
.db 254,254,254,254,254,254,254,253,253,252,251,250,250,249,248,246
.db 245,244,243,241,240,239,237,235,234,232,230,228,226,224,222,220
.db 218,216,213,211,209,206,204,201,199,196,193,191,188,185,182,179
.db 177,174,171,168,165,162,159,156,153,150,147,144,140,137,134,131
.db 128,125,122,119,116,112,109,106,103,100,97,94,91,88,85,82
.db 79,77,74,71,68,65,63,60,57,55,52,50,47,45,43,40
.db 38,36,34,32,30,28,26,24,22,21,19,17,16,15,13,12
.db 11,10,8,7,6,6,5,4,4,4,4,4,4,4,4,4
.db 4,4,4,4,4,4,4,4,4,4,5,6,6,7,8,10
.db 11,12,13,15,16,17,19,21,22,24,26,28,30,32,34,36
.db 38,40,43,45,47,50,52,55,57,60,63,65,68,71,74,77
.db 79,82,85,88,91,94,97,100,103,106,109,112,116,119,122,125
.db 128,131,134,137,140,144,147,150,153,156,159,162,165,168,171,174
.db 177,179,182,185,188,191,193,196,199,201,204,206,209,211,213,216
Bien entendu, ce code n’est qu’une première ébauche. Il est possible de condenser le code de l’interruption et de la boucle principale pour économiser du temps et de la mémoire. De plus il faut prendre en considération que ce code occupe déjà quelques 85% de la mémoire flash d’un Attiny2313. En voulant utiliser plus de motifs ou plus de sorties, on se heurte à un problème d’espace. Il me faudra donc trouver un autre support de stockage, comme une carte MMC, pour pousser plus loin.

De UIPS à AVRDUDE

Deux outils se disputent la vedette en ce qui concerne la programmation des microcontrôleurs AVR d’Atmel : UISP et AVRDUDE. L’un et l’autres ont des avantages et des inconvénients, mais le passage de l’un à l’autre coince parfois.

Le modèle d’adaptateur est le suivant :

Sur ma configuration, le port utilisé est /dev/parport2. Nous avons donc pour un ATTiny2313 UISP :
effacement de la mémoire flash :

% uisp -dlpt=/dev/parport2 –erase -dprog=dapa -dno-poll
Atmel AVR ATtiny2313 is found.
Erasing device …
Reinitializing device Atmel
AVR ATtiny2313 is found.
écriture :

% uisp -dlpt=/dev/parport2 -dprog=dapa -dno-poll -v –upload if=out.hex
AVR Direct Parallel Access succeeded after 0 retries.
Atmel AVR ATtiny2313 is found.
Uploading: flash ####
(total 98 bytes transferred in 0.15 s (655 bytes/s)
vérification :

% uisp -dlpt=/dev/parport2 -dprog=dapa -dno-poll -v –verify if=out.hex
AVR Direct Parallel Access succeeded after 0 retries.
Atmel AVR ATtiny2313 is found.
Verifying: flash ####
(total 98 bytes transferred in 0.07 s (1415 bytes/s)
lecture fuses :

% uisp -dlpt=/dev/parport2 -dprog=dapa -dno-poll -v –rd_fuses
AVR Direct Parallel Access succeeded after 0 retries.
Atmel AVR ATtiny2313 is found.
Fuse Low Byte = 0x64
Fuse High Byte = 0xdf
Fuse Extended Byte = 0xff
Calibration Byte = 0x50 —
Read Only Lock Bits = 0xff
BLB12 -> 1
BLB11 -> 1
BLB02 -> 1
BLB01 -> 1
LB2 -> 1
LB1 -> 1
Avec AVRDUDE :
effacement :

% avrdude -p t2313 -c dapa -P /dev/parport2 -i 5 -e
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.00s
avrdude: Device signature = 0x1e910a
avrdude: erasing chip
avrdude: safemode: Fuses OK
avrdude done. Thank you.
écriture et vérification :

% avrdude -p t2313 -c dapa -P /dev/parport2 -i 5 -U flash:w:out.hex
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.00s
avrdude: Device signature = 0x1e910a
avrdude: NOTE: FLASH memory has been specified, an erase cycle
will be performed
To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file « out.hex »
avrdude: input file out.hex auto detected as Intel Hex
avrdude: writing flash (130 bytes):
Writing | ################################################## | 100% 0.12s
avrdude: 130 bytes of flash written
avrdude: verifying flash memory against out.hex:
avrdude: load data flash data from input file out.hex:
avrdude: input file out.hex auto detected as Intel Hex
avrdude: input file out.hex contains 130 bytes
avrdude: reading on-chip flash data:
Reading | ################################################## | 100% 0.09s
avrdude: verifying …
avrdude: 130 bytes of flash verified
avrdude: safemode: Fuses OK
avrdude done. Thank you.
lecture fuses :

% avrdude -p t2313 -c dapa -P /dev/parport2 -i 5 -U hfuse:r:-:b -U lfuse:r:-:b
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.00s
avrdude: Device signature = 0x1e910a
avrdude: reading hfuse memory:
Reading | ################################################## | 100% 0.00s
avrdude: writing output file « <stdout> »
0b11011111
avrdude: reading lfuse memory:
Reading | ################################################## | 100% 0.00s
avrdude: writing output file « <stdout> »
0b1100100
avrdude: safemode: Fuses OK
avrdude done. Thank you.
Notez l’utilisation de l’option -i permettant de spécifier le délai pour le signal d’horloge (en microsecondes). Selon l’adaptateur, la longueur du câble parallèle, etc… on peut rencontrer quelques problèmes et perdre beaucoup de temps à comprendre d’où vient le problème :
% avrdude -p t2313 -c dapa -P /dev/parport2
avrdude: AVR device not responding
avrdude: initialization failed, rc=-1
Double check connections and try again, or use -F to override
this check.
avrdude done. Thank you.