INSTITUTO TECNOLÓGICO DE MÉRIDA
DEPARTAMENTO DE
INGENIERÍA ELÉCTRICA Y
ELECTRÓNICA
INGENIERÍA ELECTRÓNICA
MATERIA:
Microcontoladores
GRUPO:
6EM
INVESTIGACIÓN:
PRACTICAS 1,2 Y 3
ALUMNO:
CARLOS ALBERTO GALICIA DUARTE
JULIO CESAR HERNANDEZ BANTE
FRANCISCO MORENO
BRIAN ALONZO LEON
DIEGO CARDENAS PEREZ
PROFESOR(A):
DOC. CARLOS ALBERTO LUJAN RAMIREZ
Encender y Apagar un LED mediante un botón, PIC18F4550 ASM
Objetivo
Identificar y conocer las características de los microcontroladores de la familia PIC18, en
particular el PIC18F4550.
Ubicar los pines del PIC18F4550 e identificar sus funciones (Puertos, Oscilador, AD,
PWM, Tx, Rx…).
Identificar los pines Vdd, Vss, ~MCLR, PGD y PGC para programar el microcontrolador.
Conocer y manejar el software MPLAB para el desarrollo de proyectos, simular y
programar un microcontrolador.
Realizar un programa en ASM para encender y apagar un LED, conectado a RB0,
mediante un botón pulsador conectado a RB4.
Realizar la simulación del circuito en ISIS Proteus, cargando el *.hex al PIC18F4550.
Programar el microcontrolador mediante Pickit2
Marco Teórico
En el siguiente gráfico (Figura 1) se muestran los puertos disponibles en el PIC18F4550, sus
ubicaciones y las posibles funciones de cada pin.
Figura1. Diagrama de los Pines del PIC18F4550
A continuación se muestra el diagrama de Bloques de dicho microcontrolador (Figura 2)
figura 2. Diagrama de Bloques del PIC18F4550
Y por último una tabla con funciones para su programación (Figura 3)
Figura 3. Conjunto de instrucciones del PIC18F4550
Hemos mencionado que un microcontrolador puede ser considerado como una
computadora, pues posee una ALU (Unidad de Aritmética y Lógica), registros, buses
y unidad de control, es decir tiene una CPU (Unidad Central de Procesamiento).
La mayoría de los dispositivos de lógica secuencial, entre ellos los CPU, son de naturaleza
síncrona. Es decir, están diseñados y operan en función de una señal de sincronización.
Esta señal, conocida como señal de reloj, usualmente toma la forma de una onda cuadrada
periódica. Calculando el tiempo máximo en que las señales eléctricas pueden moverse en
las varias bifurcaciones de los muchos circuitos de un CPU, los diseñadores pueden
seleccionar un período apropiado para la señal de reloj.
Para el correcto funcionamiento del microcontrolador debemos definir la frecuencia del
oscilador pues determinará los ciclos de instrucción; podemos utilizar un oscilador interno o
externo, sin embargo es recomendable utilizar un oscilador de cristal externo para evitar un
mal funcionamiento frente a las variaciones de temparatura dentro del microcontrolador.
Podemos ver que por default tiene cargado el valor: 0100 X000 que de acuerdo con los
valores de la tabla anterior corresponderían a la siguiente configuración:
0 | El dispositivo entra en reposo/bajo consumo cuando se ejecuta la instrucción Sleep.
100 | Frecuencia del oscilador interno: 1MHz
X | Depende del estado del bit IESO
0 | INTOSC La frecuencia del Oscilador Interno no es estable
00 | Oscilador primario, externo
Aunque el microcontrolador está configurado por defecto con 1MHz es necesario
especificarlo en la palabra de configuración.
Para estas prácticas se utilizará una frecuencia de 4MHz y, como no es necesario precisión
en el tiempo, no pondremos ningún oscilador externo, de esta manera el valor a cargar será
el siguiente:
0 110 0 0 00 => 0110 0000 => 0x60
Cálculos
Dado que se configuró el oscilador interno del microcontrolador a 4MHz, se tiene:
Ciclo de reloj:
Ciclo de instrucción:
Para limitar la corriente que circula por el LED se propone una resistencia de 330Ω:
Y para limitar la corriente del pin de Reset y el botón pulsador a 0.5mA, utilizar una
resistencia de 10kΩ.
Simulación
Creamos un proyecto nuevo y lo llamamos LedOn, como buena práctica de programación y
para una mejor organización conviene que el archivo fuente del código lleve el mismo
nombre del proyecto, es decir LedOn.asm este archivo con extensión *.asm es de
ensamblador.
; ********************************************************
1
; Desarrollo de Microcontroladores y DSPS
2
; Encender un LED
3
; Práctica 1
4
; Fecha: 03/06/2012
5 ; Notas: Encender un LED en RB4 al presionar un botón en RB0;
6 ; Autor: ek
7 ; ********************************************************
LIST P = 18F4550
8
INCLUDE <P18F4550.INC>
9
;************************************************************
10
CONFIG FOSC = HS ;INTOSC_XT no disponible para simulación, usar HS
11
CONFIG PWRT = ON
12
CONFIG BOR = OFF
13 CONFIG WDT = OFF
CONFIG MCLRE = ON
14
CONFIG PBADEN = OFF
15
CONFIG LVP = OFF
16
CONFIG DEBUG = OFF
17
CONFIG XINST = OFF
18
; CODE ******************************************************
19 #define Led PORTB, 4
20 ORG 0x00 ;Iniciar el programa en el registro 0x00
21 clrf PORTB ;Limpia los posibles valores actuales de PORTB
movlw 0x0F ;Entradas y Salidas para PORTB
22
movwf TRISB ;Configura TRISB <- W
23
INICIO
24
btfss PORTB, 0 ;Salta si RB0 = 1 presionado
25
goto LedOff ;RB0 = 0, continua apagado
26
bsf Led ;Encender Led
27 bra INICIO
28 LedOff
29 bcf Led ;Apagar Led
bra INICIO
30
END ;Fin de Programa
31
Una vez terminado contruimos el código y si todo sale bien, nos deberá aparecer en la
ventana output algo similar a esto:
Ahora abrimos Pickit 2 y grabamos el archivo LedOn.hex generado.
Montamos el pic conforme el siguiente diagrama (Figura 5) y probamos.
2. Efecto de corrimiento con LED’s, PIC18F4550 ASM
Introducción
La disposición de los puertos digitales nos permite hacer operaciones con un byte, nibble o
bit, por ejemplo intercambiar el nibble alto por el bajo o desplazar el valor de un bit hacia la
izquierda o derecha, algunas de estas operaciones están disponibles en las funciones de
algunos PICs como el caso del 18F4550, gracias a estas funciones es posible crear efectos
de luces con LEDs al colocar ciertas configuraciones de 0 y 1 a la salida de dichos puertos.
Objetivos
Identificar las características del PIC18F4550.
Utilizar el software MPLAB para crear un proyecto y simular el código.
Realizar un programa en lenguaje ensamblador para controlar el encendido de 8 LED’s
conectados a PORT B.
Mediante un pulsador en PD0 cambiar el sentido de encendido de derecha a izquierda o
viceversa al momento de presionar el botón.
El tiempo de transición entre los LED’s será de 300ms.
Realizar simulación en MPLAB.
Realizar simulación en ISIS Proteus.
Programar el microcontrolador utilizando Pickit 2
La mayoría de los dispositivos de lógica secuencial, entre ellos los CPU, son de naturaleza
síncrona. Es decir, están diseñados y operan en función de una señal de sincronización.
Esta señal, conocida como señal de reloj, usualmente toma la forma de una onda cuadrada
periódica. Calculando el tiempo máximo en que las señales eléctricas pueden moverse en
las varias bifurcaciones de los muchos circuitos de un CPU, los diseñadores pueden
seleccionar un período apropiado para la señal de reloj.
Para el correcto funcionamiento del microcontrolador debemos definir la frecuencia del
oscilador pues determinará los ciclos de instrucción; podemos utilizar un oscilador interno o
externo, sin embargo es recomendable utilizar un oscilador de cristal externo para evitar un
mal funcionamiento frente a las variaciones de temparatura dentro del microcontrolador.A
continuación mostramos la tabla del registro de configuración del oscilador (Figura 4)
Figura 4. Registro OSCCON para la Configuración del Oscilador
Podemos ver que por default tiene cargado el valor: 0100 X000 que de acuerdo con los
valores de la tabla anterior corresponderían a la siguiente configuración:
0 | El dispositivo entra en reposo/bajo consumo cuando se ejecuta la instrucción Sleep.
100 | Frecuencia del oscilador interno: 1MHz
X | Depende del estado del bit IESO
0 | INTOSC La frecuencia del Oscilador Interno no es estable
00 | Oscilador primario, externo
Aunque el microcontrolador está configurado por defecto con 1MHz es necesario
especificarlo en la palabra de configuración.
Para estas prácticas se utilizará una frecuencia de 4MHz y, como no es necesario precisión
en el tiempo, no pondremos ningún oscilador externo, de esta manera el valor a cargar será
el siguiente:
0 110 0 0 00 => 0110 0000 => 0x60
Cálculos
Dado que se configuró el oscilador interno del microcontrolador a 4MHz, se tiene:
Ciclo de reloj:
Ciclo de instrucción:
Para limitar la corriente que circulará por los LED’s conectados al Puerto B, se proponen
resistencias de 330Ω:
Y para limitar la corriente del pin de Reset y el botón pulsador a 0.5mA, utilizar una
resistencia de 10kΩ.
Para generar el retardo se utilizarán tres registros de la memoria y se cargarán con los
siguientes valores, estos valores son calculados de acuerdo a un algoritmo que utiliza ciclos.
Conta1 = 200
Conta2 = 100
Conta3 = 5
El contador 1 (Conta1) se encuentra dentro del ciclo de conteo del contador 2 (Conta2) y
ambos están dentro del ciclo del contador 3 (Conta3). Tomando en cuenta que se necesitan
3 ciclos de instrucción para ir decrementando los ciclos, la fórmula queda como sigue:
Simulación
Desarrollar una simulación en MPLAB con la finalidad de medir los tiempos de ejecución
para los retardos y observar la ejecución de cada instrucción.
1 ; ********************************************************
2 ; Desarrollo de Microcontroladores y DSPS
3 ; Barrido de LEDs bidireccional
4 ; Práctica 2
5 ;
6 ; Fecha: 08/06/2012
7 ; Notas: Hacer el barrido de un LED
8 ; Autor: ek
9 ; ************************************************************
10 LIST P = 18F4550
11 INCLUDE <P18F4550.INC>
12 ;************************************************************
13 CONFIG FOSC = HS
14 CONFIG PWRT = ON
15 CONFIG BOR = OFF
16 CONFIG WDT = OFF
17 CONFIG MCLRE = ON
18 CONFIG PBADEN = OFF
19 CONFIG LVP = OFF
20 CONFIG DEBUG = OFF
21 CONFIG XINST = OFF
22 ; CODE ******************************************************
23 #define Conta 0x12
24 cblock
25 Conta1
26 Conta2
27 Conta3
28 Sweep
29 endc
30 #define Time1 0x00 ;Configuración para 300ms 0x00
31 #define Time2 0x85 ;Configuración para 300ms 0x85
32 #define Time3 0x02 ;Configuración para 300ms 0x02
33 ORG 0x00 ;Iniciar el programa en el registro 0x00
34 clrf PORTB ;Limpia los posibles valores actuales de PORTB
35 clrf PORTD ;Limpia los posibles valores actuales de PORTD
36 clrf TRISB ;Configura TRISB movlw 0x01 ;Entrada RD0 de habilitación en PORTD
37 movwf TRISD ;Configura TRISD =>=>
38 call Retardo ;Esperar un tiempo
39 rrncf Sweep, F ;Rotar hacia la Derecha y Guardar en Sweep
40 movff Sweep, PORTB ;Mover el valor de Sweep a PORTB
41 btfss PORTD, 0 ;Salta si RD0 = 1, Cambio <== bra MoveRight ;Repetir Ciclo >=>=>
42
43 MoveLeft
44 call Retardo ;Esperar un tiempo
45 rlncf Sweep, F ;Rotar hacia la izquierda y Guardar en Sweep
46 movff Sweep, PORTB ;Mover el valor de Sweep a PORTB
47 btfss PORTD, 0 ;Salta si RD0 = 1, Cambio ==> PRESIONAR Y SOLTAR
48 ;btfsc PORTD, 0 ;Salta si RD0 = 0, Cambio ==> SÓLO AL PRESIONAR
49 bra MoveLeft ;Repetir Ciclo <=<=< bra MoveRight ;Dirección [Predeterminada] >=>=>
50 bra INICIO
51 ;****** Funciones *************************
52 Retardo
53 movlw Time1
54 movwf Conta1
55 movlw Time2
56 movwf Conta2
57 movlw Time3
58 movwf Conta3
59 Repeat
60 decfsz Conta1, F ;Salta cuando Conta1 llega a 0
61 bra Repeat ;Salta a Repeat para Decrementar Conta1
62 movlw Time1 ;Mover el valor de Conta1 -> W
63 movwf Conta1 ;W -> Conta1, reconfigurar el valor
64 decfsz Conta2, F ;Salta cuando Conta2 llega a 0
65 bra Repeat ;Salta a Repeat
66 decfsz Conta3
67 bra Repeat
68 Return
69 END ;Fin de Programa
70
Armar el siguientes circuito en ISIS Proteus y simularlo, de la misma manera será el circuito
físico (Figura 5).
Figura 5. Circuito
3. Efecto de 8 bits con LED’s, PIC18F4550 ASM
Introducción
La disposición de los puertos digitales nos permite hacer operaciones con un byte, nibble o
bit, por ejemplo intercambiar el nibble alto por el bajo o desplazar el valor de un bit hacia la
izquierda o derecha, algunas de estas operaciones están disponibles en las funciones de
algunos PICs como el caso del 18F4550, gracias a estas funciones es posible crear efectos
de luces con LEDs al colocar ciertas configuraciones de 0 y 1 a la salida de dichos puertos.
Objetivos
Identificar las características del PIC18F4550.
Utilizar el software MPLAB para crear un proyecto y simular el código.
Realizar un programa en lenguaje ensamblador para controlar el encendido de 8 LED’s
conectados a PORT B.
Mantener activados 8 leds.
Realizar simulación en MPLAB.
Realizar simulación en ISIS Proteus.
Programar el microcontrolador utilizando Pickit 2
La mayoría de los dispositivos de lógica secuencial, entre ellos los CPU, son de naturaleza
síncrona. Es decir, están diseñados y operan en función de una señal de sincronización.
Esta señal, conocida como señal de reloj, usualmente toma la forma de una onda cuadrada
periódica. Calculando el tiempo máximo en que las señales eléctricas pueden moverse en
las varias bifurcaciones de los muchos circuitos de un CPU, los diseñadores pueden
seleccionar un período apropiado para la señal de reloj.
Para el correcto funcionamiento del microcontrolador debemos definir la frecuencia del
oscilador pues determinará los ciclos de instrucción; podemos utilizar un oscilador interno o
externo, sin embargo es recomendable utilizar un oscilador de cristal externo para evitar un
mal funcionamiento frente a las variaciones de temparatura dentro del microcontrolador.
Podemos ver que por default tiene cargado el valor: 0100 X000 que de acuerdo con los
valores de la tabla anterior corresponderían a la siguiente configuración:
0 | El dispositivo entra en reposo/bajo consumo cuando se ejecuta la instrucción Sleep.
100 | Frecuencia del oscilador interno: 1MHz
X | Depende del estado del bit IESO
0 | INTOSC La frecuencia del Oscilador Interno no es estable
00 | Oscilador primario, externo
Aunque el microcontrolador está configurado por defecto con 1MHz es necesario
especificarlo en la palabra de configuración.
Para estas prácticas se utilizará una frecuencia de 4MHz y, como no es necesario precisión
en el tiempo, no pondremos ningún oscilador externo, de esta manera el valor a cargar será
el siguiente:
0 110 0 0 00 => 0110 0000 => 0x60
Simulación.
Desarrollar una simulación en MPLAB con la finalidad de medir los tiempos de ejecución
para los retardos y observar la ejecución de cada instrucción.
.................... #include <18f450a.h>
.................... //////// Standard Header file for the PIC18F4550 device ////////////////
.................... #use delay(clock=4000000)
0004: MOVLW 22
0005: MOVWF 04
0006: BCF 03.7
0007: MOVF 00,W
0008: BTFSC 03.2
0009: GOTO 018
000A: MOVLW 01
000B: MOVWF 78
000C: CLRF 77
000D: DECFSZ 77,F
000E: GOTO 00D
000F: DECFSZ 78,F
0010: GOTO 00C
0011: MOVLW 4A
0012: MOVWF 77
0013: DECFSZ 77,F
0014: GOTO 013
0015: GOTO 016
0016: DECFSZ 00,F
0017: GOTO 00A
0018: BCF 0A.3
0019: BCF 0A.4
001A: GOTO 037 (RETURN)
001B: CLRF 04
001C: BCF 03.7
001D: MOVLW 1F
001E: ANDWF 03,F
001F: MOVLW 01
0020: MOVWF 20
0021: BSF 03.5
0022: BSF 1F.0
0023: BSF 1F.1
0024: BSF 1F.2
0025: BCF 1F.3
0026: MOVLW 07
0027: MOVWF 1C
....................
.................... //Configuracion de puertos E/S
.................... SET_TRIS_B(0x00);//Configura el puerto B: 0=Salida; 1=Entrada
0028: MOVLW 00
0029: MOVWF 06
.................... output_b(0x00); //Limpia el registro del puerto
002A: CLRF 06
002B: BCF 03.5
002C: CLRF 06
.................... //Estructura Programa principal
While(true)//Ciclo infinito
. output_b(A);//Sale por el puerto B el valor de A
002D: BSF 03.5
002E: CLRF 06
002F: BCF 03.5
0030: MOVF 20,W
0031: MOVWF 06
.................... retardo;//Demora
0032: MOVLW 02
0033: MOVWF 21
0034: MOVLW FA
0035: MOVWF 22
0036: GOTO 004
0037: DECFSZ 21,F
0038: GOTO 034
.................... a=a*2;//Incrementa A para encender cada led del puerto
0039: BCF 03.0
003A: RLF 20,F
.................... if(a==256)A=1;//Reinicia el encendido de los leds
003B: MOVF 20,W
003C: SUBLW 00
003D: BTFSS 03.2
003E: GOTO 041
003F: MOVLW 01
0040: MOVWF 20
.................... }
0041: GOTO 02D
.................... }
0042: SLEEP
End ;