Un feu tricolore minimaliste (so british)

Afin de tester mon programmateur PicKit2 acheté récemment, je me suis lancé le défi de programmer un feu tricolore avec un tout petit pic, le PIC12F510. L’avantage de ce pic est qu’il contient vraiment plein de fonctions (timer, entrées analogiques) et que grâce à son oscillateur interne, on peut utiliser les 6 broches comme entrées/sorties (5 I/O, 1 I).
Les points durs ont été :
  • de configurer le PIC12F510 pour avoir toutes les sorties en GPIO;
  • de réaliser un timer;
Le circuit est très simple à réaliser, il suffit de :
  • connecter les broches du pic utilisées pour l’ICSP à un connecteur utilisable par le PicKit2;
  • connecter les diodes rouge, orange et verte aux pattes non utilisées, respectivement, GP2, GP4 et GP5;
  • ne pas oublier cependant de mettre une résistance entre chaque LED et sa sortie;
Pour le programmer, j’ai utilisé :
  • un ordinateur sous Mac OS X Leopard;
  • un PicKit2 avec la commande pk2cmd;
  • gputils
  • un Makefile (fournit plus bas)
Le code est le suivant MiniPic0.asm :

LIST p=PIC12F510, r=hex, f=INHX8M
include "P12F510.inc"

; Fusibles
__config _IOSCFS_ON & _MCLRE_OFF & _CP_OFF & _WDT_OFF & _IntRC_OSC
; Point de départ de l'application
org 0x00
init
movwf OSCCAL ; Calibration de l'oscillateur interne
bcf STATUS,PA0 ; Page 0 de la mémoire
;Initialisation des registres pour passer toutes les sorties en GPIO
;ADCON0: ANS<1:0>, ADCS<1:0>, CHS<1:0>, GO/DONE, ADON
movlw 0x00
movwf ADCON0
;CM1CON0: OUT, /OUTEN, POL, T0CS, ON, NREF, PREF, WU
movlw 0xF1
movwf CM1CON0
;OPTION: /GPWU, /GPPU, T0CS, T0SE, PSA, PS<2:0>
movlw 0xC7
option

; Initialisation des entrées/sorties
movlw ~0x34 ; Configuration des sorties (0) et entrées (1)
tris GPIO
movlw 0x00 ; On met tout à zéro
movwf GPIO

loop
movlw 0x20 ; Feu vert
movwf GPIO
call wait ; Attente
call wait
call wait

movlw 0x10 ; Feu orange
movwf GPIO
call wait ; Attente

movlw 0x04 ; Feu rouge
movwf GPIO
call wait ; Attente
call wait
movlw 0x14 ; Feu rouge + orange
movwf GPIO
call wait ; Attente

goto loop ; On recommence

; Une fonction d'attente
wait
; On charge le compteur
movlw 0x10
movwf FSR
movlw 0xFF
movwf INDF ; 0xFF @ 0x10
incf FSR, 1
movlw 0xFF
movwf INDF ; 0xFF @ 0x11
incf FSR, 1
movlw 0x0F
movwf INDF ; 0x0F @ 0x12

wait1
; On se place à la première adresse
movlw 0x10
movwf FSR

wait_decr
; On décompte
decfsz INDF, 1
goto wait_decr

wait_next
; Quand on arrive à zéro
; On passe au registre suivant
incf FSR, 1

wait2
; On quitte si on est arrivé au dernier registre
comf FSR, 0
andlw 0x13
btfsc STATUS, Z
return
; Sinon on décrémente le registre
decfsz INDF, 1
; Si le registre n'est pas vide on reprend le décompte
; A partir du premier registre
goto wait1
; Si le registre est aussi vide, on passe au suivant
goto wait_next
end
Et vous pouvez utiliser le Makefile suivant pour programmer/alimenter votre montage :

DEVICE=pic12f510
TARGET=MiniPic0.hex

AS=gpasm -q -w2 -p${DEVICE}
PK2=pk2cmd -P${DEVICE}


all: ${TARGET}

upload: ${TARGET}
$(PK2) -M -F${TARGET}
verify: ${TARGET}
$(PK2) -Y -F${TARGET}
dump:
$(PK2) -GF `date +%s`.hex
erase:
$(PK2) -E
$(PK2) -C
on:
$(PK2) -T
off:
$(PK2) -W

clean:
rm -f *.cod *.hex *.lst
%.hex: %.asm
${AS} $<
Pour finir, voici une vidéo du montage en fonctionnement :

One Reply to “Un feu tricolore minimaliste (so british)”

  1. bonjour, que cette
    pourriez-vous m’aider à savoir comment connecter le microcontrôleur 12F510 oscillateur interne comme ……

    Je serais très heureux, j’en ai besoin pour un cadeau le jour de l’amour et l’amitié

    salutations en provenance du Mexique

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.