Programació en pic-as del PIC 16F690

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

Exemple VP - Mostrem la lectura del potenciòmetre a la pantalla sèrie

En aquest cas tindrem un potenciòmetre connectat a una entrada analògica i escriurem el valor llegit a la pantalla.

En el nostre cas tindrem un resultat de 10 bits (valors de 000h a 3FFh; o sigui de 0 a 1023) que guardarem en una variable entera. El que farem doncs serà triar l'alineació a la dreta (ADFM valdrà 1). Un cop tinguem el valor, en separarem els dígits, els convertirem a caràcters ASCII i els enviarem a la pantalla.

El programa que emprarem serà:

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
Compta EQU 0x20  ; Comptador d'iteracions
Temp EQU 0x21  ; Variable Temporal
Valor EQU 0x22  ; Valor d'entrada (2 bytes, 16 bits)
Resul EQU 0x24  ; Valor de sortida (cinc bytes)
Caracter EQU 0x29  ; Caràcter o codi a enviar
Retard1 EQU 0x2A  ; Variables de retard	
Retard2 EQU 0x2B
Retard3 EQU 0x2C
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 TRISB  ; Tot el port B és de sortida
  clrf TRISC  ; Posa tots els bits del port C com a sortida
  bsf BRGH  ; Configuració de velocitat
  bcf BRG16  ; Paràmetre de velocitat de 8 bits
  movlw 25  ; Velocitat de 9600 baud
  movwf SPBRG  ; Paràmetre de velocitat
  bcf SYNC  ; Comunicació asíncrona
  bcf TX9  ; Comunicació de 8 bits
  bcf RP0  ; Tria el banc 0
  bsf SPEN  ; Activa comunicació sèrie
  bsf RP0  ; Tria el banc 1
  bsf TXEN  ; Activa comunicació
  movlw 00010000B  ; Posa el conversor a 1/8 de la freqüència
  movwf ADCON1  ; Copia W a la configuració del conversor A/D
  bcf RP0
  bsf RP1  ; Tria el banc 2
  movlw 0xFF  ; Posa l'acumulador a FFh (tot uns)
  movwf ANSEL  ; Configura AN0-AN7 com entrades analògiques
  clrf ANSELH  ; Desactiva les altres entrades analògiques
  bcf RP0
  bcf RP1  ; Tria el banc 0
  movlw 10  ; Retard de 2 s
  call Rets  ; Esperem que arrenqui la pantalla
  movlw 10000001B  ; activa el conversor A/D connectat a AN0
  movwf ADCON0  ; amb el resultat justificat per la dreta
Bucle:
  movlw 254  ; Caràcter de control
  movwf Caracter  ; Ho guarda a la variable
  call EnviaL  ; Ho envia
  movlw 1  ; Esborra la pantalla i posa el cursor a l'inici
  movwf Caracter  ; Ho guarda a la variable
  call EnviaL  ; Ho envia
  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 1
  bsf RP0  ; Tria el banc 1
  movf ADRESL,w  ; Llegeix els bits de menys pes
  bcf RP0  ; Tria el banc 0
  movwf Valor  ; Els guarda a Valor
  movf ADRESH,w  ; Llegeix els bits de més pes
  movwf Valor+1  ; Els guarda a Valor+1
  call BCD5  ; Els passa a BCD (cinc nibbles en tres bytes)
  call Separa  ; Els separem (cinc bytes)
  ; Anem a convertir-los a ASCII i enviar-los
  movlw 5  ; Cal fer-ho 5 cops
  movwf Compta  ; Ho posem al comptador
  movlw Resul+4  ; Adreça de la darrera xifra
  movwf FSR  ; Adreçament indirecte
BucleASC:
  movlw '0'  ; Carrega el codi ASCII del número 0
             ; Sumant-li la xifra tindrem el codi ASCII
  addwf INDF,w  ; Ho afegeix al dígit i se'l queda a W
  movwf Caracter  ; Ho guarda a la variable
  call EnviaL  ; Ho envia
  decf FSR  ; Decrementa FSR
  decfsz Compta,f  ; Decrementa el comptador
  goto BucleASC  ; Si no és zero, repetim
  movlw 5  ; Retard d'1 s
  call Rets  ; Deixem temps a llegir-ho
  goto Bucle
;
; Funció que converteix un número de 16 bits a BCD (5 dígits)
;
BCD5:
  bcf CARRY  ; Posa a zero C per entrar zeros a les rotacions
  movlw 16  ; Nombre d'iteracions
  movwf Compta  ; Comptador d'iteracions
  clrf Resul+2  ; Desenes de miler 
  clrf Resul+1  ; Unitats de miler i centenes
  clrf Resul  ; Desenes i unitats
BucleBCD:
  rlf Valor,f  ; Girem bits a l'esquerra a valor
  rlf Valor+1,f  ; Cap a valor+1
  rlf Resul,f  ; I cap als resultats
  rlf Resul+1,f
  rlf Resul+2,f
  decfsz Compta,f  ; Decrementa Compta
  goto ajust  ; Si no és zero, ajustem el resultat
  retlw 0  ; Si és zero ja estem; tornem un 0 a W
ajust:  ; funció d'ajust dels resultats
  movlw Resul  ; Agafem l'adreça del byte de menys pes
  movwf FSR  ; La posa a l'adreçament indirecte
  call ajustBCD  ; Ajusta el byte de més a la dreta
  movlw Resul+1  ; Agafem l'adreça del byte del mig
  movwf FSR  ; La posa a l'adreçament indirecte
  call ajustBCD  ; Ajusta el byte del mig
  movlw Resul+2  ; Agafem l'adreça del byte de més pes
  movwf FSR  ; La posa a l'adreçament indirecte
  call ajustBCD  ; Ajusta el byte de més a l'esquerra
  goto BucleBCD  ; Torna a repetir el bucle (fins a 16 cops)
ajustBCD:  ; funció d'ajust d'un byte, primer el nibble de la dreta, després l'altre
  movlw 0x03  ; Agafa el valor 03h
  addwf INDF,w  ; El suma al byte que ajustem
  movwf Temp  ; Ho guarda a Temp
  btfsc Temp,3  ; És més gran que 07h (s'ha activat el bit 3)?
  movwf INDF  ; Si és cert, sobreposa el resultat
  movlw 0x30  ; Agafa el valor 30h
  addwf INDF,w  ; El suma al byte que ajustem
  movwf Temp  ; Ho guarda a Temp
  btfsc Temp,7  ; És més gran que 70h (s'ha activat el bit 7)?
  movwf INDF  ; Si és cert, sobreposa el resultat
  retlw 0  ; Retorna amb un zero a W
  ;
  ; Funció que separa els dígits
  ;
Separa:
  movf Resul+2,w  ; Agafa les desenes de miler
  movwf Resul+4  ; Les posa al seu lloc
  swapf Resul+1,w  ; Llegeix les unitats de miler i les centenes i les guarda, permutades, a w
  andlw 0x0F  ; Es queda amb les unitats de miler
  movwf Resul+3  ; Les posa al seu lloc
  movf Resul+1,w  ; Llegeix les unitats de miler i les centenes i les guarda a w
  andlw 0x0F  ; Es queda amb les centenes
  movwf Resul+2  ; Les posa al seu lloc
  swapf Resul,w  ; Llegeix les desenes i les unitats i les guarda, permutades, a w
  andlw 0x0F  ; Es queda amb les desenes
  movwf Resul+1  ; Les posa al seu lloc
  movf Resul,w  ; Llegeix les desenes i les unitats i les guarda a w
  andlw 0x0F  ; Es queda amb les unitats
  movwf Resul  ; Les posa al seu lloc
  retlw 0  ; Retorna amb un zero a W
;
; Enviem caràcters a visualitzar
;
EnviaL:
  movf Caracter,w  ; Agafa el caràcter
  movwf TXREG  ; L'envia
  nop			
  nop  ; Espera 2 us
  btfss TXIF  ; El registre TXREG ha quedat lliure?
  goto $-1  ; No, doncs esperem
  return  ; Tornem al lloc des d'on hem vingut
;
; Funció de retard de 0,2 W s
;
Rets:
  movwf Retard3
Bucles:
  decfsz Retard1,f		
  goto Bucles		
  decfsz Retard2,f		
  goto Bucles		
  decfsz Retard3,f	
  goto Bucles
  return
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.