PIC16F887
Short Description
Descripción: Practicas PIC16F887...
Description
Manual de Practicas Microcontroladores para Instrumentación y Control Universidad Tecnológica de Chihuahua T.S.U. Mecatrónica
Elaborado por: Arzabala Contreras Ernesto Alonso Salazar Lopez Luis Ricardo Vallejo González Mario Alberto
Contenido Unidad I Arquitectura interna de los Microcontroladores.................................................................. 8 Practica 1.1 Conexiones basicas y encendido de leds ..................................................................... 8 Descripción P1.1: ......................................................................................................................... 8 Código P1.1: ................................................................................................................................ 8 Circuito P1.1: ............................................................................................................................... 9 Practica 1.2 Oscilador interno y ciclos de repetición ...................................................................... 9 Descripción P1.2: ......................................................................................................................... 9 Código P1.2: .............................................................................................................................. 10 Circuito P1.2: ............................................................................................................................. 12 Practica 1.3 Ciclos anidados .......................................................................................................... 13 Descripción P1.3: ....................................................................................................................... 13 Código P1.3: .............................................................................................................................. 13 Circuito P1.3: ............................................................................................................................. 15 Practica 1.4 Temporizador TMR0 e interrupciones ...................................................................... 15 Descripción P1.4: ....................................................................................................................... 15 Código P1.4: .............................................................................................................................. 16 Circuito P1.4: ............................................................................................................................. 19 Practica 1.5 Uso de botones y subrutinas ..................................................................................... 19 Descripción P1.5: ....................................................................................................................... 19 Código P1.5: .............................................................................................................................. 20 Circuito P1.5: ............................................................................................................................. 22 Practica 1.6 Temporizador TMR0 como contador, variables y relevadores ................................. 22 Descripción P1.6: ....................................................................................................................... 22 Código P1.6: .............................................................................................................................. 23 Circuito P1.6: ............................................................................................................................. 25 Practica 1.7 Macros y rutinas para evitar el rebote de botones ................................................... 25 Descripción P1.7: ....................................................................................................................... 25 Código P1.7: .............................................................................................................................. 25 Circuito P1.7: ............................................................................................................................. 31 Practica 1.8 Temporizador TMR1 e interrupciones ...................................................................... 31 Descripción P1.8: ....................................................................................................................... 31
Código P1.8: .............................................................................................................................. 31 Circuito P1.8: ............................................................................................................................. 34 Practica 1.9 Temporizador TMR2 y configuración del oscilador ................................................... 34 Descripción P1.9: ....................................................................................................................... 34 Código P1.9: .............................................................................................................................. 34 Circuito P1.9: ............................................................................................................................. 38 Practica 1.10 Modulo CCP 1 como generador de señales tipo PWM ........................................... 38 Descripción P1.10: ..................................................................................................................... 38 Código P1.10: ............................................................................................................................ 38 Circuito P1.10: ........................................................................................................................... 42 Practica 1.11 Utilización del convertidor analógico-digital (ADC)................................................ 42 Descripción P1.11: ..................................................................................................................... 42 Código P1.11: ............................................................................................................................ 43 Circuito P1.11: ........................................................................................................................... 44 Practica 1.12 Uso de la memoria EEPROM ................................................................................... 45 Descripción P1.12: ..................................................................................................................... 45 Código P1.12: ............................................................................................................................ 45 Circuito P1.12: ........................................................................................................................... 49 Practica 1.13 Contador de dos dígitos multiplexado .................................................................... 49 Descripción P1.13: ..................................................................................................................... 49 Código P1.13: ............................................................................................................................ 49 Circuito P1.13: ........................................................................................................................... 57 Practica 1.14 Generación de sonidos usando macros .................................................................. 57 Descripción P1.14: ..................................................................................................................... 57 Código P1.14: ............................................................................................................................ 57 Circuito P1.14: ........................................................................................................................... 62 Practica 1.15 Utilización del display de cristal líquido (LCD) ......................................................... 62 Descripción P1.15: ..................................................................................................................... 62 Código P1.15: ............................................................................................................................ 62 Circuito P1.15: ........................................................................................................................... 73 Practica 1.16 Comunicación serial RS232...................................................................................... 73 Descripción P1.16: ..................................................................................................................... 73
Código P1.16: ............................................................................................................................ 73 Circuito P1.16: ........................................................................................................................... 80 Unidad II Compilador “C” para Microcontroladores ......................................................................... 81 Practica 2.1 Encendido de leds y configuraciones basicas. ........................................................... 81 Descripción P2.1: ....................................................................................................................... 81 Circuito P2.1: ............................................................................................................................. 81 Código P2.1: .............................................................................................................................. 82 Practica 2.2 Oscilador interno y mezcla de lenguaje ensamblador y C........................................ 84 Descripción P2.2: ....................................................................................................................... 84 Circuito P2.2: ............................................................................................................................. 84 Código P2.2: .............................................................................................................................. 85 Practica 2.3 Temporizador TMR0 como contador, variables y relevadores ................................. 87 Descripción P2.3: ....................................................................................................................... 87 Circuito P2.3: ............................................................................................................................. 87 Código P2.3: .............................................................................................................................. 87 Practica 2.4 Temporizadores TMR0,TMR1 y TMR2 e interrupciones ........................................... 89 Descripción P2.4: ....................................................................................................................... 89 Circuito P2.4: ............................................................................................................................. 89 Código P2.4: .............................................................................................................................. 89 Practica 2.5 Uso de del “watchdog timer” .................................................................................... 94 Descripción P2.5: ....................................................................................................................... 94 Circuito P2.5: ............................................................................................................................. 94 Código P2.5: .............................................................................................................................. 94 Practica 2.6 Modulo CCP 1 como generador de señales tipo PWM ............................................. 95 Descripción P2.6: ....................................................................................................................... 95 Circuito P2.6: ............................................................................................................................. 95 Código P2.6: .............................................................................................................................. 96 Practica 2.7 Utilización del convertidor analógico-digital (ADC).................................................. 98 Descripción P2.7: ....................................................................................................................... 98 Circuito P2.7: ............................................................................................................................. 98 Código P2.7: .............................................................................................................................. 98 Practica 2.8 Uso de la memoria EEPROM ................................................................................... 100
Descripción P2.8: ..................................................................................................................... 100 Circuito P2.8: ........................................................................................................................... 100 Código P2.8: ............................................................................................................................ 101 Practica 2.9 Contador de dos dígitos multiplexado .................................................................... 102 Descripción P2.9: ..................................................................................................................... 102 Circuito P2.9: ........................................................................................................................... 102 Código P2.9: ............................................................................................................................ 103 Practica 2.10 Utilización del display de cristal líquido (LCD) ....................................................... 106 Descripción P2.10: ................................................................................................................... 106 Circuito P2.10: ......................................................................................................................... 106 Código P2.10: .......................................................................................................................... 106 Practica 2.11 Comunicación serial RS232.................................................................................... 109 Descripción P2.11: ................................................................................................................... 109 Circuito P2.11: ......................................................................................................................... 109 Código P2.11: .......................................................................................................................... 110 Practica 2.12 Generación de sonidos utilizando una librería ...................................................... 111 Descripción P2.12: ................................................................................................................... 111 Circuito P2.12: ......................................................................................................................... 111 Código P2.12: .......................................................................................................................... 112 Unidad III Aplicaciones para el control de procesos y comunicación ............................................. 115 Practica 3.1 Control de un motor de DC mediante un puente H ................................................ 115 Descripcion P3.1: ..................................................................................................................... 115 Circuito P3.1: ........................................................................................................................... 115 Código P3.1: ............................................................................................................................ 116 Practica 3.2 Control de un motor de pasos ................................................................................. 117 Descripcion P3.2: ..................................................................................................................... 117 Circuito P3.2: ........................................................................................................................... 118 Código P3.2: ............................................................................................................................ 119 Practicas 3.3 Control de un servo motor..................................................................................... 120 Desripcion P3.3: ...................................................................................................................... 120 Circuito P3.3: ........................................................................................................................... 121 Código P3.3: ............................................................................................................................ 121
Practica 3.4 Medición de temperatura con un sensor tipo IC y calibración de un termistor. .... 122 Descripcion P3.4: ..................................................................................................................... 122 Circuito P3.4: ........................................................................................................................... 122 Código P3.4: ............................................................................................................................ 122 Practica 3.5 Control de temperatura tipo ON/OFF ..................................................................... 123 Descripcion P3.5: ..................................................................................................................... 123 Circuito P3.5: ........................................................................................................................... 123 Código P3.5: ............................................................................................................................ 123 Practica 3.6 Modulo remoto de medición y control. 3 sensores, 2 actuadores, comunicación mediante RS232, modo de control remoto mediante PC, modo de control local mediante botones. ...................................................................................................................................... 123 Descripcion P3.6: ..................................................................................................................... 123 Circuito P3.6: ........................................................................................................................... 124 Código P3.6: ............................................................................................................................ 124 Proyecto final .............................................................................................................................. 124 Descripcion PF: ........................................................................................................................ 124 Circuito PF: .............................................................................................................................. 124 Código PF:................................................................................................................................ 124 Formato de reportes ................................................................................................................... 125 Criterios y ponderaciones de evaluación .................................................................................... 126 Unidad I ................................................................................................................................... 126 Unidad II .................................................................................................................................. 126 Unidad III ................................................................................................................................. 126 Links de ayuda ............................................................................................................................. 127
Unidad I Arquitectura interna de los Microcontroladores Practica 1.1 Conexiones basicas y encendido de leds Descripción P1.1: El único propósito de esta práctica es mostrar el circuito básico, también llamado sistema mínimo, y el proceso de programación de un microcontrolador (uC) PIC16F887. El PIC16F887 es el uC que se utilizara en todas las prácticas de este manual a menos que se indique lo contrario. Cabe resaltar que los Microcontroladores PIC16F877, PIC16F877A, PIC16F887 y PIC16F917 son compatibles. El PIC16F887 puede ser considerado como una nueva y mejor versión del PIC16F887, así mismo el PIC16F917 es similar al PIC16F877A pero además incorpora un módulo manejador de LCD. El circuito y el programa únicamente realizan la función de encender algunos “led” conectados al puerto B del microcontrolador (uC) PIC16F887. Código P1.1: ;************************************************ ;
Nombre
:
P1_1.asm
;
Fecha
:
Enero 10,2013
;
Alumno
:
Arzabala Contreras Ernesto
;
Grupo
:
MT00X
;************************************************ ;
Descripcion
:
Prueba del microcontrolador
;************************************************
list p=16f887 #include
errorlevel -302
__CONFIG _CONFIG1, _HS_OSC & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOR_ON & _IESO_ON & _FCMEN_ON & _LVP_OFF
__CONFIG _CONFIG2, _BOR40V & _WRT_OFF
ORG
0x0000
Banksel
TRISB
clrf
TRISB
banksel
PORTB
movlw
B'01010101'
movwf
PORTB
end
Circuito P1.1:
Practica 1.2 Oscilador interno y ciclos de repetición Descripción P1.2: Esta práctica es una continuación de P1.1. En esta práctica se pretende hacer que los “leds” conectados al puerto B parpadeen (“blink”). El efecto de que los “leds” parecen parpadear es conseguido de la siguiente manera:
1. 2. 3. 4. 5.
En el puerto B se carga la combinación binaria 01010101 Permanecer en el ciclo1 durante un tiempo determinado Reemplazar la combinación binaria existente en el puerto B con la combinación 10101010 Permanecer en el ciclo1 durante un tiempo determinado Regresar al paso 1 y repetir todo el proceso de nuevo.
Para poder observar los cambios de combinación binaria en el puerto B, apreciar el efecto del parpadeo, el proceso mencionado anteriormente se necesita llevar a cabo de una manera lenta. Para lograr esto se utiliza el oscilador interno LFINTOSC del microcontrolador el cual tiene una frecuencia de 31 kHz mucho más lenta que la del oscilador externo el cual tiene conectado el cristal de 8 MHz. La fuente de la señal de reloj es cambiada durante la ejecución del programa, “on the fly”. Para verificar que esto realmente está sucediendo, antes de energizar el uC desconecta el cristal. ¿Qué paso? El uC no debe de hacer nada ya que la configuración de este requiere el uso del cristal al momento de iniciar a ejecutar el programa. Si el cristal se desconecta después de que el uC ya inicio la ejecución del programa esto no debe de afectar el funcionamiento del uC de ninguna manera. Código P1.2: ;************************************************ ;
Nombre :
P1_2.asm
;
Fecha
Enero 10,2013
;
Alumno :
Arzabala Contreras Ernesto
;
Grupo
MT00X
:
:
;************************************************ ;
Descripcion
:
Parpadear leds Puerto B
;************************************************ list p=16f887 #include errorlevel -302 __CONFIG _CONFIG1, _HS_OSC & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOR_ON & _IESO_ON & _FCMEN_ON & _LVP_OFF
__CONFIG
_CONFIG2, _BOR40V & _WRT_OFF
;************************************************************************ ;************* DEFINING VARIABLES ***************************************
cblock 0x20
; Bloque de variables inicia en dir. 20h
counter1
; La variable "counter1" en la dir. 20h
endc ;************************************************************************ org
0x0000
; Direccion de la primera instruccion
banksel OSCCON
; Selecciona el banco de memoria que
; contiene el registro OSCCON bcf
OSCCON,6
; Selecciona el oscilador interno LFINTOSC
bcf
OSCCON,5
; con la frequency de 31KHz
bcf
OSCCON,4
bsf
OSCCON,0
; uC usa el oscilador interno
banksel TRISB
; Selecciona el banco que contiene a TRISB
clrf TRISB
; Todos los pines del PORTB configurados ; como salidas
banksel PORTB
loop
; Selecciona el banco que contiene a PORTB
; etiqueta con el nombre de "loop"
movlw B'01010101' movwf PORTB movlw h'FF'
; Numero binario 01010101 se carga en W ; Numero binario se mueve al PORTB
; Numero hFF se carga en W
movwf counter1 loop1
; Numero se mueve a la variable "counter1" ; etiqueta con el nombre de "loop1"
decfsz counter1 goto loop1
; Variable "counter1" se decrementa en 1 ; Si "counter1" es 0, continuar.
; de lo contrario volver a "loop1"
movlw B'10101010' movwf PORTB movlw h'FF'
; Numero BIN 10101010 se carga en W ; Numero se mueve a PORTB
; Numero hFF se carga en W
movwf counter1 loop2
; Number se mueve a la variable "counter1" ; etiqueta con el nombre de "loop2"
decfsz counter1 goto loop2
; Variable "counter1" se decrementa en 1 ; Si "counter1" es 0, continuar.
; de lo contrario volver a "loop2" goto loop end
Circuito P1.2:
; Volver a la etiqueta "loop" ; Fin del Programa
Practica 1.3 Ciclos anidados Descripción P1.3: En la práctica anterior se pudo observar que el microcontrolador ejecuta las instrucciones muy rápido y en ocasiones es necesario hacerlo que vaya más lento. El uso del oscilador interno LF, como se hace en la práctica P1.2, debe de ser la última opción. Una mejor manera de realizarlo es utilizar ciclos anidados en el programa. En esta práctica, la variable “counter1” se decrementa una unidad 255 veces, es decir el programa contara de 255 a 0 antes de salir del ciclo interior “loop1”. El programa contara 255 veces de 255 a 0 en cada ciclo exterior “loop”. Lo anterior quiere decir que entre dos parpadeos consecutivos de “leds” hay 255 x 255 pulsos del cristal oscilador. De manera más precisa el número de pulsos entre dos parpadeos consecutivos es de aproximadamente de 196000, esto es debido a que la ejecución de las instrucciones de brinco (goto) y de decremento requieren de un cierto número de pulsos para ser ejecutadas. La instrucción de decremento DECFSZ se realiza en 1 o 2 ciclos. La instrucción de brinco GOTO se realiza en 2 ciclos también. Si suponemos que la instrucción DEC FSZ se realiza en un ciclo y la instrucción GOTO en 2 ciclos, eso son tres ciclos. Si estas dos instrucciones, que se realizan en 3 ciclos, se realizan 255*255 veces eso equivale : 255 * 255 * 3 = 195075, aproximadamente 196000 instrucciones como se había comentado antes. Código P1.3: ;************************************************ ;
Nombre :
P1_3.asm
;
Fecha
Enero 10,2013
;
Alumno :
Arzabala Contreras Ernesto
;
Grupo
MT00X
:
:
;************************************************ ;
Descripcion
:
Parpadear leds Puerto B , Ciclos anidados
;************************************************ list p=16f887 #include errorlevel -302 __CONFIG _CONFIG1, _HS_OSC & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOR_ON & _IESO_ON & _FCMEN_ON & _LVP_OFF
__CONFIG
_CONFIG2, _BOR40V & _WRT_OFF
;************* DEFINING VARIABLES ***************************************** cblock
0x20
; Block of variables starts at address 20h
counter1
; Variable "counter1" at address 20h
counter2
; Variable "counter2" at address 21h
endc ;************************************************************************** org
banksel clrf
banksel
0x0000
; Address of the first program instruction
TRISB
; Selects bank containing register TRISB
TRISB
; Clears TRISB
PORTB
; Selects bank containing register PORTB
loop movlw
B'11110000' ; Binary number 11110000 is moved to W
movwf
PORTB
movlw
h'FF'
movwf
counter2
; Number is moved to PORTB ; Number hFF is moved to W ; Number is moved to variable "counter2"
loop2 movlw
h'FF'
; Number hFF is moved to W
movwf
counter1
; Number is moved to "counter1"
loop1 decfsz
counter1
goto
loop1
decfsz
counter2
goto
loop2
movlw
; Decrements "counter1" by 1. If result is 0 ; skip next instruction
; Decrements "counter2" by 1. If result is 0 ; skip next instruction
B'00001111' ; Binary number 00001111 is moved to W
movwf
PORTB
; Number is moved to PORTB
movlw
h'FF'
movwf
counter2
; Number hFF is moved to W ; Number is moved to variable "counter2"
loop4 movlw
h'FF'
; Number hFF is moved to W
movwf
counter1
; Number is moved to variable "counter1"
loop3 decfsz
counter1
; Decrements "counter1" by 1. If result is 0
; skip next instruction goto
loop3
decfsz
counter2
goto
loop4
; skip next instruction
goto
loop
; Jump to label loop
end
; Decrements "counter2" by 1. If result is 0
; End of program
Circuito P1.3: Igual al de la práctica P1.2
Practica 1.4 Temporizador TMR0 e interrupciones Descripción P1.4: En la práctica anterior se puede apreciar la desventaja de realizar retardos de tiempo (“delays”) utilizando ciclos. En casos como el de la practica anterior, el microcontrolador está captivo y no hace nada más que esperar a que pase el tiempo. Esa pérdida de tiempo es inaceptable y es necesario encontrar otro método para realizar retardos de tiempo. En este ejemplo se hace uso de los temporizadores (“timers”) y de interrupciones (“interrupts”) y se hace un vínculo entre ambos de manera práctica. Para este ejemplo es necesario realizar un retardo de tiempo lo suficientemente largo para apreciar el cambio en los leds del PORTB. En esta ocasión el temporizador TMR0, con un pre-escalador (“prescaler”), es utilizado para ese propósito. La interrupción ocurre cada vez que ocurre un sobre-flujo (“overflow”) el registro del temporizador. La interrupción incrementa el valor mostrado en el PORTB en uno. Todo el proceso es realizado detrás de cámaras (“behind the scenes”) , esto permite que el microcontrolador haga otras cosas mientras espera a que en el registro del temporizador se genere una interrupción por sobre-flujo y se interrumpa momentáneamente la ejecución del programa principal. En este ejemplo hay poner atención a ciertos detalles:
Aun y cuando no es necesario en este caso, los contenidos de los registros más importantes (W, STATUS and PCLATH) deben de guardarse al inicio de cada rutina de interrupción. La interrupción causa que la bandera apropiada se active (“set”), en este ejemplo la bandera que se activa es TMR0IF, y que el bit GIE se desactive (“clear”). Al finalizar la rutina de interrupción no hay que olvidar regresar el bit GIE y la bandera a los valores que tenían anteriormente. Finalmente es crucial que los registros importantes sean devueltos a los valores que tenían antes de entrar a la rutina de interrupción.
Código P1.4: ;************************************************ ;
Nombre :
P1_4.asm
;
Fecha
Enero 10,2013
;
Alumno :
Arzabala Contreras Ernesto
;
Grupo
MT00X
:
:
;************************************************ ;
Descripcion
:
Temporizador TMR0 e interrupciones
;************************************************
list p=16f887 #include
errorlevel -302
__CONFIG _CONFIG1, _HS_OSC & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOR_ON & _IESO_ON & _FCMEN_ON & _LVP_OFF
__CONFIG
_CONFIG2, _BOR40V & _WRT_OFF
;**************** DEFINING VARIABLES ****************************************
cblock
0x20
; Block of variables starts at address 20h
w_temp
; Variable at address 20h
pclath_temp
; Variable at address 21h
status_temp
; Variable at address 22h
endc
;************************ START OF PROGRAM ********************************** org
0x0000
; Address of the first program instruction
goto
main
; Go to label "main"
;************************ INTERRUPT ROUTINE ********************************* org movwf movf movwf movf
0x0004
; Interrupt vector
w_temp STATUS
; Saves value in register W ; Saves value in register STATUS
status_temp PCLATH
; Saves value in register PCLATH
movwf
pclath_temp
banksel
PORTB
incf
banksel bcf
movf movwf movf
PORTB
INTCON
; Increments register PORTB by 1
; Selects bank containing INTCON
INTCON,TMR0IF ; Clears interrupt flag TMR0IF
pclath_temp,w ; PCLATH is given its original content PCLATH status_temp,w ; STATUS is given its original content
movwf
STATUS
swapf
w_temp,f
swapf
w_temp,w
bsf
; Selects bank containing PORTB
INTCON,GIE
; W is given its original content
; Global interrupt enabled
retfie
; Return from interrupt routine
;************************ MAIN PROGRAM ************************************** main
banksel
; Start of the main program
ANSEL
clrf
ANSEL
clrf
ANSELH
banksel clrf
banksel
; Bank containing register ANSEL ; Clears registers ANSEL and ANSELH ; All pins are digital
TRISB
; Selects bank containing register TRISB
TRISB
; All port B pins are configured as outputs
OPTION_REG
; Bank containing register OPTION_REG
bcf
OPTION_REG,T0CS ; TMR0 counts pulses from oscillator
bcf
OPTION_REG,PSA ; Prescaler is assign to timer TMR0
bsf
OPTION_REG,PS0 ; Prescaler rate is 1:256
bsf
OPTION_REG,PS1
bsf
OPTION_REG,PS2
banksel
INTCON
; Bank containing register INTCON
bsf
INTCON,TMR0IE ; TMR0 interrupt overflow enabled
bsf
INTCON,GIE
banksel clrf
PORTB
; Global interrupt enabled
; Bank containing register PORTB
PORTB
; Clears port B
loop
; Remain here
loop goto end
; End of program
Circuito P1.4:
Practica 1.5 Uso de botones y subrutinas Descripción P1.5: En los ejemplos anteriores el microcontrolador simplemente ejecuta el programa sin la posibilidad de poder interactuar de alguna manera con este. En la realidad dispositivos trabajando de esta manera son poco comunes. Para agregarle más funcionalidad al programa que ejecuta un microcontrolador es necesario utilizar las entradas con las que este cuenta. Este ejemplo es bastante sencillo en realidad. Al inicio del programa, justo después de definir las variables, los pines del microcontrolador son configurados utilizando los registros TRISA y TRISB. Los pines del PORTA son configurados como entrada utilizando el registro TRISA, aun y cuando esto no es necesario ya que la configuración inicial de los pines del PORTA es de ser entradas. El programa inicia activando un bit del PORTB y luego el contenido de este registro es constantemente desplazados un lugar hacia la izquierda (utilizando la instrucción RLF, “Rotate Left f through Carry”). Esto produce la impresión de que el diodo “led” encendido se mueve. Presionando el botón “STOP” detiene el movimiento y el programa se mantiene en el “loop3”. El retardo de tiempo en esta ocasión es realizado en una subrutina llamada “DELAY”.
Código P1.5: ;************************************************ ;
Nombre :
P1_5.asm
;
Fecha
Enero 10,2013
;
Alumno :
Arzabala Contreras Ernesto
;
Grupo
MT00X
:
:
;************************************************ ;
Descripcion
:
Uso de botones y subrutinas
;************************************************
list p=16f887 #include
errorlevel -302
__CONFIG _CONFIG1, _HS_OSC & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOR_ON & _IESO_ON & _FCMEN_ON & _LVP_OFF
__CONFIG
_CONFIG2, _BOR40V & _WRT_OFF
;************* DEFINING VARIABLES *******************************************
cblock
0x20
; Block of variables starts at address 20h
counter1
; Variable "counter1" at address 20h
counter2
; Variable "counter2" at address 21h
endc
; Block of variables ends
;************************ MAIN PROGRAM **************************************
org banksel
0x0000 ANSEL
clrf
ANSEL
clrf
ANSELH
; Address of the first program instruction ; Selects bank containing register ANSEL ; Clears registers ANSEL and ANSELH to ; configure all inputs as digital
banksel clrf
TRISB
; Selects bank containing register TRISB
TRISB
; All port B pins are configured as outputs
movlw
B'00000010'
movwf
TRISA
; Pin RA1 is input
banksel
PORTB
; Selects bank containing register TRISB
movlw
B'00000001'
movwf
PORTB
; Writes 1 to register W ; Number is moved to PORTB
loop rlf
PORTB
; Port B bits rotates by one place left
call
DELAY
; Calls subroutine "DELAY"
loop3 btfss
PORTA,1
; Tests the first port A bit
goto
loop3
; "0" is applied to pin.Go to label "loop3"
goto
loop
; "1" is applied to pin.Go to label "loop"
;************************ SUBROUTINES *************************************** DELAY clrf
counter2
; Clears variable "counter2"
counter1
; Clears variable "counter1"
loop1 clrf loop2 decfsz
counter1
goto
loop2
decfsz
counter2
goto
loop1
return
end
; Decrements variable "counter1" by 1 ; Result is not 0. Go to label loop2 ; Decrements variable "counter2" by 1 ; Result is not 0. Go to lab loop1
; Return from subroutine "DELAY"
; End of program
Circuito P1.5:
Practica 1.6 Temporizador TMR0 como contador, variables y relevadores Descripción P1.6: En este ejemplo el temporizador TMR0 es usado como contador. La idea es conectar la entrada del contador a un botón de tal manera que se cuente un pulso cada vez que se presione el botón. Cuando el número de pulsos contados es igual al número en el registro “TEST”, un nivel lógico de 1 (5 V DC) aparece en el pin 3 del PORTD. Dado que este voltaje activa un relevador electromecánico, este bit es llamado “Relay”. En este ejemplo, el registro “TEST” contiene el número 5. En realidad, puede ser cualquier número. En lugar del relevador, el microcontrolador puede activar algún otro dispositivo y en lugar de botones se pueden usar sensores.
Código P1.6: ;************************************************ ;
Nombre :
P1_6.asm
;
Fecha
Enero 10,2013
;
Alumno :
Arzabala Contreras Ernesto
;
Grupo
MT00X
:
:
;************************************************ ;
Descripcion
:
Temporizador TMR0 como contador, variables y relevadores
;************************************************
list p=16f887 #include
errorlevel -302
__CONFIG _CONFIG1, _HS_OSC & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOR_ON & _IESO_ON & _FCMEN_ON & _LVP_OFF
__CONFIG
_CONFIG2, _BOR40V & _WRT_OFF
;************* DEFINING VARIABLES *******************************************
TEST #define
equ B'00000101' ; Binary number 00000101 = TEST RELAY PORTD,3 ; Pin PORTD,3 = RELAY
;************************ MAIN PROGRAM ************************************** org
banksel
0x0000
; Address of the first program instruction
TRISB
; Selects bank containing register TRISB
clrf
TRISB
; All port B pins are configured as outputs
clrf
TRISD
; All port D pins are configured as outputs
movlw
B'00010000'
movwf
TRISA
; This number is written to W register
; Only the forth pin of port A is input
banksel
OPTION_REG
; Bank containing OPTION_REG register
bsf
OPTION_REG,T0CS ; Pin RA4 is supplied with pulses
bsf
OPTION_REG,PSA ; Prescaler rate is 1:1
banksel
PORTB
clrf
TMR0
bcf
PORTD,3
; Selects bank containing PORTB register
; Clears timer register ; Pin PORTD,3 = 0
loop movfw
TMR0
; Timer register is moved to W register
movwf
PORTB
; W register is moved to PORTB
xorlw
TEST
; Operation exclusive OR between ; W register and number TEST (00000101)
btfsc bsf goto
end
STATUS,Z PORTD,3 loop
; If numbers are equal, result is 0 and ; bit STATUS,Z = 1. Bit PORTD,3 is set ; and jump to label loop is executed
; End of program
Circuito P1.6:
Practica 1.7 Macros y rutinas para evitar el rebote de botones Descripción P1.7: [Escriba aquí una descripción del funcionamiento] Código P1.7: ;********************** Header ********************** ;************* DEFINING VARIABLES *************************
cblock
HIcnt
0x20
; Block of variables starts at address 20hex
LOcnt LOOPcnt cnt endc
; End of block of variables
;********************************************************************** ORG
0x000
; Reset vector
nop goto
main
; Go to program start (label "main")
;**********************************************************************
include "pause.inc" include "button.inc"
;********************************************************************** main banksel
ANSEL
clrf
ANSEL
clrf
ANSELH
banksel
TRISB
bsf
TRISA, 0
bsf
TRISA, 1
clrf
TRISB
banksel clrf
PORTB cnt
; Selects bank containing ANSEL ; All pins are digital
Loop button
PORT,0,0,Increment
button
PORT,1,0,Decrement
goto
Loop
Increment incf movf movwf goto
cnt, f cnt, w PORTB Loop
Decrement decf movf movwf goto
cnt, f cnt, w PORTB Loop
end
; End of program
Macro pausems
ARCHIVO: pause.inc
; Todo este código va en un archivo llamado pause.inc ;********************************************************************** pausems MACRO arg1 local
Loop1
local
dechi
local
Delay1ms
local
Loop2
local
End
movlw
High(arg1)
; Higher byte of argument is moved
; to HIcnt movwf
HIcnt
movlw
Low(arg1)
; Lower byte of argument is moved
; to LOcnt movwf
LOcnt
Loop1 movf
LOcnt, f
btfsc
STATUS, Z
goto
dechi
call
Delay1ms
decf
LOcnt, f
goto
Loop1
; Decrements HIcnt and LOcnt while ; needed and calls subroutine Delay1ms
dechi movf
HIcnt, f
btfsc
STATUS, Z
goto
End
call
Delay1ms
decf
HIcnt, f
decf
LOcnt, f
goto
Loop1
Delay1ms:
; Delay1ms provides delay of
movlw
.100
movwf
LOOPcnt
; 100*10us=1ms ; LOOPcnt
View more...
Comments