Академический Документы
Профессиональный Документы
Культура Документы
PRACTICAS
MICROCONTROLADOR
PIC18F4550
20/08/2012
CONTENIDO
Objetivo general……………………………………………………………………. 3
3
Justificación…………………………………………………………………………
3
Prologo………………………………………………………………………………
4
Microcontrolador PIC18F4550.................................................................................
2
OBJETIVO GENERAL
JUSTIFICACIÓN
PRÓLOGO
3
más utilizados en la implementación de proyectos de sistemas de control en la
industria.
Por tanto, es indispensable tener conocimiento suficiente de la utilización de este
elemento. De ahí la necesidad de la elaboración de este manual de prácticas de los
microcontroladores PIC´S, el cual está orientado principalmente a aquellos
ingenieros, estudiantes, diseñadores y toda aquella persona que tenga interés de
explotar esta poderosa herramienta de la electrónica.
Para un mejor manejo del presente manual, será necesario de que el lector cuente
con los conocimientos básicos de electrónica digital y programación. No es
indispensable tener conocimientos avanzados sobre el área, ya que este trabajo
cuenta con la explicación suficiente en cada una de las prácticas que se presentan.
Es indispensable para la mejor utilización del presente manual, haber revisado
previamente el compendio de apuntes desarrollado como complemento al presente
manual.
MICROCONTROLADOR PIC18F4550
Familias:
PIC10: Microcontroladores de 8 bits, de bajo costo, de 6 pines y bajas
prestaciones.
PIC12: Microcontroladores de 8 bits, de bajo coste, de 8 pines y bajas
prestaciones.
PIC16: Microcontroladores de 8 bits, con gran variedad de número de pines y
prestaciones medias.
PIC18: Microcontroladores de 8 bits, con gran variedad de número de pines y
prestaciones medias/altas.
PIC24: Microcontroladores de 16 bits.
4
Características fundamentales:
Arquitectura RISC avanzada Harvard: 16- bit con 8 bit de datos.
77 instrucciones.
Desde 18 a 80 pines.
Hasta 64K bytes de programa (hasta 2 Mbytes en ROMless).
Multiplicador Hardware 8x8.
Hasta 3968 bytes de RAM y 1KBytes de EEPROM.
Frecuencia máxima de reloj 40Mhz. Hasta 10 MIPS.
Pila de 32 niveles.
Múltiples fuentes de interrupción.
Periféricos de comunicación avanzados (CAN y USB).
5
Pines del microcontrolador pic18f4550.
6
Diagrama de bloques.
7
Organización de memoria.
El µC PIC18F4550 dispone de las siguientes memorias:
Memoria de programa:
Memoria flash interna de 32.768 bytes.
Almacena instrucciones y constantes/datos.
Puede ser escrita/leída mediante un programador externo o durante la
ejecución programa mediante unos punteros.
Memoria RAM de datos:
Memoria SRAM interna de 2048 bytes en la que están incluidos los registros de
función especial.
Almacena datos de forma temporal durante la ejecución del programa.
Puede ser escrita/leída en tiempo de ejecución mediante diversas instrucciones.
Memoria EEPROM de datos:
Memoria no volátil de 256 bytes.
Almacena datos que se deben conservar aun en ausencia de tensión de
alimentación.
Puede ser escrita/leída en tiempo de ejecución a través de registros.
Pila:
Bloque de 31 palabras de 21 bits.
Almacena la dirección de la instrucción que debe ser ejecutada después de una
interrupción o subrutina.
Memoria de configuración:
Memoria en la que se incluyen los bits de configuración (12 bytes de memoria
flash) y los registros de identificación (2 bytes de memoria de solo lectura).
Memoria de configuración.
Se trata de un bloque de memoria situado a partir de la posición 30000H de
memoria de programa (más allá de la zona de memoria de programa de usuario).
En esta memoria de configuración se incluyen:
Bits de configuración: contenidos en 12 bytes de memoria flash permiten la
configuración de algunas opciones del µC como:
– Opciones del oscilador.
– Opciones de reset.
– Opciones del watchdog.
Opciones de la circuitería de depuración y programación.
Opciones de protección contra escritura de memoria de programa y memoria
EEPROM de datos.
Estos bits se configuran generalmente durante la programación del uC, aunque
también pueden ser leídos y modificados durante la ejecución del programa.
8
Registros de identificación: se trata de dos registros situados en las direcciones
3FFFFEH y 3FFFFFH que contienen información del modelo y revisión del
dispositivo. Son registros de solo lectura y no pueden ser modificados por el
usuario.
Arquitectura Hardvard:
El µC PIC18F4550 dispone de buses diferentes para el acceso a memoria de
programa y memoria de datos (arquitectura Harvard):
Bus de la memoria de programa:
21 líneas de dirección.
16/8 líneas de datos (16 líneas para instrucciones/8 líneas para datos).
Bus de la memoria de datos:
12 líneas de dirección.
8 líneas de datos.
Esto permite acceder simultáneamente a la memoria de programa y a la memoria
de datos. Es decir se puede ejecutar una instrucción (lo que por lo general requiere
acceso a memoria de datos) mientras se lee de la memoria de programa la siguiente
instrucción (proceso pipeline).
Por tanto la ejecución completa de 1 instrucción (lectura instrucción +ejecución) se
hace en un 1 ciclo de instrucción (4 TOSC). EXCEPCION: las instrucciones que
modifican el contenido del PC requieren 2 ciclos de instrucción.
9
Memoria de programa:
10
Almacenamiento de instrucciones en memoria de programa.
Primero se almacena la parte baja de la instrucción y luego la parte alta (para las
instrucciones de 4 bytes primero los bytes menos significativos y luego los más
significativos).
Las instrucciones siempre empiezan en direcciones pares.
11
La pila de dirección.
12
PRACTICA I. PUERTOS DE ENTRADA Y SALIDA DIGITAL (I/O).
Conocimientos previos.
Todas las líneas digitales de E/S disponen de al menos una función alternativa
asociada a alguna circuitería especifica del µC. Cuando una línea trabaja en el
modo alternativo no puede ser utilizada como línea digital de E/S estándar.
13
Puerto A
14
Puerto B:
15
Dispone de 8 líneas de E/S. Las funciones alternativas son:
RB0: entrada analógica (AN12)/ interrupción externa 0 (INT0)/entrada de fallo
del ECCP (FLT0)/entrada de datos del SPI (SDI)/línea de datos del I2C (SDA).
RB1: entrada analógica (AN10)/ interrupción externa 1 (INT1)/línea de reloj del
SPI (SDI)/línea de reloj del I2C (SDA).
RB2: entrada analógica (AN8)/ interrupción externa 2 (INT2)/salida de datos del
USB (VCMO).
RB3: entrada analógica (AN9)/ línea de E/S del CCP2 (CCP2)/salida de datos del
USB (VPO).
RB4: entrada analógica (AN11)/ interrupción por cambio en pin (KBI0)/ salida
de CS del SSP (CSSP).
RB5: interrupción por cambio en pin (KBI1)/ línea de programación (PGM).
RB6: interrupción por cambio en pin (KBI2)/ línea de programación (PGC).
RB7: interrupción por cambio en pin (KBI3)/ línea de programación (PGD).
16
Desarrollo de la Práctica I:
Se lee un dato de cuatro bits por el puerto A y se despliega por el puerto B.
Implementar el siguiente circuito basado en el microcontrolador PIC18f4550:
Programa de la Práctica I:
TITLE 'PROG.QUE LEE UN DATO DE 4BITS POR PTO.A Y DESPL.POR PTO.B '
LIST P=18F4550
#INCLUDE <P18F4550.INC>
CONFIG PLLDIV = 1 ; No prescale (4 MHz oscillator input drives PLL directly)
CONFIG CPUDIV = OSC1_PLL2 ; [OSC1/OSC2 Src: /1][96 MHz PLL Src: /2]
CONFIG USBDIV = 1 ;USB clock source comes directly from the primary oscillator block with no postscale
CONFIG FOSC = XT_XT ; XT oscillator, XT used by USB
CONFIG FCMEN = OFF ; Fail-Safe Clock Monitor disabled
CONFIG IESO = OFF ; Oscillator Switchover mode disabled
CONFIG PWRT = OFF ; PWRT disabled
CONFIG BOR = OFF ; Brown-out Reset disabled in hardware and software
CONFIG VREGEN = OFF ; USB voltage regulator disabled
CONFIG WDT = OFF ; HW Disabled - SW Controlled
CONFIG MCLRE = ON ; MCLR pin enabled; RE3 input pin disabled
CONFIG LPT1OSC = OFF ; Timer1 configured for higher power operation
CONFIG PBADEN = OFF ; PORTB<4:0> pins are configured as digital I/O on Reset
CONFIG CCP2MX = ON ; CCP2 input/output is multiplexed with RC1
CONFIG STVREN = ON ; Stack full/underflow will cause Reset
CONFIG LVP = OFF ; Single-Supply ICSP disabled
CONFIG ICPRT = OFF ; ICPORT disabled
CONFIG XINST = OFF ; Instruction set extension and Indexed Addressing mode disabled (Legacy mode)
CONFIG DEBUG = OFF ; Background debugger disabled, RB6 and RB7 configured as general
17
; purpose I/O pins
ORG 0
GOTO INICIO ; vector reset
ORG 0X04 ; vector de interrupciones
CBLOCK 0X20 ; declaracion de inicio de variables
DATO ; var.que tiene la info. a desplegar desplegar
;DATOC ; var.que tiene la info. En complemento a desplegar
ENDC
INICIO
MOVLW 0X0F ; mover 0F a W
MOVWF ADCON1 ; configura PTO.A como E/S digitales.
MOVLW 0X07
MOVWF CMCON, 0 ; COMPARADORES EN OFF
MOVLW 0X0F ; mover 0F a W
MOVWF TRISA ; config PTO.A como entrada (4 bits menos signif.)
CLRF PORTB ; Inicializa PORTB
MOVLW 0X01 ; mover 01 a W
MOVWF TRISB ; mov.W a reg.TRISB(se conf.el pto.Bsal.exc.BIT0)
SALTO1
MOVF PORTA,WREG ;mover PORTA a W(leer puerto A)
ANDLW 0X0F ; AND entre W y 0F(limpia nibble superior)
MOVWF DATO ; mover W a DATO
MOVF DATO,WREG ;mover DATO a W para enviar a tabla.
CALL LEER ; llama rutina leer
; CLRF DATOC ; Uilizadas para displays de anodo común.
; MOVWF DATOC
; COMF DATOC,W
MOVWF PORTB ; mover W(con val.corresp.de la tabla)a PORTB
GOTO SALTO1 ; salta a SALTO1
18
PRÁCTICA II. CONTADOR DECIMAL ASCENDENTE CON RUTINA DE
RETARDO POR CICLOS ANIDADOS.
19
CONFIG WDT = OFF ; HW Disabled - SW Controlled
CONFIG MCLRE = ON ; MCLR pin enabled; RE3 input pin disabled
CONFIG LPT1OSC = OFF ; Timer1 configured for higher power operation
CONFIG PBADEN = OFF ; PORTB<4:0> pins are configured as digital I/O on Reset
CONFIG CCP2MX = ON ; CCP2 input/output is multiplexed with RC1
CONFIG STVREN = ON ; Stack full/underflow will cause Reset
CONFIG LVP = OFF ; Single-Supply ICSP disabled
CONFIG ICPRT = OFF ; ICPORT disabled
CONFIG XINST = OFF ; Instruction set extension and Indexed Addressing mode disabled (Legacy
mode)
CONFIG DEBUG = OFF
ORG 0
GOTO INICIO ;vector reset
ORG 0X18 ;vector de interrupciones
CBLOCK 0X20 ;declaración de inicio de variables
DATO ;var.que tiene la info. a desplegar
RET1 ;RET1,2 vars.para crear un ciclo anidado
RET2 ;con la finalidad de crear un retardo.
ENDC
INICIO
MOVLW 0X0F ;mover 0F a W
MOVWF ADCON1 ;configura PTO.A como E/S digitales.
CLRF PORTB ;Inicializa PORTB
CLRF LATB
MOVLW 0X01 ;mover 01 a W
MOVWF TRISB ;mov.W a reg.TRISB(se conf.el pto.Bsal.exc.BIT0)
CLRF DATO ;limpiar loc.de memoria DATO.
L1
INCF DATO,1 ;incrementa DATO
MOVLW 0X0A ;mover 0A a W
SUBWF DATO,W ;resta DATO-W y resultado en W
MOVLW 0X00 ;mover 00 a W(limpia W)
BTFSC STATUS,Z ;probarZ si=0(result.de op.no=0)salta inst.sig.
MOVWF DATO ;mover W a DATO(limpia dato)
MOVF DATO,W ;mover DATO a W para enviar a tabla
CALL LEER ;llama rutina leer
MOVWF PORTB ;mover W a PORTB
CALL RETARDO ;llamar rutina retardo
GOTO L1
LEER
RLCF WREG
ADDWF PCL,F ;suma W+PCL(parte baja del cont.de prog.+ w)
RETLW B'01111110' ;tabla que asigna valores de seg. del display
RETLW B'00001100' ;(g,f,e,d,c,b,a resp.) para el despliegue de
RETLW B'10110110' ;los números(0 a 9).Además W regresa con el
RETLW B'10011110' ;valor correspondiente de la tabla.
RETLW B'11001100' ;NOTA:se hizo un desp.a izq.para otras aplicac.
RETLW B'11011010'
RETLW B'11111010'
RETLW B'00001110'
RETLW B'11111110'
RETLW B'11011110'
RETARDO
MOVLW 0XFF ;mover FF a W(ajuste de retardo mayor)
MOVWF RET2 ;mover valor de W a var.RET2
L2 MOVLW 0XFF ;mover FF a W(ajuste de retardo menor)
MOVWF RET1 ;mover valor de W a var.RET1
L3 DECF RET1,F ;dec RET1 dejando el nuevo valor en RET1
BTFSS STATUS,Z ;Prueba Z si=1(result.deop.=0)salta lainst.sig.
GOTO L3 ;salta a L3
DECF RET2,F ;dec RET2 dejando el nuevo valor en RET2
BTFSS STATUS,Z ;Prueba Z si=1(result.de op.=0)saltalainst.sig.
GOTO L2 ;salta a L2
RETURN ;retorno de rutina
END
20
PRÁCTICA III. CONTADOR DECIMAL ASCENDENTE CON RUTINA DE
RETARDO POR TEMPORIZADOR (TIMER).
Conocimientos previos.
Temporizador 0:
Características fundamentales:
Configurable como temporizador/contador de 8 bits/16 bits.
Pre-escalar de 8 bits programable.
Interrupción por desbordamiento
21
Modo temporizador de 8 bits:
T08BIT (T0CON)=‘1’/T0CS (T0CON)=‘0’
Dos opciones:
Sin pre-escalar PSA (T0CON)=‘0’: el registro TMR0L se incrementa con cada
ciclo de instrucción (FOSC/4).
Con pre-escalar PSA (T0CON)=‘1’: el contador de pre-escalar se incrementa en
cada ciclo de instrucción (FOSC/4). Cuando el pre-escalar alcanza el valor
programado en los bits PS2..PS0 (T0CON) produce un pulso que incrementa el
registro TMR0L.
Cuando se produce desbordamiento de TMR0L se pone a ‘1’ el flag TMR0IF
22
Con pre-escalar PSA (T0CON)=‘1’: el contador de pre-escalar se incrementa con
cada flanco de subida (T0SE=‘0’) o de bajada (T0SE=‘0’) de la línea T0CKI (RA4).
Cuando el pre-escalar alcanza el valor programado en los bits PS2..PS0
(T0CON) se produce un pulso que incrementa el registro TMR0.
Cuando se produce desbordamiento de TMR0 se pone a ‘1’ el flag TMR0IF
Flag de interrupción: bit TMR0IF (INTCON).
Bit de habilitación: bit TMR0IE (INTCON).
Prioridad: bit TMR0IP (INTCON2): ‘0’->pr. baja/’1’->pr. Alta
Si se produce el desbordamiento del Temporizador 0 se pone a ‘1’ el flag TMR0IF.
Si el bit de habilitación TMR0IE está a ‘1’ y las interrupciones están habilitadas a
nivel global se genera una interrupción y el uC pasa a ejecutar el código situado a
partir de la posición 0008H o 0018H (según el nivel de prioridad establecido).
23
#INCLUDE <P18F4550.INC>
CONFIG PLLDIV = 1 ; No prescale (4 MHz oscillator input drives PLL directly)
CONFIG CPUDIV = OSC1_PLL2 ; [OSC1/OSC2 Src: /1][96 MHz PLL Src: /2]
CONFIG USBDIV = 1 ; USB clock source comes directly from the primary oscillator block with no postscale
CONFIG FOSC = XT_XT ; XT oscillator, XT used by USB
CONFIG FCMEN = OFF ; Fail-Safe Clock Monitor disabled
CONFIG IESO = OFF ; Oscillator Switchover mode disabled
CONFIG PWRT = OFF ; PWRT disabled
CONFIG BOR = OFF ; Brown-out Reset disabled in hardware and software
CONFIG VREGEN = OFF ; USB voltage regulator disabled
CONFIG WDT = OFF ; HW Disabled - SW Controlled
CONFIG MCLRE = ON ; MCLR pin enabled; RE3 input pin disabled
CONFIG LPT1OSC = OFF ; Timer1 configured for higher power operation
CONFIG PBADEN = OFF ; PORTB<4:0> pins are configured as digital I/O on Reset
CONFIG CCP2MX = ON ; CCP2 input/output is multiplexed with RC1
CONFIG STVREN = ON ; Stack full/underflow will cause Reset
CONFIG LVP = OFF ; Single-Supply ICSP disabled
CONFIG ICPRT = OFF ; ICPORT disabled
CONFIG XINST = OFF ; Instruction set extension and Indexed Addressing mode disabled (Legacy mode)
CONFIG DEBUG = OFF ;Background debugger disabled, RB6 and RB7 configured as general purpose I/O pins
ORG 0
GOTO INICIO ;vector reset
CBLOCK 0X20 ;declaración de inicio de variables
DATO ;var.que contiene la info. a desplegar
RET1
ENDC ;fin de área de variables
INICIO
CLRF PORTB ; Initialize PORTB by clearing output data latches
CLRF LATB ; Alternate method to clear data latches
MOVLW 0fh ; Set RB<4:0> as
MOVWF ADCON1 ; digital I/O pins
MOVLW 0X00 ;mover 00 a W (limpiar W)
MOVWF TRISB ;sé conf.el pto.B como salida.
MOVLW B'11000110' ;mover a W el dato binario '10000101'
MOVWF T0CON;
CLRF DATO ;limpia loc.de memoria dato
L1 INCF DATO,1 ;incrementa DATO
MOVLW 0X0A ;mover 0A a W
SUBWF DATO,W ;resta DATO-W y resultado en W
MOVLW 0X00 ;mover 00 a W(limpia W)
BTFSC STATUS,Z ;probar Z si=0(result.de op.no0)salta sig.
MOVWF DATO ;mover W a DATO(limpia dato)
MOVF DATO,W ;mover DATO a W para enviar a tabla.
CALL LEER ;llama rutina leer
MOVWF PORTB ;mover W(con el val.corresp.de la tabla)a PORTB
CALL RETARDO ;llama rutina retardo
GOTO L1
LEER
RLCF WREG
ADDWF PCL,F ;suma W+PCL(parte baja del cont.de prog.+ w)
RETLW B'01111110' ;tabla que asigna valores de seg. del display
RETLW B'00001100' ;(g,f,e,d,c,b,a resp.) para el despliegue de
RETLW B'10110110' ;los números(0 a 9).Además W regresa con el
RETLW B'10011110' ;valor correspondiente de la tabla.
RETLW B'11001100' ;NOTA:se hizo un desp.a izq.para otras aplicac.
RETLW B'11011010'
RETLW B'11111010'
RETLW B'00001110'
RETLW B'11111110'
RETLW B'11011110'
RETARDO
MOVLW 0X40 ;mover 80H a W (AJUSTE DE TIEMPO)
MOVWF RET1 ;mover W a variable RET1
L3 MOVLW 0X00 ;mover 00H a W(limpiar W)
MOVWF TMR0L
L2 BTFSS TMR0L,7
24
GOTO L2
DECFSZ RET1,F
GOTO L3
RETURN
END
25
CONFIG STVREN = ON ; Stack full/underflow will cause Reset
CONFIG LVP = OFF ; Single-Supply ICSP disabled
CONFIG ICPRT = OFF ; ICPORT disabled
CONFIG XINST = OFF ; Instruction set extension and Indexed Addressing mode disabled (Legacy mode)
CONFIG DEBUG = OFF ;;Background debugger disabled, RB6 and RB7 configured as general purpose I/O pins
26
MOVWF RET1 ;mover valor de W a var.RET1
L3 DECF RET1,F ;dec RET1 dejando el nuevo valor en RET1
BTFSS STATUS,Z ;Prueba Z si=1(result.deop.=0)salta lainst.sig.
GOTO L3 ;salta a L3
DECF RET2,F ;dec RET2 dejando el nuevo valor en RET2
BTFSS STATUS,Z ;Prueba Z si=1(result.de op.=0)saltalainst.sig.
GOTO L2 ;salta a L2
RETURN ;retorno de rutina
END ;fin de programa
PRÁCTICA V CONTADOR DE EVENTOS EXTERNOS
A TRAVÉS DE LA TERMINAL RA4/TOCK1.
Objetivo:
Conocimiento y programación de los puertos A y B del microcontrolador
PIC18f4550, así como manejo de tablas y rutinas de retardo por programa,
utilizando el Timer en modo de contador de eventos.
Desarrollo de la Práctica V:
Se realiza la función de un contador de eventos externos a través de la terminal
RA4/TOCK1 del puerto A, donde se recomienda adicionar un circuito eliminador
de "rebotes" para un mejor desempeño el circuito. Implementar el siguiente
circuito basado en el microcontrolador PIC16F873:
Programa de la Práctica V.
TITLE ‘CONTADOR DE EVENTOS EXTERNOS A TRAVÉS DE LA TERMINAL RA4/TOCK1.’
LIST P=18F4550
#INCLUDE <P18F4550.INC>
CONFIG PLLDIV = 1 ; No prescale (4 MHz oscillator input drives PLL directly)
CONFIG CPUDIV = OSC1_PLL2 ; [OSC1/OSC2 Src: /1][96 MHz PLL Src: /2]
CONFIG USBDIV = 1 ; USB clock source comes directly from the primary oscillator block with no postscale
CONFIG FOSC = XT_XT ; XT oscillator, XT used by USB
CONFIG FCMEN = OFF ; Fail-Safe Clock Monitor disabled
27
CONFIG IESO = OFF ; Oscillator Switchover mode disabled
CONFIG PWRT = OFF ; PWRT disabled
CONFIG BOR = OFF ; Brown-out Reset disabled in hardware and software
CONFIG VREGEN = OFF ; USB voltage regulator disabled
CONFIG WDT = OFF ; HW Disabled - SW Controlled
CONFIG MCLRE = ON ; MCLR pin enabled; RE3 input pin disabled
CONFIG LPT1OSC = OFF ; Timer1 configured for higher power operation
CONFIG PBADEN = OFF ; PORTB<4:0> pins are configured as digital I/O on Reset
CONFIG CCP2MX = ON ; CCP2 input/output is multiplexed with RC1
CONFIG STVREN = ON ; Stack full/underflow will cause Reset
CONFIG LVP = OFF ; Single-Supply ICSP disabled
CONFIG ICPRT = OFF ; ICPORT disabled
CONFIG XINST = OFF ; Instruction set extension and Indexed Addressing mode disabled (Legacy mode)
CONFIG DEBUG = OFF;;Background debugger disabled, RB6 and RB7 configured as general purpose I/O pins
ORG 0
GOTO INICIO ;vector reset
CBLOCK 0X20 ;área de variables
RET1
RET2
RET3
ENDC
INICIO
CLRF PORTB
CLRF LATB
MOVLW 0X00 ;mover 00 a W (limpiar W)
MOVWF TRISB ;mov.W a reg.TRISB(se conf.el pto.B de salida)
MOVLW B'11101010' ;elección de fuente de reloj por transición en
MOVWF T0CON ;timer a 1:64,transiente de sub.,reloj int.
MOVLW 0Fh
MOVWF ADCON1 ;configura PTO.A como E/S digitales.
MOVLW 07h
MOVWF CMCON
MOVLW 0X06 ;mover 06 a W
MOVLW B'11111111' ;se conf.pto.A de entrada
MOVWF TRISA
SALTO2
CLRF TMR0L ;limpiar loc.de memoria TMR0
SALTO1
MOVF TMR0L,W ;mover TMR0 a W para enviar a tabla
CALL LEER ;llama rutina leer
MOVWF PORTB ;mover W a PORTB
CALL RETARDO
MOVF TMR0L,W ;mover TMR0 a W
XORLW 0X13 ;OR exclusiva de TMRO y 0A(entr.iguales.sal.0)
BTFSS STATUS,Z ;prueba Z si=1(res.de op.ant.=0)salta sig.inst.
GOTO SALTO1 ;salta a SALTO1
GOTO SALTO2 ;salta a SALTO2
28
BTFSS STATUS,Z ; Prueba Z si=1(result.deop.=0)salta lainst.sig.
GOTO L3 ; salta a L3
DECF RET2,F ; dec RET2 dejando el nuevo valor en RET2
BTFSS STATUS,Z ;Prueba Z si=1(result.de op.=0)saltalainst.sig.
GOTO L2 ; salta a L2
DECF RET3,F ; dec RET3 dejando el nuevo valor en RET3
BTFSS STATUS,Z ; Prueba Z si=1(result.deop.=0)salta lainst.sig.
GOTO L4 ; salta a L3
RETURN ; retorno de rutina
END ;fin de programa
Conocimientos previos.
29
Por otra parte las interrupciones de baja prioridad no pueden interrumpirse entre
ellas. Lo mismo ocurre con las interrupciones de alta prioridad.
NOTA: Además de ser habilitadas globalmente, las interrupciones deben ser
habilitadas a nivel particular mediante su bit de habilitación de interrupción.
30
salto a la dirección de vectorización, se borra el flag de interrupción
correspondiente y se ejecuta el código asociado a dicha interrupción.
4. La última instrucción del código de tratamiento de la interrupción es RETFIE.
Cuando se ejecuta esta instrucción, el uC vuelve a poner a ‘1’ el bit de
habilitación global de interrupciones (GIE, GIEH o GIEL) y escribe en el PC la
dirección que había almacenado en la pila de forma que se continué con la
ejecución del programa a partir del punto en el que había sido interrumpido.
Interrupción externa 1:
Flag de interrupción: bit INTCON3.INT1IF
Bit de habilitación: bit INTCON3.INT1IE
Selección de flanco: bit INTCON2.INTEDG1: ‘0’->fl. bajada/’1’-> fl. subida
Prioridad: bit INT1IP (INTCON3): ‘0’->pr. baja/’1’->pr. Alta
Si se produce un flanco en la línea RB1 (flanco de subida o de baja dependiendo del
valor del bit INTEDG1) se pone el flag INT1IF a ‘1’.
Si el bit de habilitación INT1IE está a ‘1’ y las interrupciones están habilitadas a
nivel global se genera una interrupción y el µC pasa a ejecutar el código situado a
partir de la posición 0008H o 0018H (según el nivel de prioridad establecido).
Interrupción externa 2:
Flag de interrupción: bit INTCON3.INT2IF
Bit de habilitación: bit INTCON3.INT2IE
Selección de flanco: bit INTCON2.INTEDG2: ‘0’->fl. bajada/’1’-> fl. subida
Prioridad: bit INTCON3.INT2IP: ‘0’->pr. baja/’1’->pr. alta
Si se produce un flanco en la línea RB2 (flanco de subida o de baja dependiendo del
valor del bit INTEDG2) se pone el flag INT2IF a ‘1’.
31
Si el bit de habilitación INT2IE está a ‘1’ y las interrupciones están habilitadas a
nivel global se genera una interrupción y el µC pasa a ejecutar el código situado a
partir de la posición 0008H o 0018H (según el nivel de prioridad establecido).
32
Desarrollo de la Práctica VI:
Se verifica la función de la interrupción por sobre flujo del temporizador TMR0.
Implementar el siguiente circuito basado en el microcontrolador PIC184550:
33
Programa de la Práctica VI.
TITLE 'INTERRUPCIÓN POR SOBRE FLUJO DEL TEMPORIZADOR TMR0.'
LIST P=18F4550
#INCLUDE <P18F4550.INC>
CONFIG PLLDIV = 1 ; No prescale (4 MHz oscillator input drives PLL directly)
CONFIG CPUDIV = OSC1_PLL2 ; [OSC1/OSC2 Src: /1][96 MHz PLL Src: /2]
CONFIG USBDIV = 1 ; USB clock source comes directly from the primary oscillator block with no postscale
CONFIG FOSC = XT_XT ; XT oscillator, XT used by USB
CONFIG FCMEN = OFF ; Fail-Safe Clock Monitor disabled
CONFIG IESO = OFF ; Oscillator Switchover mode disabled
CONFIG PWRT = OFF ; PWRT disabled
CONFIG BOR = OFF ; Brown-out Reset disabled in hardware and software
CONFIG VREGEN = OFF ; USB voltage regulator disabled
CONFIG WDT = OFF ; HW Disabled - SW Controlled
CONFIG MCLRE = ON ; MCLR pin enabled; RE3 input pin disabled
CONFIG LPT1OSC = OFF ; Timer1 configured for higher power operation
CONFIG PBADEN = OFF ; PORTB<4:0> pins are configured as digital I/O on Reset
CONFIG CCP2MX = ON ; CCP2 input/output is multiplexed with RC1
CONFIG STVREN = ON ; Stack full/underflow will cause Reset
CONFIG LVP = OFF ; Single-Supply ICSP disabled
CONFIG ICPRT = OFF ; ICPORT disabled
CONFIG XINST = OFF ; Instruction set extension and Indexed Addressing mode disabled (Legacy mode)
CONFIG DEBUG = OFF;;Background debugger disabled, RB6 and RB7 configured as general purpose I/O pins
ORG 0
GOTO INICIO ;vector reset
ORG 0X08 ;vector de interrupciones
GOTO INTERRUP ;salto a la rutina de servicio de int.
CBLOCK 0X20 ;declaracion de inicio de variables
DATO ;var.que tiene la info. a desplegar
ENDC
INICIO
CLRF PORTB
34
CLRF LATB
MOVLW B'10000011' ;mover a W el dato binario '10000111'
MOVWF T0CON
MOVLW 0Fh
MOVWF ADCON1
MOVLW 07h
MOVWF CMCON
MOVLW 0X01 ;mover 01 a W
MOVWF TRISB ;se conf.el pto.B sal.excep.B0
BSF INTCON,5 ;Poner a 1 bit5(TOIE)p.habilitar la int.TMR0
35
PRÁCTICA VII. INTERRUPCIÓN EXTERNA POR LA TERMINAL RB0/INT.
36
CONFIG DEBUG = OFF;;Background debugger disabled, RB6 and RB7 configured as general purpose I/O pins
ORG 0
GOTO INICIO ;vector reset
ORG 0X08 ;vector de interrupciones
GOTO INTERRUP ;salto a RUTINA DE SERVICIO DE INTERRUPCION
CBLOCK 0X20 ;declaracion de inicio de variables
DATO ;var.que tiene la info. a desplegar
ENDC ;fin de área de variables
SALTO2
CLRF DATO ;limpiar loc.de memoria DATO.
SALTO1 BSF INTCON,7 ;poner a 1 bit7(GIE)para habilitar int.global
MOVF DATO,W ;mover DATO a W para enviar a tabla
CALL LEER ;llama rutina leer
MOVWF PORTB ;mover W a PORTB
MOVF DATO,W ;mover DATO a W
XORLW 0X13 ;OR exclusiva de TMRO y 0A(entr.iguales.sal.0)
BTFSS STATUS,Z ;prueba Z si=1(res.de op.ant.=0)salta sig.inst.
GOTO SALTO1 ;salta a SALTO1
GOTO SALTO2 ;salta a SALTO2
INTERRUP
BCF INTCON,7 ;limpiar bit7(GIE)para deshab.int.global
BTFSS INTCON,1 ;probar bit1(INTF)=1(ocurrió int.)s.sig.ins.
NOP ;No operación(se probaría otra causa de int.)
INCFSZ DATO,F ;incrementa DATO si Z=1(dato+1=0)salta sig.ins.
MOVF DATO,W ;mover DATO a W
BCF INTCON,1 ;limpiar bit1(INTF)para limpiar band.de int.ext.
RETFIE ;regreso de rutina de servicio de interrupción
37
PRÁCTICA VIII MODULACIÓN POR ANCHO DE PULSO (PWM) Y
ENTRADA POR CAPTURA.
Temporizador 1:
Características fundamentales:
Configurable como temporizador/contador de 16 bits
Dispone de un oscilador propio que puede funcionar como:
Señal de reloj del temporizador 1.
Señal de reloj del µC en modos de bajo consumo.
Pre-escalar de 3 bits programable.
Interrupción por desbordamiento
Existen dos modos de acceder al registro TMR1:
RD16 (T1CON)=‘0’: se accede a TMR1L y TMR1H como dos registros
independientes.
RD16 (T1CON)=‘1’: la parte alta de TMR1 no es accesible directamente. Se
accede a ella a través de TMR1H que funciona como un búfer:
Cuando se lee el valor de TMR1L, el valor de la parte alta de TMR1 pasa al
registro TMR1H. Para leer el valor de TMR1 primero leemos TMR1L y luego
leemos TMR1H.
Cuando se escribe en TMR1L, el valor de TMR1H pasa a la parte alta de
TMR1. Para escribir en TMR1 primero escribimos la parte alta en TMR1H y
luego escribimos la parte baja en TMR1L.
Temporizador 2:
Características fundamentales:
38
Temporizador de 8 bits (registro TMR2)
Registro de periodo PR2
Pre-escalar de 2 bits programable (1:1, 1:4, 1:16)
Post-escalar de 4 bits (1:1…1:16 )
Interrupción por igualdad entre TMR2 y PR2
Se puede utilizar junto con los módulos CCP y ECCP
Se puede utilizar como señal de reloj del módulo MSSP en modo SPI
Los registros TMR2 y PR2 son de lectura escritura. Los contadores del pre-escalar y
el post-escalar no son accesibles por el usuario. Se ponen a 0 automáticamente
cuando:
Se escribe en TMR2
Se escribe en T2CON
Se produce un reset
39
La señal de salida del Temporizador 2 puede utilizarse en el módulo CCP para
generar señales PWM o en el módulo MSSP como señal de reloj del modo SPI. La
señal de salida del Temporizador está conectada a un contador post-escalar que se
incrementa cada vez que se produce la igualdad entre TMR2 y PR2. Cuando el
contador post-escalar desborda se pone a ‘1’ el flag de interrupción del
Temporizador 2 (T2IF). El número de pulsos de la señal de salida del
Temporizador 2 necesarios para provocar el desbordamiento del post-escalar
puede configurarse de 1 a 16 en función de los T2OUTPS3..T2OUTPS0.
Temporizador 3:
Características fundamentales:
Configurable como temporizador/contador de 16 bits
Dispone de varias opciones de señal de reloj en el modo temporizador:
Oscilador principal con o sin pre-escalar
Oscilador del temporizador 1 con o sin pre-escalar
Pre-escalar de 3 bits programable
Interrupción por desbordamiento
40
Modulo de comparacion/captura/pwm:
Elementos asociados:
Temporizador asociado: Temporizador 1 o Temporizador 3 en función de los
bits T3CCP2..T3CCP0 (registro T3CON)
Registros de comparación: CCP2RH y CCPR2L.
Línea de E/S: RC1/T1OSI/CCP2 o RB3/AN9/CCP2 en función del valor del bit
de configuración CCP2MX (registro de configuración CONFIG3H):
CCP2MX=‘0’: CCP asociado al pin RB3/AN9/CCP2
CCP2MX=‘1’: CCP asociado al pin RC1/T1OSI/CCP2 (configuración por
defecto).
Interrupción asociada a los modos de Captura y Comparación (flag de
interrupción CCP2IF).
41
Modo de Captura:
En el modo de captura el valor del Temporizador 1 o del Temporizador 3 pasa al
par de registros CCPR2H; CCPR2L cuando se produce alguno de los siguientes
eventos en el pin del CCP (RB3 o RC1):
En cada flanco de bajada (CCP2M3..CCP2M0=“0100”)
En cada flanco de subida (CCP2M3..CCP2M0=“0101”)
Cada 4 flancos de subida (CCP2M3..CCP2M0=“0110”)
Cada 16 flancos de subida (CCP2M3..CCP2M0=“0111”)
La selección del Temporizador que se captura se realiza mediante los bits T3CCP2
y T3CCP1 del registro T3CON:
Si T3CCP2=‘’0 y T3CCP1=‘0’ el temporizador capturado será el Temporizador 1
En cualquier otro caso el temporizador capturado será el Temporizador 3
El temporizador que se utilice debe configurarse en modo Temporizador o en
modo contador síncrono. Si se configura en modo contador asíncrono el modo
captura no funcionará. Cuando la condición de captura se cumple el flag de
interrupción CPP2IF se pone a ‘1’.
Cuando se realiza un cambio de modo de captura el valor del prescalar no se
inicializa, además el bit CCP2IF puede ponerse a ‘1’ de forma no controlada. Para
evitar esta falsa interrupción y resetear el prescalar, antes de cambiar de modo de
42
captura, debe desactivarse el modo captura (CCP2CON=0x00) y a continuación
establecer el nuevo modo de captura.
Modo de Comparación:
En el modo de comparación el par de registros [CCPR2H; CCPR2L] se comparan
continuamente con el Temporizador asociado (Temporizador 1 o 3). Existen varios
modos de comparación en función del valor de los bits: CCP2M3..CCP2M0:
CCP2M3..CCP2M0=“0010”: El pin de salida del CCP2 se inicializa a ‘0’. Cada
vez que se produce la igualdad entre [CCPR2H;CPPR2L] y el Temporizador
asociado se complementa el pin de salida y se pone a ‘1’ el flag CCP2IF.
CCP2M3...CCP2M0=“1000”: El pin de salida del CCP2 se inicializa a ‘0’.
Cuando se produce la igualdad entre [CCPR2H; CPPR2L] y el Temporizador
asociado el pin de salida se pone a ‘1’ y se pone a ‘1’ el flag CCP2IF.
CCP2M3..CCP2M0=“1001”: El pin de salida del CCP2 se inicializa a ‘1’. Cuando
se produce la igualdad entre [CCPR2H; CPPR2L] y el Temporizador asociado el
pin de salida se pone a ‘0’ y se pone a ‘1’ el flag CCP2IF.
CCP2M3..CCP2M0=“1010”: El pin de salida del CCP2 toma el valor del latch
correspondiente. Cuando se produce la igualdad entre [CCPR2H;CPPR2L] y el
Temporizador asociado se pone a ‘1’ el flag CCP2IF.
CCP2M3..CCP2M0=“1011”: El pin de salida del CCP2 toma el valor del latch
correspondiente. Cuando se produce la igualdad entre [CCPR2H;CPPR2L] y el
Temporizador asociado se inicia una conversión A/D (en caso de que el
conversor A/D esté adecuadamente configurado), se inicializa a 0 el
Temporizador asociado y se pone a ‘1’ el flag CCP2IF.
Modo PWM:
En el modo PWM permite generar una señal PWM de ciclo de trabajo y frecuencia
programables. El funcionamiento en este modo es el siguiente:
Un registro de 10 bits (compuesto por CCPR2H y por un registro interno de 2
bits) se compara constantemente con un contador de 10 bits (compuesto por el
registro TMR2 del Temporizador 2 y un prescalar de 2 bits).
Cuando el valor del contador se hace igual al del registro se pone a ‘0’ el pin de
salida del CCP.
En paralelo el registro PR2 se compara constantemente con el registro TMR2
Temporizador 2. Cuando el valor de TMR2 alcanza PR2:
Se pone a ‘1’ el pin de salida del CCP
Se inicializa a 0 el valor del contador de 10 bits (registro TMR2 y el prescalar
de 2 bits)
43
El valor del registro de 10 bits (registro CCPR2H y registro interno de 2 bits) se
recargan con el valor del registro CPPR2L y los bits CCP2CON [5...4].
Modo PWM:
Para generar la señal PWM se deben seguir los siguientes pasos:
Configurar el pin del CCP (RC1 o RB3) como salida
Configurar el Temporizador 2 para que trabaje como temporizador. Puede
utilizarse el prescalar del Temporizador 2, pero no puede utilizarse el post-
escalar.
Configurar el módulo CCP en modo PWM.
Establecer el periodo de la señal PWM mediante el valor del registro PR2.
El periodo de la señal PWM será:
Elementos asociados:
Temporizador asociado: Temporizador 1 o Temporizador 3 en función de los
bits T3CCP2...T3CCP0 (registro T3CON)
Registros de comparación: CCP1RH y CCPR1L
Línea de E/S: RC2/CCP1/P1A, RD5/SPP5/P1B, RD6/SPP6/P1C y RD7/SPP7/P1D
44
Interrupción asociada a los modos de Captura y Comparación (flag de
interrupción CCP1IF)
45
Programa de la Práctica VIII:
TITLE ‘ MODULACIÓN POR ANCHO DE PULSO (PWM)’
LIST P=18F4550
#INCLUDE <P18F4550.INC>
CONFIG PLLDIV = 1 ; No prescale (4 MHz oscillator input drives PLL directly)
CONFIG CPUDIV = OSC1_PLL2 ; [OSC1/OSC2 Src: /1][96 MHz PLL Src: /2]
CONFIG USBDIV = 1 ; USB clock source comes directly from the primary oscillator block
CONFIG FOSC = XT_XT ; XT oscillator, XT used by USB
CONFIG FCMEN = OFF ; Fail-Safe Clock Monitor disabled
CONFIG IESO = OFF ; Oscillator Switchover mode disabled
CONFIG PWRT = OFF ; PWRT disabled
CONFIG BOR = OFF ; Brown-out Reset disabled in hardware and software
CONFIG VREGEN = OFF ; USB voltage regulator disabled
CONFIG WDT = OFF ; HW Disabled - SW Controlled
CONFIG MCLRE = ON ; MCLR pin enabled; RE3 input pin disabled
CONFIG LPT1OSC = OFF ; Timer1 configured for higher power operation
CONFIG PBADEN = OFF ; PORTB<4:0> pins are configured as digital I/O on Reset
CONFIG CCP2MX = ON ; CCP2 input/output is multiplexed with RC1
CONFIG STVREN = ON ; Stack full/underflow will cause Reset
CONFIG LVP = OFF ; Single-Supply ICSP disabled
CONFIG ICPRT = OFF ; ICPORT disabled
CONFIG XINST = OFF ; Instruction set extension and Indexed Addressing mode disabled
CONFIG DEBUG = OFF ; Background debugger disabled, RB6 and RB7 configu
46
ORG 0
GOTO INICIO ;vector reset
ORG 0X08 ;vector de interrupciones
INICIO
MOVLW 0X2F ; PERIODO DE LA ONDA
MOVWF PR2
BCF TRISC, 2 ; LINEA RC2/CCP1 (BIT 2 DE PORTC) COMO SALIDA
MOVLW B'00001111' ; CONFIGURACION DEL MODULO CCP1 EN MODO PWM
MOVWF CCP1CON
MOVLW B'00000100' ; SELECCION DEL PREDIVISOR Y ACTIVACION DEL TMR2
MOVWF T2CON
BCF CCP1CON,4
BCF CCP1CON,5
CICLO
MOVLW 0X0F ; ANCHURA DEL PULSO
MOVWF CCPR1L
GOTO CICLO
END
Convertidor analógico-digital:
Características fundamentales:
10 bits de resolución
13 canales multiplexados
Señal de reloj de conversión configurable
Tiempo de adquisición programable (0 a 20TAD)
47
Posibilidad de establecer el rango de tensiones de conversión mediante
tensiones de referencia externas.
48
Una vez configurado como línea de entrada analógica, un canal puede ser
seleccionado mediante los bits CHS3..CHS0 del registro ADCON0
49
Rango tensiones de conversión:
Por defecto el rango de tensiones de conversión del convertidor A/D del
PIC18F4550 es de 0V a 5V. Sin embargo, en ocasiones puede resultar interesante
modificar este rango para aumentar la resolución de la conversión acercando las
tensiones de referencia máxima y mínima VREF+ y VREF- a los límites de
variación de la señal que se desea digitalizar.
50
Señal de reloj de conversión:
Se define TAD como el tiempo de conversión de 1 bit. Una operación completa de
conversión requiere un total de 11 TAD para 10 bits. La señal de reloj que genera
las temporizaciones TAD puede ser establecida mediante los bits ADCS2..ADCS0
del registro ADCON2. Existen dos fuentes para dicha señal de reloj:
El oscilador principal
Una red RC interna que incorpora el propio convertidor A/D.
Esta red puede utilizarse cuando se deseen realizar conversiones en modos de bajo
consumo. Esta red RC permite que se puedan llevar a cabo conversiones con el
oscilador principal desactivado.
El valor de TAD debe ser lo menor posible pero siempre superior al TAD mínimo
indicado en las hojas de datos de PIC18F4550: 0,7µs.
Ejemplo:
Se elige el oscilador principal como fuente de reloj y FOSC=10MHz:
Si configuramos ADCS2...ADCS0=000 => TAD=2*(1/10·106)=0,2us=> demasiado
pequeño.
Si configuramos ADCS2…ADCS0=100 => TAD=4*(1/10·106)=0,4us=> demasiado
pequeño
Si configuramos ADCS2...ADCS0=001 => TAD=8*(1/10·106)=0,7us=> OK
Cuando se elige el oscilador RC interno el TAD viene prefijado internamente y
siempre cumple con la condición del valor mínimo.
Existen dos opciones para generar este retardo antes de comenzar la conversión:
Por programa: se implementa un retardo software entre la selección del nuevo
canal y el inicio de la conversión.
Estableciendo un tiempo de adquisición automático: se programa un tiempo de
adquisición que se establecerá de forma automática entre la orden de inicio de
conversión y el muestreo de la señal para iniciar la conversión. Dicho tiempo
puede ser programado mediante los bits ACQT2..ACQT0 del registro
ADCON2.
Este tiempo puede tener unos valores que oscilan entre 2*TAD y 20*TAD.
52
Proceso completo de conversión A/D (sin utilizar interrupción):
53
Configuración del reloj de conversión TAD (bits ADCS2..ADCS0 del registro
ADCON2)
Configuración del tiempo de adquisición (bits ACQT2..ACQT0 del registro
ADCON2)
Configuración del modo de almacenamiento de la conversión (bit ADFM del
registro ADCON2)
Activación del conversor (bit ADON del registro ADCON0)
2º PASO: Habilitación de la interrupción del convertidor A/D:
Habilitación de la interrupción del convertidor A/D (bit ADIE del registroPIE1)
Habilitación de las interrupciones de periféricos y de las interrupciones a nivel
general (bits PEIE y GIE del registro INTCON)
3º PASO: Selección del canal (bits CHS3..CHS0 del registro ADCON0)
4º PASO: Retardo de espera del tiempo de adquisición (solo en caso de no hacer
uso del tiempo de adquisición automático)
4º PASO: Inicio de la conversión poniendo a ‘1’ el bit GO/DONE del registro
ADCON0
5º PASO: El µC sigue ejecutando código hasta que se produzca la interrupción
6º PASO: Cuando se produce la interrupción: puesta a ‘0’ del bit ADIF del registro
PIR1 y lectura del resultado de la conversión de los registros ADRESH y ADRESL
54
Programa de la Práctica IX:
TITLE 'CONVERSION ANALÓGICA_DOGITAL'
LIST P=18F4550
#INCLUDE <P18F4550.INC>
CONFIG PLLDIV = 1 ; No prescale (4 MHz oscillator input drives PLL directly)
CONFIG CPUDIV = OSC1_PLL2 ; [OSC1/OSC2 Src: /1][96 MHz PLL Src: /2]
CONFIG USBDIV = 1 ; USB clock source comes directly from the primary oscillator block with no postscale
CONFIG FOSC = XT_XT ; XT oscillator, XT used by USB
CONFIG FCMEN = OFF ; Fail-Safe Clock Monitor disabled
CONFIG IESO = OFF ; Oscillator Switchover mode disabled
CONFIG PWRT = OFF ; PWRT disabled
CONFIG BOR = OFF ; Brown-out Reset disabled in hardware and software
CONFIG VREGEN = OFF ; USB voltage regulator disabled
CONFIG WDT = OFF ; HW Disabled - SW Controlled
CONFIG MCLRE = ON ; MCLR pin enabled; RE3 input pin disabled
CONFIG LPT1OSC = OFF ; Timer1 configured for higher power operation
CONFIG PBADEN = OFF ; PORTB<4:0> pins are configured as digital I/O on Reset
CONFIG CCP2MX = ON ; CCP2 input/output is multiplexed with RC1
CONFIG STVREN = ON ; Stack full/underflow will cause Reset
CONFIG LVP = OFF ; Single-Supply ICSP disabled
CONFIG ICPRT = OFF ; ICPORT disabled
CONFIG XINST = OFF ; Instruction set extension and Indexed Addressing mode disabled (Legacy mode)
CONFIG DEBUG = OFF;;Background debugger disabled, RB6 and RB7 configured as general purpose I/O pins
ORG 0
GOTO INICIO ;vector reset
ORG 0X08 ;vector de interrupciones
CBLOCK 0X20 ;declaracion de inicio de variables en banco1 ;
DATOH ;Dato a desplegar parte alta.
DATOL ;Dato a desplegar parte baja.
DATOBIN
UNIDADES
DECENAS
CENTENAS
ENDC
INICIO
MOVLW 0X0F ;mover 0F a W
MOVWF TRISA ;para configurar RA0:RA3 del PTO.A como entradas
MOVLW 0X00 ;mover 00 a W
MOVWF TRISB ;mov.W a reg.TRISB(sé conf.el pto.B )
MOVLW 0X00 ;Justificación derecha,selecciona RA5 a RA0
MOVWF ADCON1 ;como entradas analógicas
MOVLW B'10010100'
MOVWF ADCON2
MOVLW B'11000001'
MOVWF ADCON0 ;canal 0 y activación de convertidor.
55
CIENES
MOVLW 0X64
SUBWF DATOBIN,F
BTFSS STATUS, C
GOTO SALTO1
INCF CENTENAS, F
GOTO CIENES
SALTO1
ADDWF DATOBIN, F
DIECES
MOVLW 0X0A
SUBWF DATOBIN,F
BTFSS STATUS, C
GOTO SALTO2
INCF DECENAS, F
GOTO DIECES
SALTO2
ADDWF DATOBIN, W
MOVWF UNIDADES
RETURN
END ;fin de programa
56
PRÁCTICA X. TRANSMISIÓN SERIAL ASÍNCRONA.
Conocimientos Previos.
Canal de comunicación serie eusart:
Características fundamentales:
Modos de trabajo:
Modo asíncrono de 8 bits
Modo asíncrono de 9 bits
Modo síncrono Maestro
Modo síncrono Esclavo
Auto-activación por detección de dato recibido
Detección automática de velocidad de comunicación (baudrate)
Transmisión y detección de carácter de BREAK (bus LIN)
En este tema solo se tratará el modo asíncrono básico (8 y 9 bits).
57
58
Configuración de las líneas TX y RX para el modo asíncrono:
Las líneas RC6/TX y RC7/RX deben configurarse adecuadamente para que puedan
funcionar como las líneas de transmisión y recepción respectivamente:
Poner a ‘1’ el bit SPEN (RCSTA)
Poner a ‘1’ el bit 7 del registro TRISC (línea RC7/RX configurada como entrada)
Poner a ‘0’ el bit 6 del registro TRISC (línea RC6/TX configurada como salida)
59
En la siguiente tabla se establece
como calcular la velocidad de
comunicación para el modo
asíncrono en función de los
valores de los bits BRGH y BRG16 y
de los registros SPBRGH y
SPBRG:
60
Recepción en el modo asíncrono de la USART:
El bloque de recepción de la USART incorpora un registro de desplazamiento serie
(RSR). Los datos entran en serie por el pin RC7/RX y son muestreados por le
bloque de lectura de bits (que trabaja a una frecuencia de 16 veces el baudrate). Si
el bit de habilitación de recepción CREN está a ‘1’, el bloque de lectura de bits
identifica los bits recibidos (Start Bit, Bits de datos, 9º bit y Stop bit) y los va
pasando en serie al RSR. Una vez se han recibido todos los bits correspondientes a
un byte el valor recibido se pasa en paralelo de RSR al registro RCREG. De esta
forma el registro RSR queda listo para recibir un nuevo dato.
Si durante el proceso de recepción se produce algún error de formato (el valor del
Stop bit el ‘0’ en lugar de ‘1’) o de sobrescritura (se recibe un nuevo byte antes de
que el registro RSR se haya volcado en el RCREG) se pondrá a ‘1’ el bit
correspondiente (FERR/OERR).
Cada vez que se recibe un dato el flag RCIF se pone a ‘1’. Si el bit de habilitación de
la interrupción de recepción del EUSART está a ‘1’ se generará una interrupción.
El bit RCIF es de solo lectura, se pone a ‘1’ cuando llega un nuevo dato a RCREG y
se pone a ‘0’ automáticamente cuando se lee dicho registro. Si el modo de 9 bits ha
sido activado (bit RX9 a ‘1’) el valor del 9º bit recibido quedará almacenado en el
bit RX9D.
61
La lógica que el registro del TSR se encarga de enviar además de los 8 bits de datos
el Start bit y el Stop bit. Si el bit TX9 está a ‘1’ también se enviará como 9º bit el
valor contenido en TX9D.
La cadencia de esta transmisión viene determinada por la señal de reloj producida
por el generador de velocidad de comunicación. Para que dicha señal de reloj
llegue a TSR el bit TXEN debe estar ‘1’ (habilitación de la transmisión).
El bit TRMT se pone a ‘1’ cuando el registro TRMT está vacío (este bit es de solo
lectura).
El bit TRMT no está asociado a ningún mecanismo de interrupción, sirve
únicamente para saber cuando un dato ha sido completamente transmitido.
El flag TXIF se pone a ‘1’ cuando el registro TXREG está vacío. El bit TXIF es de
solo lectura, se pone automáticamente a ‘0’ cuando se vuelve a escribir un valor en
TXREG y se mantiene a ‘0’ hasta que dicho valor pase de TXREG a TSR).
Si el bit TXIF está a ‘1’ y el bit de habilitación de la interrupción de transmisión del
EUSART está a ‘1’ se generará una interrupción.
Por lo tanto, únicamente se debe habilitar la interrupción de transmisión del
EUSART después de escribir en TXREG el primer dato que queremos transmitir y
debemos deshabilitarla cuando se haya enviado el último dato.
De lo contrario se estarían generando continuamente interrupciones de
transmisión del EUSART.
63
Mediante la interrupción: si se habilita la interrupción de transmisión del canal
EUSART se producirá un interrupción cada vez que el registro TXREG esté vacío.
La interrupción de transmisión del canal serie nos permite por tanto detectar
cuando TXREG queda libre para poder enviar un nuevo dato. Sin embargo si
habilitamos dicha interrupción cuando no estamos transmitiendo datos se
generarán interrupciones de forma continuada mientras TXREG esté vacío (lo que
bloquearía el funcionamiento del µC).
Por tanto solo se debe habilitar esta interrupción después de haber enviado el
primer dato y debe deshabilitarse cuando se haya transmitido el último dato.
Desarrollo de la Práctica X:
64
Velocidad a 9600 BPS.
Formato de transmisión de ocho bits de información, un bit de parada y un bit
de arranque.
Sin paridad.
Para la conversión de nivel de voltaje TTL, a nivel requerido por la interfaz tipo
serie RS232, se utiliza el convertidor CI MAX232 como se indica en el siguiente
diagrama.
C= 10µF
R= 47kΩ
Programa de la Práctica X:
TITLE ‘TRANSMISIÓN SERIAL ASÍNCRONA’
LIST P=18F4550
#INCLUDE <P18F4550.INC>
CONFIG PLLDIV = 1 ; No prescale (4 MHz oscillator input drives PLL directly)
65
CONFIG CPUDIV = OSC1_PLL2 ; [OSC1/OSC2 Src: /1][96 MHz PLL Src: /2]
CONFIG USBDIV = 1; USB clock source comes directly from the primary oscillator block
CONFIG FOSC = XT_XT ; XT oscillator, XT used by USB
CONFIG FCMEN = OFF ; Fail-Safe Clock Monitor disabled
CONFIG IESO = OFF ; Oscillator Switchover mode disabled
CONFIG PWRT = OFF ; PWRT disabled
CONFIG BOR = OFF ; Brown-out Reset disabled in hardware and software
CONFIG VREGEN = OFF ; USB voltage regulator disabled
CONFIG WDT = OFF ; HW Disabled - SW Controlled
CONFIG MCLRE = ON ; MCLR pin enabled; RE3 input pin disabled
CONFIG LPT1OSC = OFF ; Timer1 configured for higher power operation
CONFIG PBADEN = OFF ; PORTB<4:0> pins are configured as digital I/O on Reset
CONFIG CCP2MX = ON ; CCP2 input/output is multiplexed with RC1
CONFIG STVREN = ON ; Stack full/underflow will cause Reset
CONFIG LVP = OFF ; Single-Supply ICSP disabled
CONFIG ICPRT = OFF ; ICPORT disabled
CONFIG XINST = OFF ; Instruction set extension and Indexed Addressing mode disabled
CONFIG DEBUG = OFF ; Background debugger disabled,
ORG 0X00
GOTO INICIO ;vector reset
CBLOCK 0X00 ;vector de interrupciones
DATO
ENDC
INICIO
MOVLW B'10000000'
MOVWF RCSTA ;habilita puerto serial
MOVLW B'10000000'
MOVWF TRISC ;Se configura PTO.C(RC7=1;RC6 a RC0=0)
MOVLW B'00011001';De fórmula para 9600 BPS(25 decimal @ 4 Mhz, 22, @ 3.59 Mhz)
MOVWF SPBRG ;carga generador de velocidad(baud rate)
MOVLW B'00100100';selecciona formato a 8 bits,habilita transmisor
MOVWF TXSTA ;selecciona modo asíncrono en alta velocidad.
L2
MOVLW 0X68 ;dato a transmitir(carácter 0)
MOVWF TXREG
GOTO L2 ;transmite continuamente el carácter.
END ;fin de program
66
Objetivo: Adquisición de una señal analógica para su conversión y transmisión
por el puerto de comunicación serie (USART) del microcontrolador PIC18F4550 a
una computadora en modo Hiperterminal.
67
Programa de la Práctica XI:
LIST P=18F4550
#INCLUDE <P18F4550.INC>
CONFIG PLLDIV = 1 ; No prescale (4 MHz oscillator input drives PLL directly)
CONFIG CPUDIV = OSC1_PLL2 ; [OSC1/OSC2 Src: /1][96 MHz PLL Src: /2]
CONFIG USBDIV = 1; USB clock source comes directly from the primary oscillator block with no postscale
CONFIG FOSC = XT_XT ; XT oscillator, XT used by USB
CONFIG FCMEN = OFF ; Fail-Safe Clock Monitor disabled
CONFIG IESO = OFF ; Oscillator Switchover mode disabled
CONFIG PWRT = OFF ; PWRT disabled
CONFIG BOR = OFF ; Brown-out Reset disabled in hardware and software
CONFIG VREGEN = OFF ; USB voltage regulator disabled
CONFIG WDT = OFF ; HW Disabled - SW Controlled
CONFIG MCLRE = ON ; MCLR pin enabled; RE3 input pin disabled
CONFIG LPT1OSC = OFF ; Timer1 configured for higher power operation
CONFIG PBADEN = OFF ; PORTB<4:0> pins are configured as digital I/O on Reset
CONFIG CCP2MX = ON ; CCP2 input/output is multiplexed with RC1
CONFIG STVREN = ON ; Stack full/underflow will cause Reset
CONFIG LVP = OFF ; Single-Supply ICSP disabled
CONFIG ICPRT = OFF ; ICPORT disabled
CONFIG XINST = OFF ; Instruction set ext ension and Indexed Addressing mode disabled (Legacy mode)
CONFIG DEBUG = OFF ; Background debugger disabled, RB6 and RB7 configu
ORG 0
GOTO INICIO ;vector reset
ORG 0X04 ;vector de interrupciones
CBLOCK 0X20 ;declaracion de inicio de variables en banco1
;DATOH ;Dato a TX parte alta.
DATOL ;Dato a TX parte baja.
ENDC
INICIO
MOVLW 0X0F ;mover 0F a W
MOVWF TRISA ;para configurar RA0:RA3 del PTO.A como entradas
MOVLW B'10000000' ;mover 80 a W
MOVWF TRISC ;sé conf.RC7 del pto.B como in y RC0:RC6 como out
MOVLW B'00000000' ;jutificación derech y selecciona RA3 a RA0
MOVWF ADCON1 ;como entradas analógicas
MOVLW B'10100100'
MOVWF ADCON2
MOVLW B'00011001'; carga generador de velocidad(baud rate).De
MOVWF SPBRG ;formula para 9600 BPS(25 dec@4Mhz,22@3.59 Mhz)
MOVLW B'00100100';selecciona formato a 8 bits,habilita transmisor
MOVWF TXSTA ;selecciona modo asíncrono en alta velocidad
BSF RCSTA, SPEN ;habilita puerto serie.
MOVLW B'00000001';selecciona fuente de reloj interno(RC)
MOVWF ADCON0 ;canal 0,activación de convertidor.
CONVER BSF ADCON0,1 ;inicio de conversión A/D
LAZO BTFSC ADCON0,1 ;terminó la conv.A/D?
GOTO LAZO ;vete a LAZO
NOP
MOVF ADRESL, W ;mover ADRESL(dato convertido parte baja) a W
MOVWF TXREG; MOVWF DATOL ;guarda parte baja en DATOL.
GOTO CONVER ;salta a CONVER.
END ;fin de programa
68