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=INHX8Minclude "P12F510.inc"; Fusibles__config _IOSCFS_ON & _MCLRE_OFF & _CP_OFF & _WDT_OFF & _IntRC_OSC; Point de départ de l'applicationorg 0x00initmovwf OSCCAL ; Calibration de l'oscillateur internebcf 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, ADONmovlw 0x00movwf ADCON0;CM1CON0: OUT, /OUTEN, POL, T0CS, ON, NREF, PREF, WUmovlw 0xF1movwf CM1CON0;OPTION: /GPWU, /GPPU, T0CS, T0SE, PSA, PS<2:0>movlw 0xC7option; Initialisation des entrées/sortiesmovlw ~0x34 ; Configuration des sorties (0) et entrées (1)tris GPIOmovlw 0x00 ; On met tout à zéromovwf GPIOloopmovlw 0x20 ; Feu vertmovwf GPIOcall wait ; Attentecall waitcall waitmovlw 0x10 ; Feu orangemovwf GPIOcall wait ; Attentemovlw 0x04 ; Feu rougemovwf GPIOcall wait ; Attentecall waitmovlw 0x14 ; Feu rouge + orangemovwf GPIOcall wait ; Attentegoto loop ; On recommence; Une fonction d'attentewait; On charge le compteurmovlw 0x10movwf FSRmovlw 0xFFmovwf INDF ; 0xFF @ 0x10incf FSR, 1movlw 0xFFmovwf INDF ; 0xFF @ 0x11incf FSR, 1movlw 0x0Fmovwf INDF ; 0x0F @ 0x12wait1; On se place à la première adressemovlw 0x10movwf FSRwait_decr; On décomptedecfsz INDF, 1goto wait_decrwait_next; Quand on arrive à zéro; On passe au registre suivantincf FSR, 1wait2; On quitte si on est arrivé au dernier registrecomf FSR, 0andlw 0x13btfsc STATUS, Zreturn; Sinon on décrémente le registredecfsz INDF, 1; Si le registre n'est pas vide on reprend le décompte; A partir du premier registregoto wait1; Si le registre est aussi vide, on passe au suivantgoto wait_nextend
Et vous pouvez utiliser le Makefile suivant pour programmer/alimenter votre montage :
DEVICE=pic12f510TARGET=MiniPic0.hexAS=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`.hexerase:$(PK2) -E$(PK2) -Con:$(PK2) -Toff:$(PK2) -Wclean:rm -f *.cod *.hex *.lst%.hex: %.asm${AS} $<
Pour finir, voici une vidéo du montage en fonctionnement :
1 commentaires:
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
Enregistrer un commentaire