Programació en pic-as del PIC 16F690

Referència Trucs Perifèrics   Recursos CITCEA
Tutorial Exemples Projectes   Inici

Exemple VV - Rotació de LED a velocitat variable

En aquest exemple es combinen coses dels exemples RL i EA.

Com en l'exemple anterior, en aquest cas llegirem el potenciòmetre utilitzant una entrada analògica. Ara el que farem serà utilitzar els 8 bits superiors del valor llegit per variar la velocitat. A l'Exemple RL definíem la velocitat de rotació dels LED amb dos bucles, un dins un altre, que es repetien 256 vegades. Ara variarem, en funció del potenciòmetre, el nombre de cops que es repeteix el bucle exterior.

A l'Exemple RL el bucle començava amb la variable a zero i s'anava restant (255, 254, 253, etc.) fins arribar altre cop a zero. Ara el valor llegit al potenciòmetre estarà entre 0 i 255. Si recordem que el bucle intern és de 771 μs, les durades que correspondrien a cada valor de la lectura del potenciòmetre serien:

Valor Cicles Durada
0 256 256 * 771 μs = 197,4 ms
1 1 1 * 771 μs = 0,7 ms
2 2 2 * 771 μs = 1,5 ms
... ... ...
254 254 254 * 771 μs = 195,8 ms
255 255 255 * 771 μs = 196,6 ms

I ens trobem que a l'extrem hi ha un valor que no encaixa i ens donaria un efecte visual estrany. Per evitar aquest problema, a la lectura del conversor li sumem 1. També ens trobem que el cicle mínim és de 0,7 ms que és molt poc. Per això, després dels cicles variables, farem un cicle fix de 10 ms (13 iteracions del bucle llarg).

El programa serà el següent:

PROCESSOR 16F690
#include <xc.inc>
config FOSC = INTRCIO, WDTE = OFF, PWRTE = OFF, MCLRE = OFF, CP = OFF
config CPD = OFF, BOREN = OFF, IESO = OFF, FCMEN = OFF
Retard1 EQU 0x20  ; Definim dues variables de comptatge
Retard2 EQU 0x21
Visualit EQU 0x22  ; I una variable on guardem el que mostraran els LED
PSECT code, class=CODE, delta=2, abs  ; A l'inici de la memòria
main:
  bsf RP0  ; Tria el banc 1
  movlw 0xFF  ; Posa l'acumulador a FFh (tot uns)
  movwf TRISA  ; Posa tots els bits del port A com a entrada
  clrf TRISC  ; Posa tots els bits del port C com a sortida
  movlw 00010000B
  movwf ADCON1  ; Posa el conversor a 1/8 de la freqüència
  bcf RP0
  bsf RP1  ; Tria el banc 2
  movlw 00000001B
  movwf ANSEL  ; Posa AN0 com entrada analògica
  bcf RP0
  bcf RP1  ; Tria el banc 0
  movlw 00000001B  ; activa el conversor A/D connectat a AN0
  movwf ADCON0  ; amb el resultat justificat per l'esquerra
  movlw 00001000B  ; Activa el bit 3
  movwf Visualit  ; Ho copia sobre la variable Visualit
Bucle:
  movf Visualit,w  ; Copia la variable Visualit a l'acumulador
  movwf PORTC  ; Copia el resultat sobre els LED
  nop  ; espera un microsegon
  nop  ; espera un microsegon
  nop  ; espera un microsegon
  nop  ; espera un microsegon
  nop  ; espera un microsegon
  bsf GO_DONE  ; Inicia la conversió
  btfsc GO_DONE  ; Quan el bit sigui 0 la conversió haurà acabat
  goto $-1  ; repetim la línia fins que deixi de ser 0
  movf ADRESH,w  ; Copia els bits superiors a l'acumulador
  addlw 1  ; Li suma 1 i tenim la durada variable del cicle
  movwf Retard2  ; Ho copia a la variable Retard2
RetVar:
  decfsz Retard1,f  ; Decrementa la variable 1
                    ; si dona zero, no es fa la instrucció següent
  goto RetVar  ; Salta, excepte si el resultat ha estat zero
  decfsz Retard2,f  ; Decrementa la variable 2
  goto RetVar  ; Salta, excepte si el resultat ha estat zero
  movlw 13  ; El punt indica que es un valor decimal
  movwf Retard2  ; Comença un altre cicle de durada fixa (10 ms)
Ret10ms:
  decfsz Retard1,f
  goto Ret10ms
  decfsz Retard2,f
  goto Ret10ms
Rotar:
  bcf CARRY  ; posa a zero el bit d'arrossegament
  rrf Visualit,f  ; Fa rodar els bits cap a la dreta
                  ; el bit d'arrossegament entra per l'esquerra
                  ; i el bit de la dreta passa a l'arrossegament
  btfsc CARRY  ; Comprova si s'ha activat l'arrossegament
               ; Si no s'ha activat, salta una instrucció
  bsf Visualit,3  ; Si s'ha activat, torna a posar un 1 (0000 1000)
  goto Bucle  ; Repetim-ho...
END main

 

 

Llicència de Creative Commons
Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.