Anda di halaman 1dari 111

PIC18F4550 ASM

Practices
Temas:
1. Uso de MPLAB IDE
2. Uso de Mikro C
3. Uso de ISIS Proteus
Prcticas:
Ensamblador MPLAB

1. Encender y Apagar un LED mediante un botn, PIC18F4550 ASM


2. Efecto de corrimiento con LEDs, PIC18F4550 ASM
3. Control de un Motor a Pasos Bipolar, PIC18F4550 ASM
4. Control de un LCD, PIC18F4550 ASM
C MikroC

1. Termmetro Digital, PIC18F4550 C


2. Tacmetro, PIC18F4550 C
3. Chat, PIC18F4550 C

Simulacin en MPLAB IDE


Posted on June 30, 2012by need4bits
La simulacin del cdigo de programa nos ayuda a ver el desarrollo de las
instrucciones as como los tiempos de ejecucin en determinados bloques o lneas y
para ello disponemos de la herramienta MPLAB SIM.

Describiremos la forma de utilizar MPLAB IDE para aquellos que comienzan a


utilizar microcontroladores de Microchip y necesitan hacer un seguimiento de la
ejecucin del programa.

Microchip te proporciona este software para programar sus dispositivos y tambin


para grabarlos, de manera que accediendo al rea de descargas de su pgina
podremos obtener dicho software. http://www.microchip.com/
Despus de instalar MPLAB IDE lo iniciamos y nos muestra una ventaja como la
siguiente (Figura 1)
Figura 1. Ventana principal MPLAB IDE

A estas alturas se deben conocer las partes de una ventana, de manera que
crearemos un nuevo proyecto desde el men Project Project Wizard, cabe
mencionar que no es la nica forma de crear un nuevo proyecto, tambin tenemos
la opcin Project New, pero el primer comando nos ofrece un asistente con los
siguientes pasos:
1. Selecciona un Dispositivo (Figura 2)

Figura 2. Seleccionar Dispositivo

2. Selecciona una herramienta de lenguaje (Figura 3)


Figura 3. Seleccionar Compilador

3. Crear y guardar el archivo de proyecto (Figura 4)

Figura 4. Directorio para Crear y Guardar el Proyecto

4. Agregar archivos existentes al proyecto (Figura 5)


Figura 5. Agregar archivos y bibliotecas disponibles

5. Resumen de configuracin (Figura 6)

Figura 6. Informacin de configuracin y Finalizar

Ahora creamos un nuevo archivo presionando Ctrl+N , File New (Figura 7) , o


en su defecto, presionando el icono de la hoja en blanco (Figura 8) que aparece
en la barra de herramientas.

Figura 7. Archivo Nuevo


Figura 8. Icono Nuevo archivo

Se genera un documento en blanco sin ttulo ni formato que debemos guardar con
la extensin *.asm para poder compilar; para ello accedemos al men y ejecutamos
el comando Guardar como: File Save As
En la ventana Save As asignar el nombre del archivo y prestar mucha atencin
en asignar la extensin .asm al final; por ltimo activar la casilla de
verificacin Add File toProject (Agregar archivo al proyecto) y dar clic en
guardar (Figura 9)

Figura 9. Guardar y agregar al proyecto

Una vez creado el archivo con extensin *.asm podemos introducir las lneas de
cdigo y estas se resaltaran de acuerdo a la sintaxis
(Directivas, Instrucciones, Direcciones, Variables, Comentarios), debemos
comenzar declarando la palabra de configuracin y posteriormente el programa.
Como buena prctica de programacin, podemos comenzar comentando el
programa con informacin bsica del mismo, para ello usamos punto y coma y lo
que est despus de ste smbolo sern comentarios, ejemplo:

;Esto es un comentario
;Informacin del Proyecto para su documentacin
;***********************************************
Posteriormente escribimos:
List P = 18F4550 ; Pic utilizado
Inclue <P18F4550.inc> ; Archivo con las directivas del
Pic
Los archivos *.inc se encuentran en la carpeta de instalacin de MPLAB y
contienen la mayora de familias de microcontroladores de esta empresa.

La palabra de configuracin contiene las instrucciones de cmo debe configurarse


el PIC, para esta prctica utilizamos la palabra CONFIG con las siguientes
opciones:

CONFIG FOSC = HS ; Tipo de Oscilador


CONFIG PWRT = ON ; Esperar a que el PIC se estabilice
CONFIG BOR = OFF ; Genera un reset cuando el voltaje
disminuye
CONFIG WDT = OFF ; Perro Guardian
CONFIG MCLRF = ON ; Master Clear habilitado
CONFIG PBADEN = OFF ; Puerto B Analgico
CONFIG LVP = OFF ; Voltaje Bajo de Programacin
CONFIG DEBUG = OFF ; Depuracin Incircuit
CONFIG XINST = OFF ; Conjunto de instrucciones extendidas
Una vez escrita la palabra de configuracin se escribe el programa.

Como buena prctica de programacin es importante la indentacin (tabular) al


escribir el cdigo, pues permite una mejor lectura y comprensin de cada bloque,
para ello dejaremos a las etiquetas/banderas sin indentar, las instrucciones,
direcciones, variables y comentarios llevarn indentacin entre ellos, ejemplo:

; Correcto ******************************************
Bandera
MOVLW 0x0F ; Mover 0x0F -> W
MOVWF PORTB ; Mover W -> PORTB

;Incorrecto ****************************************
Bandera
MOVLW 0x0F ;Mover 0x0F -> W
MOVWF PORTB ;Mover W->PORTB

Posteriormente se construye el cdigo introducido y se verifican posibles errores;


ejecutamos los siguientes comandos:

Configure Select Device


Aqu elegimos el PIC con el que deseamos realizar la simulacin, el ensamblador
puede construir el cdigo sin problemas, pero esta opcin crea un archivo que
permite una simulacin posterior en programas como Proteus.

Project Set Active Project


Verificamos que est activo nuestro proyecto y no est en None(Quickbuild Mode)
pues no tenemos ms archivos *.asm

Project Build All


Una vez que el archivo.asm est creado y nuestro proyecto est activo nos
aseguramos que est compilado correctamente para ello ejecutamos el comando
siguiente: Proyect Build All o en su defecto presionando Ctrl + F10 (Figura
10)
Figura 10. Men Proyecto Construir todo (compilar todo)

Posteriormente se selecciona la herramienta para depurar/simular el cdigo, en


este caso elegir MPLAB SIM; para ello hacer clic en: Debugger Select Tool
MPLAB SIM (Figura 10)

Figura 10. MPLAB SIM

Despus de seleccionar MPLAB SIM, se activa un cuadro de herramientas


llamado Debug.
En caso de no haber construido todo el proyecto tambin se puede hacer
con Project Make y si se ha configurado el compilador previamente aparecer
el siguiente cuadro de herramientas antes mencionado:

De izquierda a derecha tenemos:

1. Botn para ejecutar el programa


2. Botn para detener la ejecucin
3. Botn para animar el programa, es decir, ejecutarlo automticamente lnea por
lnea.
4. Ejecutar instruccin dentro (subrutinas)
5. Ejecutar instruccin sobre (subrutinas)
6. Ejecutar instruccin fuera (subrutinas)
7. Reset
8. Breakpoints para detener la ejecucin animada o resaltar una lnea de cdigo
A continuacin se mencionan las ventanas de programa donde se visualizan los
eventos de la simulacin.

Ventana Source
Es la ventana donde se edita el cdigo en ensamblador y al depurar aparece una
flecha verde que apunta a la siguiente instruccin a ejecutar:

Indicador de la siguiente instruccin a ejecutar

Ventana Special Function Registers


Muestra el estado de todos los registros de funciones especiales se activa en el
men: View Special Function Registers
Ventana Watch
Muestra el estado de algn registro en especial que el usuario ingrese en la
columna Symbol Name incluyendo los Registros de
Funciones Especiales se activa en el men View Watch

Ventana Stopwatch

Ventana Stimulus
Todas ellas son ventanas tiles sin embargo podemos omitir algunas de ellas del
espacio de trabajo, por ejemplo la ventana Special Function Registers la podemos
quitar y dejar a la ventana Watch; en caso de que nuestro programa no tenga
entradas ni trabaje con tiempos tambin podemos quitar la ventana Stimulus y
Stopwatch respectivamente.

Para este caso crearemos un espacio de trabajo con las siguiente


ventanas: Source,Watch y Stimulus.
[En construccin: Ejecucin]

En otra publicacin explicaremos cmo grabar un el cdigo .hex en un


microcontrolador utilizando Pickit 2.
Simulacin en ISIS Proteus
Posted on August 2, 2012by need4bits

ISIS Proteus en un software de simulacin de circuitos elctricos que permite


simular el cdigo hexadecimal de un programa creado en Ensamblador o C.

Para realizar una simulacin seguir las siguientes indicaciones:

1. Una vez instalada la aplicacin, al ejecutarla aparecer la ventana principal


(Figura 1)

Figura 1. Ventana Principal ISIS Proteus

2. Se da clic en la letra P junto a DEVICES para agregar los dispositivos en la


hoja de trabajo (Figura 2):

Figura 2. Seleccionar Dispositivos

3. Despus de dar clic se abrir la siguiente ventana (Figura 3):


Figura 3. Pick Devices

4. Del lado izquierdo hay un cuadro de texto con la etiqueta Keywords en el cual
se pueden los buscar componentes por su nombre, lo que facilita su bsqueda;
aunque tambin es posible buscar componentes por categoras pero resulta ms
tardado. (Figura 4):
Figura 4. Bsqueda por palabras clave

5. Una vez encontrado el componente, se agrega seleccionando su nombre en la


ventana de resultados y posteriormente presionando el botn OK . El
componente aparecer en el cuadro Devices y cada vez que se agregue un nuevo
componente ir apareciendo en este lugar (Figura 5):

Figura 5. Lista de componentes agregados

6. Posteriormente se selecciona el componente a insertar y se da clic en la hoja de


trabajo, tambin se puede arrastrar y soltar los componentes y mientras se hace
esta operacin el puntero del mouse cambiar a un lpiz verde y se podr visualizar
la figura (Figura 6):
Figura 6. Insercin de componentes

7. Dependiendo de la prctica se pueden agregar instrumentos de medicin como:


Osciloscopio, Multimetro, Generador de Seales, entre otros. En este caso al
trabajar con un PIC es necesario saber cmo importar el *.hex generado; para ello,
una vez agregado el PICXX, se da doble clic sobre este para editar sus propiedades
o clic derecho > Edit Properties, aparecer la siguiente ventana (Figura 7):

Figura 7. Importar el archivo *.hex

8. Dar clic en el icono de la carpeta para buscar el archivo e importarlo (Figura 8)

Figura 8. Importar el archivo *.hex

9. El botn anterior abre una ventana para buscar el archivo, seleccionarlo y poder
importarlo; para ello podemos importar archivos con extensin *.hex o *.cof. Una
vez se ha encontrado el archivo se da Abrir
10. Por ltimo se comienza la simulacin dando clic en el botn Play que se
encuentra en la parte inferior del lado izquierdo (Figura 10).
Figura 10. Iniciar simulacin

Si no existen errores Proteus comenzar a realizar las operaciones


correspondientes al circuito y al programa, de otra manera advertir en la barra de
estado que hay errores (Figura 11)

Figura 11. Mensajes y advertencias de errores

De esta manera se simula un circuito que emplea un PIC en ISIS Proteus.


1. Encender y Apagar un LED mediante un botn,
PIC18F4550 ASM
Posted on June 30, 2012by need4bits

Objetivo
Identificar y conocer las caractersticas 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 botn pulsador conectado a RB4.
Realizar la simulacin del circuito en ISIS Proteus, cargando el *.hex al
PIC18F4550.
Programar el microcontrolador mediante Pickit2
Marco Terico
En el siguiente grfico (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 continuacin 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 programacin (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 Aritmtica y Lgica), registros,
buses y unidad de control, es decir tiene una CPU (Unidad Central de
Procesamiento).

La mayora de los dispositivos de lgica secuencial, entre ellos los CPU, son de
naturaleza sncrona. Es decir, estn diseados y operan en funcin de una seal de
sincronizacin. Esta seal, conocida como seal de reloj, usualmente toma la forma
de una onda cuadrada peridica. Calculando el tiempo mximo en que las seales
elctricas pueden moverse en las varias bifurcaciones de los muchos circuitos de un
CPU, los diseadores pueden seleccionar un perodo apropiado para la seal de
reloj.
Para el correcto funcionamiento del microcontrolador debemos definir la
frecuencia del oscilador pues determinar los ciclos de instruccin; 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 continuacin mostramos la tabla del registro de configuracin del oscilador


(Figura 4)
Figura 4. Registro OSCCON para la Configuracin del Oscilador

Podemos ver que por default tiene cargado el valor: 0100 X000 que de acuerdo con
los valores de la tabla anterior corresponderan a la siguiente configuracin:

0 | El dispositivo entra en reposo/bajo consumo cuando se ejecuta la


instruccin 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 configuracin.
Para estas prcticas se utilizar una frecuencia de 4MHz y, como no es necesario
precisin en el tiempo, no pondremos ningn oscilador externo, de esta manera el
valor a cargar ser el siguiente:

0 110 0 0 00 => 0110 0000 => 0x60


Clculos
Dado que se configur el oscilador interno del microcontrolador a 4MHz, se tiene:

Ciclo de reloj:

Ciclo de instruccin:

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 botn pulsador a 0.5mA, utilizar
una resistencia de 10k.

Simulacin
Para simular el siguiente cdigo por favor revisar la publicacin de Cmo utilizar y
simular en MPLAB? y Cmo utilizar y simular en ISIS Proteus?, si sabes hacerlo
puedes seguir leyendo.
Creamos un proyecto nuevo y lo llamamos LedOn, como buena prctica de
programacin y para una mejor organizacin conviene que el archivo fuente del
cdigo lleve el mismo nombre del proyecto, es decir LedOn.asm este archivo con
extensin *.asm es de ensamblador.

; ********************************************************
1
; Desarrollo de Microcontroladores y DSPS
2
; Encender un LED
3 ; Prctica 1

4 ;

; Fecha: 03/06/2012
5
; Notas: Encender un LED en RB4 al presionar un botn en RB0
6
;
7
; Autor: ek
8
; ************************************************************
9
LIST P = 18F4550
10
INCLUDE <P18F4550.INC>

11
;************************************************************

12 CONFIG FOSC = HS ;INTOSC_XT no disponible para simulacin, usar HS

13 CONFIG PWRT = ON

14 CONFIG BOR = OFF

15 CONFIG WDT = OFF

CONFIG MCLRE = ON
16

CONFIG PBADEN = OFF


17
CONFIG LVP = OFF
18
CONFIG DEBUG = OFF
19
CONFIG XINST = OFF
20
; CODE ******************************************************
21
#define Led PORTB, 4

22
23

24 ORG 0x00 ;Iniciar el programa en el registro 0x00

25

26 clrf PORTB ;Limpia los posibles valores actuales de PORTB

27 movlw 0x0F ;Entradas y Salidas para PORTB

movwf TRISB ;Configura TRISB <- W


28

29
INICIO
30
btfss PORTB, 0 ;Salta si RB0 = 1 presionado
31
goto LedOff ;RB0 = 0, continua apagado
32
bsf Led ;Encender Led
33
bra INICIO
34

35
LedOff
36
bcf Led ;Apagar Led

37
bra INICIO

38

39 END ;Fin de Programa

40

41

42
Una vez terminado contruimos el cdigo 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.

Figura 5. Diagrama de Conexin del circuito.


2. Efecto de corrimiento con LEDs, PIC18F4550 ASM
Posted on August 12, 2012by need4bits

Introduccin
La disposicin 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 estn
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 caractersticas del PIC18F4550.
Utilizar el software MPLAB para crear un proyecto y simular el cdigo.
Realizar un programa en lenguaje ensamblador para controlar el encendido de
8 LEDs 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 botn.
El tiempo de transicin entre los LEDs ser de 300ms.
Realizar simulacin en MPLAB.
Realizar simulacin en ISIS Proteus.
Programar el microcontrolador utilizando Pickit 2
Marco Terico
En el siguiente grfico (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 continuacin 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 programacin (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 Aritmtica y Lgica), registros,
buses y unidad de control, es decir tiene una CPU (Unidad Central de
Procesamiento).

La mayora de los dispositivos de lgica secuencial, entre ellos los CPU, son de
naturaleza sncrona. Es decir, estn diseados y operan en funcin de una seal de
sincronizacin. Esta seal, conocida como seal de reloj, usualmente toma la forma
de una onda cuadrada peridica. Calculando el tiempo mximo en que las seales
elctricas pueden moverse en las varias bifurcaciones de los muchos circuitos de un
CPU, los diseadores pueden seleccionar un perodo apropiado para la seal de
reloj.
Para el correcto funcionamiento del microcontrolador debemos definir la
frecuencia del oscilador pues determinar los ciclos de instruccin; 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 continuacin mostramos la tabla del registro de configuracin del oscilador


(Figura 4)
Figura 4. Registro OSCCON para la Configuracin del Oscilador

Podemos ver que por default tiene cargado el valor: 0100 X000 que de acuerdo con
los valores de la tabla anterior corresponderan a la siguiente configuracin:

0 | El dispositivo entra en reposo/bajo consumo cuando se ejecuta la


instruccin 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 configuracin.
Para estas prcticas se utilizar una frecuencia de 4MHz y, como no es necesario
precisin en el tiempo, no pondremos ningn oscilador externo, de esta manera el
valor a cargar ser el siguiente:

0 110 0 0 00 => 0110 0000 => 0x60


Clculos
Dado que se configur el oscilador interno del microcontrolador a 4MHz, se tiene:

Ciclo de reloj:

Ciclo de instruccin:

Para limitar la corriente que circular por los LEDs conectados al Puerto B, se
proponen resistencias de 330:

Y para limitar la corriente del pin de Reset y el botn pulsador a 0.5mA, utilizar
una resistencia de 10k.

Para generar el retardo se utilizarn tres registros de la memoria y se cargarn 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 estn dentro del ciclo del contador 3 (Conta3). Tomando en
cuenta que se necesitan 3 ciclos de instruccin para ir decrementando los ciclos, la
frmula queda como sigue:

Simulacin
Antes de comenzar la simulacin es necesario leer lo siguiente: Cmo simular en
MPLAB? y Cmo simular en ISIS Proteus? en caso de saber cmo hacerlo se
pueden omitir los enlaces anteriores.
Desarrollar una simulacin en MPLAB con la finalidad de medir los tiempos de
ejecucin para los retardos y observar la ejecucin de cada instruccin.

1 ; ********************************************************

2 ; Desarrollo de Microcontroladores y DSPS

3 ; Barrido de LEDs bidireccional

4 ; Prctica 2

;
5
; Fecha: 08/06/2012
6
; Notas: Hacer el barrido de un LED
7
;
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

CONFIG MCLRE = ON
17
18 CONFIG PBADEN = OFF

19 CONFIG LVP = OFF

CONFIG DEBUG = OFF


20
CONFIG XINST = OFF
21
; CODE ******************************************************
22

23
#define Conta 0x12
24
cblock
25
Conta1
26
Conta2

27
Conta3

28 Sweep

29 endc

30

31 #define Time1 0x00 ;Configuracin para 300ms 0x00

32 #define Time2 0x85 ;Configuracin para 300ms 0x85

33 #define Time3 0x02 ;Configuracin para 300ms 0x02

34

35 ORG 0x00 ;Iniciar el programa en el registro 0x00

36

37 clrf PORTB ;Limpia los posibles valores actuales de PORTB


38 clrf PORTD ;Limpia los posibles valores actuales de PORTD

39 clrf TRISB ;Configura TRISB movlw 0x01 ;Entrada RD0 de habilita

40 movwf TRISD ;Configura TRISD =>=>

call Retardo ;Esperar un tiempo


41
rrncf Sweep, F ;Rotar hacia la Derecha y Guardar en Sweep
42
movff Sweep, PORTB ;Mover el valor de Sweep a PORTB
43
btfss PORTD, 0 ;Salta si RD0 = 1, Cambio <== bra MoveRight ;Re
44

45
MoveLeft
46
call Retardo ;Esperar un tiempo
47
rlncf Sweep, F ;Rotar hacia la izquierda y Guardar en Sweep
48
movff Sweep, PORTB ;Mover el valor de Sweep a PORTB

49
btfss PORTD, 0 ;Salta si RD0 = 1, Cambio ==> PRESIONAR Y SOLTAR

50
;btfsc PORTD, 0 ;Salta si RD0 = 0, Cambio ==> SLO AL PRESIONAR

51
bra MoveLeft ;Repetir Ciclo <=<=< bra MoveRight ;Direccin

52

53
bra INICIO

54

55 ;****** Funciones *************************

56 Retardo

57 movlw Time1
58 movwf Conta1

59 movlw Time2

movwf Conta2
60
movlw Time3
61
movwf Conta3
62
Repeat
63
decfsz Conta1, F ;Salta cuando Conta1 llega a 0
64
bra Repeat ;Salta a Repeat para Decrementar Conta1
65

66
movlw Time1 ;Mover el valor de Conta1 -> W
67
movwf Conta1 ;W -> Conta1, reconfigurar el valor
68
decfsz Conta2, F ;Salta cuando Conta2 llega a 0

69
bra Repeat ;Salta a Repeat

70

71 decfsz Conta3

72 bra Repeat

73 Return

74

75 END ;Fin de Programa

76

77
78

79

Armar el siguientes circuito en ISIS Proteus y simularlo, de la misma manera ser


el circuito fsico (Figura 5).

Figura 5. Circuito
3. Control de un Motor a Pasos Bipolar, PIC18F4550 ASM
Posted on August 15, 2012by need4bits

Introduccin
En varios sistemas electrnicos nos encontramos con una parte mecnica que
transmite algn movimiento por palancas, levas, poleas, ejes de rotacin, entre
otras, todas ellas obtienen, en primera instancia, el movimiento de algn motor.

Existen diferentes tipos de motores, sin embargo para sistemas como: DVDs,
Grabadoras, Quemadores de discos, Impresoras, etc; se necesita un mejor control
de las vueltas que realiza el motor, de esta manera los motores a pasos resultan ser
los ms convenientes.

De igual manera disponemos de motores a pasos unipolares o bipolares, cada uno


de ellos tiene una combinacin a sus entradas que determina su posicin. Para
controlar la secuencia de estas combinaciones podemos utilizar un PIC.

Objetivo
Manipular un motor a pasos bipolar en dos direcciones mediante dos botones.

Objetivos especficos

Identificar las caractersticas del PIC18F4550.


Manejar el software MPLAB para crear un proyecto y simular su funcionamiento.
Realizar un programa en lenguaje ensamblador para controlar el sentido de giro de un
motor a pasos bipolar mediante dos botones pulsadores; un pulsador ubicado en RD0
controla el sentido de giro hacia la derecha, mientras que el otro ubicado en RD1 lo
hace hacia la izquierda. El motor slo avanza un paso cada vez que se presiona uno de
los dos botones, si se presionan ambos o no se presiona ninguno el motor no deber
avanzar.
Realizar la simulacin del cdigo en MPLAB.
Armar el circuito en ISIS Proteus y simularlo.
Programar el microcontrolador mediante el software Pickit2.
Armar el circuito fsico y realizar pruebas.
Marco Terico
En el siguiente grfico (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 continuacin 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 programacin (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 Aritmtica y Lgica), registros,
buses y unidad de control, es decir tiene una CPU (Unidad Central de
Procesamiento).

La mayora de los dispositivos de lgica secuencial, entre ellos los CPU, son de
naturaleza sncrona. Es decir, estn diseados y operan en funcin de una seal de
sincronizacin. Esta seal, conocida como seal de reloj, usualmente toma la forma
de una onda cuadrada peridica. Calculando el tiempo mximo en que las seales
elctricas pueden moverse en las varias bifurcaciones de los muchos circuitos de un
CPU, los diseadores pueden seleccionar un perodo apropiado para la seal de
reloj.
Para el correcto funcionamiento del microcontrolador debemos definir la
frecuencia del oscilador pues determinar los ciclos de instruccin; 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 continuacin mostramos la tabla del registro de configuracin del oscilador


(Figura 4)
Figura 4. Registro OSCCON para la Configuracin del Oscilador

Podemos ver que por default tiene cargado el valor: 0100 X000 que de acuerdo con
los valores de la tabla anterior corresponderan a la siguiente configuracin:

0 | El dispositivo entra en reposo/bajo consumo cuando se ejecuta la instruccin 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 configuracin.
Para estas prcticas se utilizar una frecuencia de 4MHz y, como no es necesario
precisin en el tiempo, no pondremos ningn oscilador externo, de esta manera el
valor a cargar ser el siguiente:

0 110 0 0 00 => 0110 0000 => 0x60


Motor a Pasos Bipolar
Un motor a pasos es capaz de moverse ciertos grados cada vez que se le aplique un
pulso y se mueva un paso, este paso puede variar desde 90 hasta 1.8.

Estos motores poseen la ventaja de poder quedar enclavados en una sla posicin o
bien totalmente libres; si una o ms de sus bobinas esta energizada el motor
permanecer en la posicin correspondiente, o bien, si no hay flujo de corriente en
las bobinas el eje del motor estar libre.

Estos motores estn constituidos normalmente por un rotor sobre el que van
aplicados distintos imanes permanentes y por un cierto nmero de bobinas
excitadoras en su estator.

Para controlar un motor a pasos es necesario conocer su funcionamiento, disear la


etapa de potencia (transistores, diodos) y un circuito digital para la etapa de control
(Circuitos TTL, Microcontrolador PIC). (Figura 5)
Figura 5. Motor a Pasos Bipolar y puente H

Existen 2 tipos de motores a pasos:

1. Unipolares
2. Bipolares
Ambos soncontrolados mediante una secuencia de activacin especfica, pero se
diferencian en el modo en que estn conectadas sus bobinas. Debido a que se usar
un motor a pasos bipolar se caracterizar a continuacin.

Motor Bipolar
En este tipo de motores las bobinas del estator se conectar en serie formando
solamente dos grupos, que se montan sobre dos estatores. De acuerdo a la (Figura
5) se observa que de este motor salen cuatro hilos que se conectan al circuito de
control que realiza la funcin de cuatro interruptores electrnicos dobles, que nos
permiten variar la polaridad de alimentacn de las bobinas.

Con la activacin y desactivacin adecuada de dichos interruptores dobles,


podemos obtener las secuencias adecuadas para que el motor pueda girar en un
sentido o en otro.

Secuencia para manejar motores paso a paso Bipolares

Los motores a pasos Bipolares generalmente tienen 4 cables de salida. Se


caracterizan por tener dos bobinas independientes que al ser excitadas posicionan
el eje del motor en cierta posicin, estos motores necesitan la inversin de la
corriente que circula en sus bobinas en una secuencia determinada; Cada inversin
de la polaridad provoca el movimiento del eje en un paso, cuyo sentido de giro est
determinado por la secuencia siguiente (Figura 6):

Figura 6. Secuencia para un Motor a Pasos Bipolar

Motor Unipolar
Estos motores suelen tener 6 o 7 cables de salida, dependiendo de sus conexiones
internas. Este tipo se caracteriza por ser ms simple de controlar. En la (Figura 7)
podemos apreciar un ejemplo de conexionado para controlar un motor a pasos
unipolar mediante el uso de un ULN2803, el cual es un array de 8 transistores tipo
darlington capaz de manejar cargas de hasta 500mA. Las entradas de activacin (A,
B, C y D) pueden ser activadas por un microcontrolador.
Figura 7. Motor a Pasos Unipolar

Secuencia para manejar motores paso a paso Unipolares

Existen tres secuencias posibles para este tipo de motores, todas las secuencias
comienzan nuevamente por el paso 1 una vez alcanzao el paso final (4 u 8).

1. Secuencia normal: La descrita en la tabla de la (Figura 8).


2. Secuencia del tipo Wave drive: Slo activa una bobina a la vez.
3. Secuencia del tipo medio paso: Activa una bobina y despus dos.

Figura 8. Secuencia normal para motor a pasos unipolar

Para invertir el sentido de giro, simplemente se debe ejecutar las secuencias en


modo inverso.

Clculos
Dado que se configur el oscilador interno del microcontrolador a 4MHz, se tiene:

Ciclo de reloj:

Ciclo de instruccin:
Para limitar la corriente del pin de Reset y el
botn pulsador a 0.5mA, utilizar una resistencia de 10k.

Se emplea un retardo de 200 ms para verificar la secuencia de pulsos de los botones,


tomando en cuenta que es un tiempo considerable para pulsar y soltar un botn. Por lo
tanto se crean 2 variables quedando definidas de la siguiente manera:
Conta 1: 256
Conta 2: 256

El contador 1 se encuentra dentro del ciclo de conteo del contador 2. Tomando en


cuenta que se necesitan 3 ciclos de instruccin 3 us para la ejecucin de cada
sustraccin al contador 1. La frmula queda como sigue:

Simulacin
Antes de comenzar la simulacin es necesario leer lo siguiente: Cmo simular en
MPLAB? y Cmo simular en ISIS Proteus? en caso de saber cmo hacerlo se
pueden omitir los enlaces anteriores.
Simulacin en MPLAB

Para el desarrollo de esta prctica haremos uso de una librera que contendr las
funciones para los retardos, de manera que necesitaremos un archivo con extensin
*.inc y un *.asm, ste ltimo ser el archivo principal.

En primer lugar se realizar el cdigo correspondiente a los retardos, para ello


creamos un nuevo archivo File\New o Ctrl + N

Nos aparecer una ventana en blanco donde podemos comenzar a escribir el


cdigo, sin embargo la sintaxis no se resaltar hasta que tenga una extensin, para
ello ejecutamos el comando Guardar como mediante el men File\Save
As En la ventana que aparece asignar el nombre de la librera, en este caso le
llamaremos Retardo y le colocamos la extensin .inc de manera que antes de
guardar deber aparecer en el cuadro de texto Retardo.inc como se muestra en la
(Figura 9)

Figura 9. Guardar Librera de la funcin Retardo

Despus de verificar la configuracin de la ventana Guardar como, damos clic en


Guardar y ahora nuestro archivo aparecer en la ventana de archivos de
proyecto en la carpeta Header Files (Figura 10). De este manera podemos
insertar el cdigo que se interpretar como una funcin incluida en una librera.
Figura 10. Archivo Fuente y para Librera

Ahora en el archivo Retardo.inc escribiremos el siguiente cdigo:

#define Conta
1

cblock
2
Conta1
3
Conta2
4
Conta3
5
endc
6

7
Retardo200ms

8
clrf Conta1

9
clrf Conta2

10 Repeat
11 decfsz Conta1, F ;Salta cuando Conta1 llega a 0

12 bra Repeat ;Salta a Repeat para Decrementar Conta1

13

decfsz Conta2, F ;Salta cuando Conta2 llega a 0


14

bra Repeat ;Salta a Repeat


15

16
Return
17

18

Se guardan los cambios y se continua editando el archivo fuente como sigue:

; ********************************************************
1

; Desarrollo de Microcontroladores y DSPS


2

; Control de un Motor a pasos Bipolar


3
; Prctica 3
4
;
5
; Fecha: 15/06/2012
6
; Notas: Control de un motor a pasos bipolar mediante
7
; dos botones que controlan su direccin

8
;

9
; Autor: ek

10 ; ************************************************************
11 LIST P = 18F4550

12 INCLUDE <P18F4550.INC>

;************************************************************
13

CONFIG FOSC = HS ;INTOSC_XT no disponible para simulacin, usar 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 cblock

24 SecuenC ;Indice de la Secuencia

25 endc

26

27 ORG 0x00 ;Iniciar el programa en el registro 0x00

28

29 movlw 0x62 ;Palabra de congiguracin del OSC Interno


30 movwf OSCCON ;Configurar OSCC2ON <- W

31

32 clrf PORTD ;Borra posibles valores en PORTD

clrf PORTB ;Borra posibles valores en PORTB


33

34

movlw 0x03 ;Configurar RD0 y RD1 como entradas


35

movwf TRISD ;TRISD <- W


36
clrf TRISB ;Configurar PORTD como salida
37
clrf SecuenC ;Estado de Posicin a 0x00
38

39
INICIO
40
movf SecuenC, W
41
call MotorPosition
42
movwf PORTB

43
call Retardo200ms

44

45
ButtonRight ;Verificar Botn Derecho

46 btfss PORTD, 0 ;Verificar RB0 == 1, R == ON

47 bra ButtonLeft ;RB0 == 0, R == OFF

48 btfsc PORTD, 1 ;Verificar RB1 == 0, L == OFF


49 bra INICIO ;Ambos estn Presionados

50 bra MoveRight ;Entradas RB0 == 1, RB1 == 0

ButtonLeft ;Verificar Botn Izquierdo


51

btfss PORTD, 1 ;R == OFF ahora Verificar RB1 == 0, L == ON


52

bra INICIO ;Ambos estn Sueltos


53
bra MoveLeft
54

55
MoveRight ;Aumentar indice para la tabla
56
movf SecuenC, W
57
xorlw 0x06 ;Verificar el indice Max
58
btfss STATUS, Z ;Salta si Z == 1, SecuenC = Indice Max
59
bra Continue1
60
clrf SecuenC

61
bra INICIO

62
Continue1

63 incf SecuenC, F

64 incf SecuenC, F

65 bra INICIO

66

67 MoveLeft
68 movf SecuenC, W ;SecuenC -> W

69 xorlw 0x00 ;Comprobar si W == 0

70 btfss STATUS, Z ;Salta si Z == 1, SecuenC = Indice Min

71 bra Continue2 ;Secuence =/= 0

72 movlw 0x06 ;Rotar hasta Indice Max

movwf SecuenC ;Asignar Indice Max -> SecuenC


73

bra INICIO
74
Continue2
75
decf SecuenC, F
76
decf SecuenC, F
77
bra INICIO
78

79
MotorPosition
80
addwf PCL, F

81
retlw 0x0A ;0000 1010

82
retlw 0x09 ;0000 1001

83
retlw 0x05 ;0000 0101

84
retlw 0x06 ;0000 0110

85

86
include "Retardo.inc" ;Agregar librera Retardo.inc
87

88 END ;Fin de Programa

89

90

91

92

93

Simulacin en ISIS Proteus

Se construy en ISIS Proteus el diagrama elctrico de la siguiente manera y se


verific que el motor responda como se esperaba al presionar los pulsadores que
controlan el sentido de giro del mismo. El motor siempre se mueve slo un paso si
se presiona slo una vez, el sentido depende del botn presionado.

Si el botn se mantiene presionado el motor seguir girando en el sentido


correspondiente hasta que se suelte, y si ambos se ambos se encuentran en el
mismo estado el motor no har nada.
Figura 11. Circuito para el control de un Motor a Pasos Bipolar

Desarrollo Experimental
Material y Equipo requerido

1 PIC18F4550
1 CI L293D (Puente H con diodos)
3 Resistencias de 10k
8 Diodos 1N4007
1 Motor a pasos Bipolar
1 Tablilla de experimentacin (Protoboard)
1 Fuente de 5V
1 Multmetro
1 Programador de Microcontroladores
1 Computadora
Software MPLAB y software de programador
Software ISIS Proteus
4. Control de un LCD, PIC18F4550 ASM
Posted on August 18, 2012by need4bits

Introduccin
En algunas ocasiones es necesario desplegar informacin textual y al mismo tiempo
valores numricos que no es suficiente utilizar LEDs como indicadores o display de
7 segmentos, por ello existen mdulos LCD (Display de Cristal Lquido) que
permiten conectar al microcontrolador una pantalla donde se pueda enviar y
mostrar informacin de inters.

Objetivo
Mostrar texto desde un PIC18F4550 a travs de un LCD

Objetivos especficos

Identificar las caractersticas del PIC18F4550.


Manejar el software MPLAB para crear un proyecto y simular su funcionamiento.
Conocer el funcionamiento, control y aplicacin de un LCD
Crear el cdigo en MikroC para el control del LCD
Realizar la simulacin del cdigo en MPLAB.
Armar el circuito en ISIS Proteus y simularlo.
Programar el microcontrolador mediante el software Pickit2.
Armar el circuito fsico y realizar pruebas.
Marco Terico
En el siguiente grfico (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 continuacin 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 programacin (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 Aritmtica y Lgica), registros,
buses y unidad de control, es decir tiene una CPU (Unidad Central de
Procesamiento).

La mayora de los dispositivos de lgica secuencial, entre ellos los CPU, son de
naturaleza sncrona. Es decir, estn diseados y operan en funcin de una seal de
sincronizacin. Esta seal, conocida como seal de reloj, usualmente toma la forma
de una onda cuadrada peridica. Calculando el tiempo mximo en que las seales
elctricas pueden moverse en las varias bifurcaciones de los muchos circuitos de un
CPU, los diseadores pueden seleccionar un perodo apropiado para la seal de
reloj.
Para el correcto funcionamiento del microcontrolador debemos definir la
frecuencia del oscilador pues determinar los ciclos de instruccin; 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 continuacin mostramos la tabla del registro de configuracin del oscilador


(Figura 4)
Figura 4. Registro OSCCON para la Configuracin del Oscilador

Podemos ver que por default tiene cargado el valor: 0100 X000 que de acuerdo con
los valores de la tabla anterior corresponderan a la siguiente configuracin:

0 | El dispositivo entra en reposo/bajo consumo cuando se ejecuta la instruccin 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 configuracin.
Para estas prcticas se utilizar una frecuencia de 4MHz y, como no es necesario
precisin en el tiempo, no pondremos ningn oscilador externo, de esta manera el
valor a cargar ser el siguiente:

0 110 0 0 00 => 0110 0000 => 0x60


LCD 216 (Displays de Cristal Lquido)
Clculos
Dado que se configur el oscilador interno del microcontrolador a 4MHz, se tiene:

Ciclo de reloj:

Ciclo de instruccin:

Para limitar la corriente del pin de Reset y el


botn pulsador a 0.5mA, utilizar una resistencia de 10k.

Se emplea un retardo de 200 ms para verificar la secuencia de pulsos de los botones,


tomando en cuenta que es un tiempo considerable para pulsar y soltar un botn. Por lo
tanto se crean 2 variables quedando definidas de la siguiente manera:
Conta 1: 256
Conta 2: 256

El contador 1 se encuentra dentro del ciclo de conteo del contador 2. Tomando en


cuenta que se necesitan 3 ciclos de instruccin 3 us para la ejecucin de cada
sustraccin al contador 1. La frmula queda como sigue:

Simulacin
Antes de comenzar la simulacin es necesario leer lo siguiente: Cmo simular en
MPLAB? y Cmo simular en ISIS Proteus? en caso de saber cmo hacerlo se
pueden omitir los enlaces anteriores.
Simulacin en MPLAB

Librera de Retardos

1 CBLOCK
2 Conta1

3 Conta2

Conta3
4

ENDC
5
;Retardo_20ms *********************
6
Retardo_20ms
7
movlw .247
8
movwf Conta1
9
movlw .26

10
movwf Conta2

11
Re_20ms

12
decfsz Conta1, F ;Salta cuando Conta1 llega a 0

13 bra Re_20ms ;Salta a Repeat para Decrementar Conta1

14 decfsz Conta2, F ;Salta cuando Conta2 llega a 0

15 bra Re_20ms ;Salta a Repeat

16 Return

17

;Retardo_5ms *********************
18

Retardo_5ms
19

movlw .146
20
movwf Conta1
21 movlw .7

22 movwf Conta2

Re_5ms
23

decfsz Conta1, F ;Salta cuando Conta1 llega a 0


24
bra Re_5ms ;Salta a Repeat para Decrementar Conta1
25
decfsz Conta2, F ;Salta cuando Conta2 llega a 0
26
bra Re_5ms ;Salta a Repeat
27
Return
28

29
;Retardo_200us *********************
30
Retardo_200us

31
movlw .65

32
movwf Conta1

33 Re_200us

34 decfsz Conta1, F ;Salta cuando Conta1 llega a 0

35 bra Re_200us ;Salta a Repeat para Decrementar Conta1

36 Return

37

;Retardo_2ms *********************
38

Retardo_2ms
39

movlw .151
40 movwf Conta1

41 movlw .3

movwf Conta2
42

Re_2ms
43
decfsz Conta1, F ;Salta cuando Conta1 llega a 0
44
bra Re_2ms ;Salta a Repeat para Decrementar Conta1
45
decfsz Conta2, F ;Salta cuando Conta2 llega a 0
46
bra Re_2ms ;Salta a Repeat
47
Return

48

49
;Retardo_50us *********************

50
Retardo_50us

51
movlw .15

52 movwf Conta1

53 Re_50us

54 decfsz Conta1, F ;Salta cuando Conta1 llega a 0

55 bra Re_50us ;Salta a Repeat para Decrementar Conta1

Return
56

57

Delay
58

clrf Conta1
59 clrf Conta2

60 movlw .3

movwf Conta3
61

Re_Delay
62
decfsz Conta1, F ;Salta cuando Conta1 llega a 0
63
bra Re_Delay ;Salta a Repeat para Decrementar Conta1
64

65
decfsz Conta2, F ;Salta cuando Conta2 llega a 0
66
bra Re_Delay ;Salta a Repeat
67

68
decfsz Conta3, F

69
bra Re_Delay

70

71
Return

72

73

74

75

76

77
78

Cdigo del programa

1 ; ********************************************************

2 ; Desarrollo de Microcontroladores y DSPS

3 ; Manejo de un LCD

4 ; Prctica 4

;
5

; Fecha: 18/06/2012
6
; Notas: Controlar un LCD LM016
7
;
8
; 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

CONFIG DEBUG = OFF


20

CONFIG XINST = OFF


21
; CODE ******************************************************
22
CBLOCK 0x0C
23
ENDC
24

25
#define LCD_RS PORTD,0
26
#define LCD_RW PORTD,1
27
#define LCD_E PORTD,2

28

29
ORG 0x00

30

31
clrf PORTB

32 clrf PORTD

33

34 clrf TRISB

35 clrf TRISD

36
37 call LCD_Inicializa

38 bcf LCD_E

39

Inicio
40

call Delay ;Esperar un tiempo antes de comenzar a escribir


41
movlw 'H'
42
call LCD_Caracter
43
movlw 'o'
44
call LCD_Caracter
45
movlw 'l'
46
call LCD_Caracter

47
movlw 'a'

48
call LCD_Caracter

49 movlw ' '

50 call LCD_Caracter

51 movlw 'M'

52 call LCD_Caracter

movlw 'u'
53

call LCD_Caracter
54

movlw 'n'
55
call LCD_Caracter
56 movlw 'd'

57 call LCD_Caracter

movlw 'o'
58

call LCD_Caracter
59
movlw '!'
60
call LCD_Caracter
61
call Delay
62
call Delay
63

64
call LCD_Borrar
65
goto Inicio

66

67
LCD_Inicializa

68
call Retardo_20ms ;Esperar 20 ms

69 movlw b'00110000' ;Mandar 0x30 -> W

70 movwf PORTB ;Enviar W -> PORTB

71

72 call Retardo_5ms ;Esperar 5ms

73 movlw b'00110000' ;Enviar 0x30 -> W

movwf PORTB
74
75

76 call Retardo_50us ;Acumular 100us

77 call Retardo_50us ;Acumular 100us

movlw b'00110000'
78

movwf PORTB
79

80
movlw 0x0F
81
movwf PORTB
82

83
bsf LCD_E
84
bcf LCD_E
85
return
86

87
LCD_Caracter

88
bsf LCD_RS ;Modo Caracter RS = 1

89
movwf PORTB ;Lo que se carg previamente en W -> PORTB

90 bsf LCD_E ;Activar Enable

91 call Retardo_50us ;Esperar 50us para enviar informacin

92 bcf LCD_E ;Transicin del Enable a 0

93 call Delay ;Esperar a poner la siguiente llamada


94 return

95

96 LCD_Borrar

movlw b'00000001' ;Comando para Borrar


97

call LCD_Comando ;Enviar un comando


98

99
LCD_Comando
100
bcf LCD_RS ;Modo Comando RS = 0
101
movwf PORTB ;Envia W -> PORTB
102
bsf LCD_E ;Activa Enable
103
call Retardo_50us ;Espera que se envie la informacin

104
bcf LCD_E ;Transicin del Enable

105
return

106

107
INCLUDE <LCD_Retardo.inc>

108

109 END ;Fin de Programa

110

111

112
113

114

115

116

Simulacin en ISIS Proteus

Figura 5. Circuito LCD

Desarrollo Experimental
Material y Equipo requerido

1 PIC18F4550
1 Pulsador (Push Button)
3 Resistencias de 10k
1 LCD JHD162A
1 Tablilla de experimentacin (Protoboard)
1 Fuente de 5V
1 Multmetro
1 Programador de Microcontroladores
1 Computadora
Software MPLAB y software de programador
Software ISIS Proteus
Programa combinacional de Leds

Ejercicio:

El ejercicio consiste en un programa combinacional. Segn el estado de los interruptores


que pulsemos RA0 y RA1, se activarn los leds RB0-RB7 conectados a la puerta B,
conforme a la siguiente tabla de la verdad:

RA1 RA0 RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0
0 0 || 1 0 1 0 1 0 1 0
0 1 || 0 1 0 1 0 1 0 1
1 0 || 0 0 0 0 1 1 1 1
1 1 || 1 1 1 1 0 0 0 0

En primer lugar analizaremos el ejercicio, el cual se puede observar que simplemente en


funcin de la combinacin de entradas RA0 o RA1, se activarn las correspondientes
salidas en el puerto B (desde RB7 a RB0).

Nos pondremos manos a la obra, abriendo el entorno de Isis, para poder realizar la
simulacin en Proteus del programa que posteriormente crearemos.El Pic que vamos a
emplear es el 16F877.
Creado el entorno de simulacin, nos podremos a realizar el cdigo, tenemos dos
opciones utilizar el compilador Pcw de CCS o utilizar MPlab, como me encontraba un
poco oxidado con MPlab, me decant para realizar el cdigo en primer lugar con Pcw.

Creado el Cdigo y compilado seleccionaremos el archivo *.Cof o *.Hex para realizar


la simulacin en Proteus, este es el resultado:

Si RA1=0 y RA0 =0

Si RA1 =0 y RA0=1

Si RA1=1 y RA0=0
Si RA1=1 y RA0=1

Descarga aqu el cdigo


https://docs.google.com/open?id=0B7vtHx8N1yJsUVRXSU9HM01uVVU
Mquina de Torneado

Ejercicio:

En el siguiente ejercicio vamos a realizar la simulacin del control de una mquina de


torneado
La secuencia se inicia al pulsar "I" (RA0) que activa el cilindro "V" (RB0). Este en su
avance empuja la pieza a tornear y acciona el sensor "b" (RA2) activando el rel del motor
"M" (RB1). Comienza el torneado.
Durante el avance se alcanza el sensor "c" (RA3) que desactiva el cilindro "V" (RB0)
inicindose el retroceso del mismo. Al volver a pasar por "b" (RA2), se desconecta "M"
(RB1). Cuando se alcanza el final de carrera "a" (RA1) se activa una seal acstica "A"
RB2) para que el operario retire la pieza, coloque otra nueva y, se inicie un nuevo ciclo, al
pulsar "I" (RA0).

En primer lugar analizaremos el ejercicio y para ello lo mejor es que observemos las
entradas y salidas con las que cuenta esta mquina de torno.

Entradas
I-->RA0--> Marcha
a-->RA1--> Final de carrera "a"
b-->RA2--> Sensor "b"
c-->RA3--> Sensor "c"
Salidas

V-->RB0--> Cilindro V
M-->RB1--> Motor M
A-->RB2--> Seal Acstica

En el enunciado se puede observar que esta mquina acta de una forma secuencial, por
tanto lo mejor para realizar la programacin de una forma ms sencilla, es realizar un
diagrama de flujos, estados o un grafcet.
Reposo (0)
|
RA0
|
Activa cilindro V /S.Acu off(1)
|
RA2
|
Activa motor M(2)
|
RA3
|
Retroceso cilindro V(3)
|
RA2
|
Paro motor M(4)
|
RA1
|
Seal acstica on(5)
|

Una vez entendido el ejercicio vamos a realizar el Isis para hacer la simulacin en
Proteus, igual que en el ejercicio anterior, tambin vamos a emplear el PIC16F877.
Vamos a iniciar la simulacin en Isis para ver su funcionamiento.
Al encender la mquina esta se encuentra parada o en estado de reposo, y en el
momento que pulsamos la marcha o Start(RA0), se activa el cilindro V(RB0).

El cilindro V en movimiento, conecta el sensor "b"(RA2), el cual activa el relee del motor
M(RB1).
Al accionarse el Sensor "c"(RA3), el cilindro V(RB0) se desactiva, iniciando la vuelta a su
posicin inicial.

El cilindro vuelve a pasar por el sensor "b"(RA2), y se desactiva el motor M(RB1).

A continuacin se activar el final de carrera A(RA1), lo que produce que entre en


funcionamiento la Seal acstica(RB2).
Por ltimo, cuando el operario retire la pieza ya torneada, y pulse el botn de marcha o
Start(RA0), se desactivar la seal acstica(RB2) y comenzar el proceso de nuevo.

Descarga aqu el cdigo


https://docs.google.com/open?id=0B7vtHx8N1yJsZ0dYWlBWM1NPWlE
PIC 18F4550

Principales caractersticas del Pic 18F4550

Microcontrolador con mdulo USB 2.0. Soporta Low speed 1.5Mb/s y full speed
12Mb/s.
1kB de memoria de doble acceso va USB
35 pines I/O disponibles
Memoria de programa flash de 32 kB
RAM de 2048 Bytes
EEPROM de datos de 256 Bytes
Velocidad de la CPU 12 MIPS
Oscilador externo de dos modos hasta 48 MHz
Oscilador interno selecionable entre 8 frecuencias desde 31kHz hasta 8MHz
Oscilador secundario con Timer 1 de hasta 32kHz
Opciones de oscilador dual permiten que la velocidad de la CPU y del mdulo USB
sean diferentes
ADC de 10 bits y 13 canales
Tecnologa nanoWatt que brinda caractersticas y funciones de bajo consumo y
ahorro de energa
Voltaje de operacin 4.2V a 5.5V
4 Timer(desde Timer0 a Timer3). Uno de 8 bits y 3 de 16 bits
2 mdulos de captura/comparacin/PWM
EUSART, SPP, SPI, IC.
20 fuentes de interrupciones (3 externas)
Resistencias de pull-ups en el puerto B programables
Funcin del pin MCLR opcional
Brown-out Reset de valor programable
Power-on Reset
Power-up Timer y Oscillator Start-up Timer
Soporta 100,000 ciclos de borrado/escritura en memoria flash
Soporta 1,000,000 ciclos de borrado/escritura en memoria EEPROM
Retencin de datos mayor a 40 aos
Proteccin de cdigo y datos programable
Encapsulado DIP de 40 pines

Despus de analizar las principales caractersticas del dispositivo , nos introduciremos


mas a fondo en l, tal y como hicimos en la entrada del PIC 16F877.
En la siguiente captura podemos ver una tabla comparativa entre varios dispositivos de la
familia, as como sus principales caractersticas.

Detallado de Pines

Como se puede apreciar en la imagen tiene cierta similitud a la disposicin de pines del
Pic 16F877.
Arquitectura del Pic

Como expliqu en la entrada del Pic 16F877 existen dos tipos de arquitecturas la de Von
Newman y la tipo Hardvard.
El Pic 18F4550 posee una arquitectura tipo Hardvard, ya que dispone de diferentes buses
para acceder a la memoria de programa o a la memoria de datos. Esto nos da la opcin
de acceder a la memoria de datos para ejecutar una instruccin, mientras se lee de la
memoria de programa la siguiente instruccin. Es decir, podemos acceder de forma
simultnea a ambas memorias.

El Bus de memoria de programa: Est formado por 21 lneas de direccin,16 lineas para
instrucciones y 8 lineas para datos.

El Bus de memoria de datos: Compuesto por 12 lneas de direccin y 8 lneas de datos.

Estructura Interna del Pic

Dentro del datasheet del dispositivo podemos encontrar un diagrama de bloques que nos
explica la arquitectura interna que tiene el Pic 18F4550.
Como podemos ver en la imagen este modelo de Pic es bastante completo, cuenta con
una serie de elementos como: la memoria de programa, memoria de datos,contadores,
puertos I/O, latch de direccin, datos...

Organizacin de la memoria

La memoria del Pic se divide en: Memoria RAM de datos, memoria de programa, memoria
EEprom de datos, la pila y memoria de configuracin

Memoria de datos

Cuenta con una memoria de RAM de datos de 2048 bytes, (8 de los bancos de 256
bytes).
Tambin cuenta con 160 bytes dedicados a los SFR's(Registros de funcin especial) los
cuales se encuentran en la parte alta del banco 15.
Como se puede ver en la imagen la memoria RAM de datos se compone por GPR's o
registros de propsito general y SFR's o registros de funcin especial.
Es la encargada de almacenar datos de forma temporal durante la ejecucin del
programa.
Para acceder a un Byte de la memoria de datos en primer lugar seleccionaremos el banco
mediante el BSR(Bank Selector Register) y a continuacin se disecciona el byte dentro
del banco.

Memoria de programa

El Pic 18F4550 cuenta con una memoria de programa de 32K (32768 bytes). Es una
memoria tipo Flash.
Esta memoria es la que se encarga de almacenar las instrucciones, constantes y datos.
La podemos escribir o leer con un programador externo o en ejecucin.

Memoria EEprom de datos


Es una memoria no volatil en la que se almacenan los datos en ausencia de tensin.
Cuatro SFR son usados para la escritura y lectura de la EEPROM:
EECON1 y EECON2(controlan el acceso a los datos de la memoria EEPROM).
EEDATA y EEADR(ordenan la escritura/lectura y la direccin).

La pila o Stack
Es un bloque de memoria RAM independiente de 31 palabras de 21 bits en la cual se
almacena de una forma temporal el valor del Contador de Programa(Program Counter)
cuando se produce una llamada a subrutina o interrupcin.

Memoria de configuracin
Es un bloque de memoria situado a partir de la posicin 30000H en la memoria de
programa donde se almacenan:
Bits de configuracin. Contenidos en 12 bytes de memoria flash donde se
almacenan varias opciones de configuracin: opciones del oscilador, reset, watchdog,
circuiteria de depuracin y programacin... Estos bits pueden ser modificados.
Registros de identificacin. Contienen informacin del modelo y revisin del
dispositivo. Son registros de lectura

Ciclo mquina y ciclo de instruccin

Al igual que explique en el Pic 16F877, en el Pic 18F4550 la mayora de las instrucciones
tambin se ejecutan en un solo ciclo mquina.

El ciclo de instruccin
Un ciclo de instruccin comprende cuatro ciclos Q(desde Q1 hasta Q4), tal y como se
puede apreciar en la imagen.
En la captura tambin se puede observar el esquemtico del proceso Pipeline el cual es
un sistema que nos permite ejecutar una instruccin(acceso a la memoria de datos),
mientras se lee de la memoria de programa la siguiente instruccin.
Lectura Analgico-Digital
En la siguiente entrada, mediante el Pic 18F4550 vamos a hacer una lectura de tensin
analgica y visualizarla en el PC con Hyperterminal va RS232.
Primero realizaremos una simulacin en Proteus, y una vez comprobado lo cargaremos
en una Pic control.

Para comenzar analizaremos el Pic que vamos a utilizar, para conocer cuales son las
entradas analgicas de que dispone. Segn el datasheet, los pines que podemos
configurar como analgicos son RA0, RA1,RA2,RA3.

Acto seguido pasaremos a realizar el esquemtico en Proteus para que una vez que
tengamos el cdigo generado, podamos simularlo antes de programarlo fsicamente.
Este es el esquemtico diseado en Proteus.
Como se puede observar la lectura analgica la hacemos por el puerto RA0. Hemos
conectado el Lcd en el puerto D tanto los pines de control como los de datos y mediante el
Pin RC6 transferimos los datos a Virtual terminal. Para la simulacin en Proteus, no es
necesario el Max232 para adaptar niveles de TTL a RS232, pero fsicamente lo
necesitamos sin ninguna duda.

Ahora que ya hemos creado el diseo en Proteus, el segundo punto ser la programacin
del cdigo mediante MPLab.
Abajo adjunto el resultado del cdigo para su descarga, pero primero lo explicar
detalladamente.

Cabecera:

#include <18f4550.h> //Definimos la librera del Pic.


#device adc=10 //Establecemos la conversin analgica digital a 10 bits.
#FUSES INTHS,MCLR,PUT,BROWNOUT // Definimos los Fuses
#use delay(INTERNAL=8MHZ) //El reloj interno empleado es de 8Mhz
#use rs232 (BAUD =9600 , XMIT=PIN_C6 , RCV=PIN_C7 ) //RC6= Tx
/* La funcion use rs232 es para activar el Rs232 y establecer su configuracin, le hemos
puesto una velocidad de 9600 baudios, el pin Tx lo hemos definido como RC6 y el pin Rx
como RC7(aunque no lo vamos a utilizar en esta prctica).*/
#include <lcd.c> /* incluimos la librera lcd.c, en la cual tenemos que comprobar los
pines de control y de datos */

Variables utilizadas:

long int val;


float voltaje;

Main:

void main()
{
setup_adc(ADC_CLOCK_INTERNAL); //configuramos el conversor A/D con el reloj
interno
setup_adc_ports(AN0||VSS_VDD); //configuramos el pin RA0 como analgico
lcd_init(); //funcion que activa el lcd
do{
set_adc_channel(0); //canal a especificar por la funcion read_adc
delay_us(60);
val=read_adc(); //almacenamos en la variable val con funcion
read_adc
voltaje=(4.98*val/1023.0); /*realizamos la conversin del valor
obtenido, multiplicndolo por el voltaje de referencia que es 4.98 voltios y lo dividimos
entre 1024.*/
printf("\nVoltaje:%1.2f",voltaje); //mostramos la lectura de voltaje en el lcd
lcd_gotoxy(1,1);
printf(lcd_putc,"Voltaje: %f",voltaje); //enviamos la lectura por puerto serie
delay_ms(2000);
}
while(1);
}

Como ya tenemos el programa en C generado, lo compilaremos con MPLab y cargaremos


el archivo *.cof en Proteus.

Estos son los Resultados de la simulacin en Proteus:

Virtual Terminal es una herramienta que tiene Proteus que simula un hyperterminal para
la recepcin o transmisin de datos por puerto serie.

Si hacemos una variacin en la resistencia del potencimetro, se puede observar como


cambia la lectura en el Lcd y se enva un valor nuevo por el puerto serie.
Descarga aqu el cdigo
https://docs.google.com/open?id=0B7vtHx8N1yJsUGc0UGF6bFlZbEU

LCD Grfico
En la siguiente entrada vamos a realizar la programacin de un Pic y mostrar datos
a travs de un LCD grfico. El Pic que vamos a emplear en esta prctica es el 18F4550 y
el LCD grfico ser el modelo HDM64GS12, el cual cuenta con una resolucin de 128 x
64 lneas.
Para realizar la programacin hemos utilizado en este caso MPlab.

Antes de comenzar vamos a analizar lo que queremos hacer:


Realizaremos la programacin del Pic y mostraremos en el LCD grfico una serie de
datos tipo Char, un valor float, y un pequeo programa animado.

A la hora de ir a realizar la programacin, se han analizado las libreras que debemos


emplear en nuestro cdigo en funcin del objetivo del ejercicio.
La primera librera que voy a explicar es la librera HDM64GS12.c, la cual corresponde al
LCD grfico empleado. Esta librera cuenta con una serie de funciones que van desde
activar el Lcd hasta mostrar los pixels en pantalla.
Dentro de esta librera es muy importante definir los pines de control del Lcd, y los de
datos si fuera necesario(por defecto corresponden al puerto D del Pic).

La segunda librera que voy a explicar es la librera GRAPHICS.C, esta es un archivo que
contiene funciones para dibujar lneas, rectngulos, crculos y texto en el display. Nos
ser de gran utilidad para poder dibujar en el display. En este caso no es necesario,
realizar ningn tipo de modificacin de la misma.

Por ltimo la tercera librera empleada es MATH.h, la cual contiene funciones para
realizar operaciones matemticas, nosotros la vamos a emplear para utilizar la
funcin sprintf, que es una funcin que nos permite convertir variables a una cadena de
caracteres. Como el display no muestra variables tipo float, convertiremos una variable
tipo float a cadena tipo char para poder ver el dato.

Analizadas las libreras, nos ponemos manos a la obra y en primer lugar crearemos el
archivo Isis para probar el programa en el entorno de Proteus. Este es el resultado:
A la hora de ponerme con el cdigo, las funciones principales que he utilizado son.

De la librera HDM64GS12.c:
glcd_init(mode): Esta funcin es necesaria para activar o desactivar el Lcd.
glcd_pixel(x,y,color): dibuja un pixel en la coordenada "x,y" indicada.

En la libreria GRAPHICS.C:
glcd_line(x1, y1, x2, y2, color): dibuja una lnea en las cordenadas x1,x2,y1,y2
glcd_rect(x1, y1, x2, y2, fill, color): dibuja un rectngulo
glcd_text57(x, y, textptr, size, color): muestra un texto o variable Char en las coordenadas
x,y.

Y por ltimo en MATH.h:


sprintf(valor2,"%1.5f",valor): la hemos empleado para convertir una variable tipo
float(valor) a una cadena de caracteres tipo char(valor2).

Despus de realizar la programacin aqu podemos ver el resultado final:


Esta es una captura de la simulacin en Isis.

Una vez comprobada la simulacin en Proteus y que funciona correctamente,


procedemos a realizar la descarga del programa mediante el software MPLAB.
El debugger que hemos utilizado es el ICD 3, y lo hemos cargado en una Picdem con el
Pic 18F4550.
Descarga aqu el cdigo
https://docs.google.com/open?id=0B7vtHx8N1yJsWkg3WGxpR1FfeTQ

Lcd 16x2
En esta entrada vamos a explicar el funcionamiento y conexionado de un LCD con una
resolucin de 16x2.

Que es un LCD?

El LCD(Liquid Crystal Dysplay) o pantalla de cristal lquido es un dispositivo empleado


para la visualizacin de contenidos o informacin de una forma grfica, mediante
caracteres, smbolos o pequeos dibujos dependiendo del modelo. Est gobernado por un
microcontrolador el cual dirige todo su funcionamiento.
En este caso vamos a emplear un LCD de 16x2, esto quiere decir que dispone de 2 filas
de 16 caracteres cada una. Los pxeles de cada smbolo o carcter, varan en funcin de
cada modelo.

Como es su conexionado?

En la siguiente imagen de Proteus se puede observar la estructura de sus pines.


Lo podemos dividir en los Pines de alimentacin, pines de control y los pines del bus de
datos bidireccional. Por lo general podemos encontrar ademas en su estructura los pines
de Anodo de led backlight y ctodo de led backlight.
Pines de alimentacin:

Vss: Gnd
Vdd: +5 voltios
Vee: corresponde al pin de contraste, lo regularemos con un potencimetro de 10K
conectado a Vdd.

Pines de control:

RS: Corresponde al pin de seleccin de registro de control de datos (0) o registro de


datos(1). Es decir el pin RS funciona paralelamente a los pines del bus de datos. Cuando
RS es 0 el dato presente en el bus pertenece a un registro de control/instruccin. y
cuando RS es 1 el dato presente en el bus de datos pertenece a un registro de datos o
un carcter.
RW: Corresponde al pin de Escritura(0) o de Lectura(1). Nos permite escribir un dato en la
pantalla o leer un dato desde la pantalla.
E: Corresponde al pin Enable o de habilitacin. Si E(0) esto quiere decir que el LCD no
esta activado para recibir datos, pero si E(1) se encuentra activo y podemos escribir o leer
desde el LCD.

Pines de Bus de datos:


El Bus de datos bidireccional comprende desde los pines D0 a D7. Para realizar la
comunicacin con el LCD podemos hacerlo utilizando los 8 bits del bus de datos(D0 a D7)
o empleando los 4 bits mas significativos del bus de datos(D4 a D7). En este caso vamos
a explicar la comunicacin con el bus de 4 bits.
DDRAM y CGROM?

Son las dos zonas de memoria del LCD.


La memoria DDRAM(Data Display Ram): corresponde a una zona de memoria donde se
almacenan los caracteres que se van a representar en pantalla. Es decir es la memoria
donde se almacenan los caracteres a mostrar con su correspondiente posicin.

La memoria CGROM es una memoria interna donde se almacena una tabla con los
caracteres que podemos visualizar en el lcd. En la imagen podemos ver un ejemplo de la
tabla con un contenido de 192 caracteres.

La memoria CGRAM(Character Generator Ram): en ella se pueden almacenar nuestros


propios caracteres.

La librera del LCD:

Para poder visualizar los caracteres o smbolos en el LCD es necesario que en el


programa de cdigo fuente a emplear, incluyamos la librera de este.
En este caso empleamos la librera "lcd.c", la cual hemos modificado. Siempre que
utilicemos una librera de este tipo tendremos que analizarla para saber cuales son los
pines de control y los pines para el Bus de datos, en este caso podemos observar que
estn definidos al comienzo de la misma.

#define LCD_ENABLE_PIN PIN_D0


#define LCD_RS_PIN PIN_D1
#define LCD_RW_PIN PIN_D2
#define LCD_DATA4 PIN_D4
#define LCD_DATA5 PIN_D5
#define LCD_DATA6 PIN_D6
#define LCD_DATA7 PIN_D7

En el resto de la librera se puede encontrar todas las estructuras necesarias as como las
funciones que nos permiten utilizar nuestro LCD.
Podemos encontrar funciones como :

lcd_init: inicializa el lcd.


lcd_gotoxy: establece la posicion de escritura en el lcd.
lcd_putc: nos muestra un dato en la siguiente posicin del lcd, podemos emplear
funciones como \f para limpiar el display, \n cambio a la segunda lnea, \b mueve una
posicin atrs.
lcd_getc(x,y): devuelve caracteres a la posicin x,y.
Otras funciones: lcd_send_nibble(BYTE n), lcd_send_byte(BYTE address, BYTE n).

Aqu se puede ver un ejemplo de una sencilla programacin en una Pic control, y muestra
de datos en el LCD, son datos inespecficos que no muestran ninguna informacin.
Ejemplo rutinas I2C Transmisin/Recepcin de un byte
PIC18F4550
Cdigo de ejemplo:

1 ;***************************************************************************

2 ; Filename: I2C_PIC18F_EXAMPLE

3 ; Date: 13/11/2015

; Version: 01
4

; Author: Javier Soto PhD.


5
; Company: Escuela Colombiana de Ingeniera Julio Garavito - Grupo SEDA
6
; Description: Este programa presenta algunas subrutinas para comunicacin
7
; El programa principal presenta ejemplos para la transmisin/recepcin de u
8
; de informacin. No se representa la comunicacin con un dispositivo especi
9
;***************************************************************************

10
; Este ejemplo se puede adaptar a otros dispositivos de la familia PIC18F

11
; modificando apropiadamente algunas lineas de cdigo.

12
LIST P=18F4550 ;directiva que define el procesador

13
#include <P18F4550.INC> ;definicin de variables especificas

14 ;***************************************************************************

15 ;Bits de configuracin

16 ;Para PIC18F_2420_2520_4420_4520 use la siguiente configuracin para el


17 ;CONFIG OSC = INTIO67 ;Internal oscillator block, port function o

18 ;Para PIC18F_2455_2550_4455_4550 use la siguiente configuracin para el

CONFIG FOSC = INTOSCIO_EC ;Internal oscillator, port function on RA6,


19

;EC used by USB (INTIO)


20
;otras directivas comunes
21
CONFIG PBADEN = OFF ;PORTB<4:0> pins are configured as digital I/O
22
CONFIG LVP = OFF ;Single-Supply ICSP disabled
23
CONFIG WDT = OFF ;WDT disabled (control is placed on the SWDTEN
24
;***************************************************************************

25
;Definicion de variables y constantes

26
;***************************************************************************

27
led_verde equ 0x02 ;Led verde en RB2, para indicar comunicacin i2c exito

28
led_rojo equ 0x03 ;Led rojo en RB3, para indicar error en comunicacin i

29
;***************************************************************************

30 ;Programa

31 ;***************************************************************************

32 ORG 0x0000 ;Vector de reinicializacin.

33 movlw b'01110010' ;Registro de control del oscilador:

34 movwf OSCCON,A ;modo sleep con instruccin SLEEP,

35 ;Fosc=8MHz, bloque de oscilador interno.


36 MOVLW 0Fh ;Configuracin de los canales del mdulo A/D

37 MOVWF ADCON1,A ;como entradas/salidas digitales PORTA y PORTB.

38 movlw 0xF3 ;RB(3:2) out. RB(1:0)(SCL,SDA) in, bits controlados por m

39 movwf TRISB,A ;RB3(led_rojo) - RB2(led_verde) - RB1(SCL) - RB0(SDA)

40 clrf TRISC,A ;Puerto C de salida para mostrar dato recibido.

41 movlw b'00101000' ;Mdulo MSSP habilitado. Modo I2C maestro.

42 movwf SSPCON1,A ;

43 movlw b'10000000' ;Deshabilitar control de velocidad de respuesta (slew

44 movwf SSPSTAT,A ;con vel_I2C a 100 KHz no es muy relevante.

45 movlw .19 ;Configuracin de velocidad del bus I2C a 100 KHz,

46 movwf SSPADD,A ;Vel_I2C = Fosc/(4*(SSPADD +1)).

47 clrf LATB,A

48 clrf LATC,A

49

50 ;Rutina de ejemplo que lee un byte de un dispositivo XXX y lo muestra por el

51 leer_byte

52 rcall i2c_tx_start ;Enviar condicin de inicio.

53 movlw b'01110001' ;Enviar direccin del esclavo + bit R/W' en 1 (lectu

54 rcall i2c_tx_byte ;
55 btfsc SSPCON2,ACKSTAT,A ;Recibi reconocimiento positivo del esclavo? AC

56 bra cond_error ;no, reconocimiento no fue recibido, ir a condic

57 rcall i2c_rx_byte_nack ;si, leer byte del dispositivo esclavo, enviar

58 movwf LATC,A ;Muestra el dato ledo en el Puerto C

59 rcall i2c_tx_stop ;Enviar condicin de parada.

60 bsf LATB,led_verde ;Encender led verde, comunicacin exitosa.

61 bra $

62

63 ;Rutina de ejemplo que escribe un byte en un dispositivo XXX

64 escribir_byte

65 rcall i2c_tx_start ;Enviar condicin de inicio

66 movlw b'01110000' ;Enviar direccin del esclavo + bit R/W' en 0 (escri

67 rcall i2c_tx_byte ;

68 btfsc SSPCON2,ACKSTAT,A ;Recibi reconocimiento positivo del esclavo? AC

69 bra cond_error ;no, reconocimiento no fue recibido, ir a condic

70 movlw b'00001111' ;si, enviar byte al esclavo

71 rcall i2c_tx_byte ;

72 btfsc SSPCON2,ACKSTAT,A ;Recibi reconocimiento positivo del esclavo? AC

73 bra cond_error ;no, reconocimiento no fue recibido, ir a condic


74 rcall i2c_tx_stop ;si, enviar condicin de parada.

75 bsf LATB,led_verde ;Encender led verde, comunicacin exitosa.

76 bra $

77

78 cond_error

79 rcall i2c_tx_stop ;Enviar condicin de parada.

80 bsf LATB,led_rojo ;Encender led rojo que indica error: el esclavo

81 bra $ ;no respondi al maestro.

82 ;***************************************************************************

;SUBRUTINAS I2C - MODO MAESTRO


83

;***************************************************************************
84
i2c_tx_start ;Enviar condicin de inicio.
85
bcf PIR1,SSPIF,A ;Borrar la bandera del MSSP.
86
bsf SSPCON2,SEN,A ;Iniciar condicin de inicio.
87
btfss PIR1,SSPIF,A ;Termin la condicin de inicio?
88
bra $-2 ;no, esperar
89
return ;si, retorna
90

91
i2c_tx_restart ;Enviar condicin repetida de inicio.
92
bcf PIR1,SSPIF,A ;Borrar la bandera del MSSP.
93 bsf SSPCON2,RSEN,A ;Iniciar condicin repetida de inicio.

94 btfss PIR1,SSPIF,A ;Termin la condicin repetida de inicio?

95 bra $-2 ;no, esperar

96 return ;si, retorna

97

98 i2c_tx_stop ;Enviar condicin de parada.

99 bcf PIR1,SSPIF,A ;Borrar la bandera del MSSP.

100 bsf SSPCON2,PEN,A ;Iniciar condicin de parada.

101 btfss PIR1,SSPIF,A ;Termin la condicin de parada?

102 bra $-2 ;no, esperar

103 return ;si, retorna

104

105 i2c_tx_byte ;Transmitir el byte que est en WREG.

106 bcf PIR1,SSPIF,A ;Borrar la bandera del MSSP.

107 movwf SSPBUF,A ;Escribir WREG al buffer de salida (iniciar transmisin

108 btfss PIR1,SSPIF,A ;Termin transmisin del byte y recepcin del ACK? (9

109 bra $-2 ;no, esperar

110 return ;si, retorna

111
112 i2c_rx_byte_ack ;Recibir byte, generar reconocimiento positivo (a

113 bcf PIR1,SSPIF,A ;Borrar la bandera del MSSP.

114 bsf SSPCON2,RCEN,A ;Activa modo de recepcin (iniciar recepcin).

115 btfss PIR1,SSPIF,A ;Byte recibido? (8 bits)

116 bra $-2 ;no, esperar

117 bcf PIR1,SSPIF,A ;si, borrar la bandera del MSSP.

118 bcf SSPCON2,ACKDT,A ;asignar 0 al bit ACK (reconocimiento positivo)

119 bsf SSPCON2,ACKEN,A ;Iniciar generacin del ACK

120 btfss PIR1,SSPIF,A ;Termin generacin del ACK?

121 bra $-2 ;no, esperar

122 movf SSPBUF,W,A ;si, deja el byte recibido en WREG

123 return ;retorna

124

125 i2c_rx_byte_nack ;Recibir byte, generar reconocimiento negativo (a

126 bcf PIR1,SSPIF,A ;Borrar la bandera del MSSP.

127 bsf SSPCON2,RCEN,A ;Activa modo de recepcin (iniciar recepcin).

128 btfss PIR1,SSPIF,A ;Byte recibido? (8 bits)

129 bra $-2 ;no, esperar

130 bcf PIR1,SSPIF,A ;si, borrar la bandera del MSSP.


131 bsf SSPCON2,ACKDT,A ;asignar 1 al bit ACK (reconocimiento positivo)

132 bsf SSPCON2,ACKEN,A ;Iniciar generacin del ACK

133 btfss PIR1,SSPIF,A ;Termin generacin del ACK?

134 bra $-2 ;no, esperar

135 movf SSPBUF,W,A ;si, deja el byte recibido en WREG

136 return ;retorna

137

138 END ; directiva 'fin de programa'

139

140

141

Anda mungkin juga menyukai