3. DESARROLLO
LENGUAJE
Lenguaje C PIC C Compiler. V. 5.008
SIMULADOR
PROTEUS 8.1
MICROCONTROLADORES
PIC 18F2550
PIC 18F4550
Luis David Narváez
4. MATERIALES
• 1 PIC 18F2550
• 1 PIC 18F4550
• 1 FUENTE DC (min. 5v )
• 1 Protoboard
• 1 Grabador de PICs
• Pinzas y Cortadora.
• Cable UTP.
• 1 Barra de Leds
• 1 Respack 330.
• Osciladores 4 y 8 MHz.
• 1 Dipswitch de 8.
• 1 Teclado Matricial.
• 4 Displays 7 segmentos
• 4 Decodificadores BCD
• 4 Transistores 3904, 3906.
• Potenciómetros
• 1 Pantalla LCD 2x16
• 1 Pantalla GLCD 128x64
• 1 Conector DB9 hembra.
Luis David Narváez
6. GAMAS DE LOS PIC
GAMA SUPERIOR: PIC18FXXX
Tecnología CMOS.
MCU estática con convertidor A/D.
Pila de 32 niveles, una palabra de instrucción de 16
bits, múltiples interrupciones internas y externas, un
set de 77 instrucciones.
Alto rendimiento de 10 MIPS (Millones de
Instrucciones por Segundo) para una MCU.
Luis David Narváez
7. EL OSCILADOR
• INTOSC Oscilador interno de precisión (dos modos)
• RC Oscilador con resistencia y condensador (dos modos)
• XT Cristal / Resonador
• HS Cristal de alta velocidad / Resonador.
• LP Cristal para baja frecuencia y bajo consumo de potencia.
• EC Reloj externo
Nota: En el momento de programar o “quemar” el
microcontrolador se debe especificar el tipo de oscilador que
se usa. Esto se hace a través de unos bits llamados: “fusibles
de configuración”.
Luis David Narváez
17. C ESPECÍFICO PARA LOS PIC
Las principales diferencias entre compiladores residen en las directivas
(preprocessor commands) y en las funciones integradas (built-in
functions).
Directivas de Preprocesado más habituales:
#ASM Las líneas entre estas dos directivas deben ser
instrucciones
#ENDASM Ensamblador que se insertan tal y como aparecen.
#BIT id = x.y Se crea una variable tipo bit correspondiente al bit y del
byte x en memoria.
#BYTE id = x Se crea una variable y se sitúa en el byte x en memoria.
Si ya existía esa variable, se coloca físicamente en la
posición especificada.
Luis David Narváez
18. C ESPECÍFICO PARA LOS PIC
#DEFINE id texto El identificador se sustituye por el texto adjunto.
#DEVICE chip Define el micro para el que se escribe el código.
#FUSES options Define la palabra de configuración para la grabación
del microcontrolador.
#INCLUDE <fichero> Se incluye el texto del fichero especificado en el
#INCLUDE “fichero” directorio o fuera de él.
#INLINE La función que sigue a esta directiva se copia en
memoria de programa cada vez que se le llame.
Puede servir para mejorar la velocidad.
#SEPARATE La función que sigue a esta directiva se implementa
de manera separada (no INLINE). De esta manera
se ahorra ROM
Luis David Narváez
19. C ESPECÍFICO PARA LOS PIC
#ORG start Sitúa el código a partir de una determinada posición de
la memoria de programa
#INT_xxxx Indica que la función que sigue es un programa de
tratamiento de la interrupción xxxx.
#INT_GLOBAL Indica que la función que sigue es un programa
genérico de tratamiento de interrupción. No se incluye
código de salvaguarda de registros ni de recuperación
como cuando se usa #INT_xxxx.
#PRIORITY ints Establece un orden de prioridad en las interrupciones.
#USE DELAY (clock = frecuencia en Hz) Define la frecuencia del oscilador
que se va a utilizar, que se emplea para realizar los
cálculos para funciones integradas de retardo.
Luis David Narváez
20. GESTION DE PUERTOS I/O
Luis David Narváez
REGISTROS –VARIABLES EN LA MEMORIA RAM:
Se definen los puertos como variables que se colocan en las
posiciones reales en la memoria RAM de datos. (Memory
Organization)
FUNCIONES ESPECÍFICAS DEL COMPILADOR
Se definen la dirección de los datos si es necesario. Uso de
funciones propias del compilador.
#USE FAST_IO #USED FIXED_IO #USE STANDARD_IO
21. NOTA IMPORTANTE
El Registro TRIS controla la dirección de las líneas del
puerto a configurar.
Un “cero” en el bit correspondiente al pin lo
configura como salida y pone el contenido de la
memoria (latch) en el pin seleccionado.
Mientras que un “uno” lo configura como entrada y
pone el correspondiente circuito de salida en alta
impedancia.
Luis David Narváez
22. DEFINIENDO REGISTROS RAM
Luis David Narváez
PORTX TRISX:
Directiva #BYTE
#BYTE TRISB = 0x93 // Define la variableTRISB
#BYTE PORTB = 0x81 // Define la variable PORTB
Estas variables permiten controlar los puertos y se pueden
utilizar en asignaciones:
23. DEFINIENDO REGISTROS RAM
Luis David Narváez
El compilador de CCS incorpora una serie de funciones
integradas que permite manejar los bits de una variable.
30. MODALIDAD
Encendido y Apagado.
Rotación de bits.
Traslado de bits.
Interruptores y Switchs.
Rebotes
Contadores
Luis David Narváez
31. PARPADEO DE LED’s
Enunciado: Encender y apagar 4 LEDs conectados a los
pines RB0, RB1, RB2 y RB3 con una temporización de
500ms, empleando las diferentes formas de configurar los
pines en Lenguaje C.
Luis David Narváez
33. RETO:
Semáforos en una intersección, incluido
Stop y Go para Peatones
Enunciado: Realizar una emulación de dos
semáforos en una intersección mediante el
Encendido y Apagado de Leds, con indicadores de
stop y go para peatones.
ENCENDIDO Y APAGADO
Luis David Narváez
34. Para rotar los bits a la izquierda empleamos las
funciones:
rotate_left( adress, bytes);
En donde address puede ser un identificador de un
array o la dirección a un byte o a una estructura,
bytes es el número de bytes implicados en la
rotación.
Ejemplo: var = 0x40;
rotate_left(&var,1); // var=0x80
ROTACIÓN DE BITS
Luis David Narváez
35. TRASLADO DE BITS
La misma explicación es válida para:
rotate_right( adress, bytes)
Otra forma de realizar el mismo efecto es empleando el
operador
desplazamiento (>> derecha, << izquierda)
Ejemplos: var=0x40;
var=var<<n // n es el número de bits a desplazar
Luis David Narváez
36. Enunciado: Se trata de hacer encender 8 LEDs de
manera consecutiva, sin que permanezcan
encendidos dos de ellos simultáneamente. Los LEDs
están conectados al PORTB<RB7:RB0>, y al
PORTD <RD7:RD0>.
PRÁCTICA
Luis David Narváez
39. RETO:
Enunciado:
Encender secuencialmente, a la izquierda dos (2) a
la vez, los 8 LEDs conectados al PORTB con un
retardo de 500ms. Y al mismo tiempo a la
izquierda tres (3) a la vez, l 8 LEDs conectados al
PORTD con un retardo de 1s.
Luis David Narváez
40. RETO:
Enunciado:
Realizar el juego de luces del auto fantástico con
8 LEDs conectados al PORTB, con un retardo de
50ms.
Luis David Narváez
42. ENTRADAS DE DATOS
Los dispositivos de entrada de datos encontramos con
frecuencia en sensores de alarmas (magnéticos, de
movimiento, infrarrojos, etc.), sensores digitales
industriales (sensores digitales de proximidad, finales de
carrera, pulsadores de marcha y paro de motores, etc.).
Rebotes en un pulsador
El problema en la utilización de estos dispositivos son los
rebotes que aparecen en el momento en que cambian de
posición, cuya duración depende de la fuerza con que se
presione este dispositivo, y a su estructura interna.
Luis David Narváez
44. ELIMINAR REBOTES
Para eliminar este problema se suele realizar
por dos medios:
Hardware mediante el empleo de un flip-flop, un
condensador, etc.
Software utilizando los retardos de cerca de
10ms que es lo que normalmente una persona
tarda en presionar y soltar una tecla.
Luis David Narváez
45. Enunciado:
Se desea controlar una lámpara desde dos puntos
diferentes por medio de 2 interruptores. La
lámpara está conectada al RB0 y los interruptores
a RA0 y RA1
Luis David Narváez
PRÁCTICA
46. DESARROLLO
Como podemos observar en el circuito, cuando los
interruptores están abiertos introducen un “0L”
(conectados a través de resistencias pull-down). De
acuerdo a las condiciones del enunciado, la lámpara
debe funcionar de acuerdo a la siguiente tabla de
verdad:
S1 (RA1 S0 (RA0)
SALIDA
(RB0)
Observaciones
0
0
1
1
0
1
0
1
0
1
1
0
Apagado
Encendido
Encendido
Apagado
Luis David Narváez
47. DESARROLLO
Como se mencionó anteriormente, en lenguaje C,
para realizar la lectura de un puerto se utiliza la
función
var= input_port_y ()
// Pone en var el valor de los pines del port_y
Según analizamos anteriormente, la sentencia case es
la herramienta más indicada a utilizarse en este caso.
Luis David Narváez
49. Enunciado:
Realizar un programa que permita visualizar, el
estado (on/off) de 5 switchs conectados en el
puerto B (<RB4:0>), mediante 5 diodos LED
conectados en el puerto D (<RD4:0>). La
conexión de los switchs se realizará empleando
resistencias pull-up, de tal forma que, cuando un
switch esté abierto el microcontrolador reciba un
“1L”. En esta posición el LED correspondiente
estará apagado.
Luis David Narváez
PRÁCTICA
50. DESARROLLO
En este circuito, los switchs, al estar en posición OFF
(abiertos), sus pines están conectados a través de la
resistencia de 10KΩ a 5V, dando un estado lógico alto
(1L), en esa posición el LED correspondiente debe estar
apagado, entonces se requiere invertir el valor leído en el
puerto B para sacar un estado lógico bajo (0L) que
apague el LED.
La misma lógica se aplicará en la posición ON (cerrado).
Luis David Narváez
52. Enunciado:
Se desea realizar un programa que cuente los
pulsos provenientes de un pulsador
(CONTADOR) conectado a RD1 y los visualice en
forma binaria en LEDs conectados al PORTB. El
número máximo de conteo será 12, momento en
el cual se detiene y activa una señal visual (LED) o
sonara (Zumbador, conectado al RD2) por 5 veces.
El reinicio del conteo se realiza presionando la
tecla REINICIO conectada al pin RD0
Luis David Narváez
PRÁCTICA
53. DESARROLLO
En este caso vamos a utilizar las funciones de
verificación del estado de un pin del puerto,
If (bit_test(var,3) || !bit_test(var,1)) // o
el bit 3 de var es 1 o el bit 1 es 0.
El mismo efecto se tiene si se emplea
if(input(pin_x) || !input(pin_y))
Para el incremento utilizaremos:
var++ // equivale a var=var+1
Luis David Narváez
54. DESARROLLO
Luis David Narváez
El programa se ha realizado de tal forma que el
incremento en el conteo se realiza solo si se suelta
la tecla de conteo.
Además se han utilizado unos pequeños retardos
para eliminar los rebotes.
Otra situación importante que hay que remarcar es
que el reinicio se sucede únicamente si el contador
ha llegado al valor máximo (12 decimal).
56. RETO:
Enunciado:
Realizar un contador binario tal que, con un
pulsador cuente en forma ascendente hasta llegar
a 255(Puede ser hasta 25 por pruebas) y luego
sea descendente. Un led conectado en RA3 se
encenderá cuando el contador este al máximo o
al mínimo (0 y 255).
Luis David Narváez
57. RETO:
Enunciado:
Realizar un contador binario con dos pulsadores,
uno ascendente hasta 255 y con otro
descendente hasta 0. El cambio de ascendente a
descendente se realiza en cualquier instante
según se presione el pulsador correspondiente.
Existirá además un botón de reinicio.
Luis David Narváez