Microcontroladores AVR y Arduino: Programación del microatmega328p en ensambl...
Tutorial proton part 4
1. PROYECTOS CON LED
Con este conocimiento previo de BASIC, ahora estamos en condiciones de empezar a
experimentar y escribir algunos programas. En este tutorial se usara el PIC 18f4550 y
PROTEUS. Se espera que haya sido instalado PROTON IDE, PROTEUS 7.6 y el PIC Kit 2
configurado para utilizar el PIC184550.
Casi todos los libros sobre la programación tienen como primer programa, el
denominado 'Hello world' esto es generalmente una forma de poner un simple texto
"hola mundo" en la pantalla o algún dispositivo de salida, en la forma más simple y
más fácil, para mostrar todo el ciclo, y para estar seguros de que todo está
funcionando.
En nuestro caso, usaremos la pantalla LCD más tarde, vamos a utilizar LEDS para
mostrar nuestro mensaje. Sólo queremos que todos los LEDS conectados en PORTD se
enciendan a la vez, lo que tenemos que hacer es escribir un 1 lógico a todos los bits
de PORTD, asegurando que todos los LEDS se enciendan.
Escribir este programa en BASIC PROTON, y guardarlo en su carpeta de proyectos PIC
según la extensión que más se le facilite, compilar el programa y cargarlo en su
microcontrolador.
Device=18F4550 'Selecciona PIC
XTAL 20 'Cristal de 20MHz
ALL_DIGITAL true 'Configura todas las Salidas Como Digitales
Output PORTD 'Poner todos los bits de PORTC como Salidas lo mismo que
TRISD=0
PORTD= %11111111 'Asigna todos los bits de PORTC a 1 lógico
End
2.
Ahora vamos a diseccionar este programa una instrucción a la vez, para conocer estos
comandos.
Device=18F4550
Esta línea informa al compilador que vamos a utilizar el microcontrolador 18F4550.
Desde el mapeo de memoria, la disponibilidad de dispositivos de los puertos, y los bits
del puerto, así como otros a bordo difieren entre microcontroladores, es importante
informar al compilador. Esta suele ser la primera línea en su programa. Cada
compilador, puede ser BASIC, C o el que sea que esté utilizando es importante
comprobar que el dispositivo en particular está siendo apoyado por su compilador. No
todos están respaldados por estos compiladores.
XTAL 20
Esta declaración informa al compilador la velocidad de operación del PIC. De modo que
el compilador puede calcular los diversos tipos de retrasos y baudios para la
comunicación serial.
ALL_DIGITAL true
Como ustedes saben hay número de entradas analógicas de estos dispositivos, y
hablamos de cómo habilitar y desactivarlas. Vamos a hablar más sobre este tema en la
sección adecuada. En los programas que no necesite entrada analógica y en su lugar
desea utilizar como E/S digitales, este comando deshabilita la entrada analógica en
todas las líneas, y las hace digital. Aunque en este programa no se va a utilizar
cualquier línea, para la grabación analógica.
Output PORTD
Como ya hemos discutido previamente, PORTD es bidireccional. Esto significa que
puede obtener datos desde el exterior, así como hacia el exterior. Esto se logra
mediante un seguimiento del registro TRISD. Este comando habilita a TRISD
internamente, para establecer todos los bits de PORTD como salida. Así que algún
valor para registrar en PORTD por el de software, se refleja inmediatamente en los
pines correspondientes, con esto, tenemos PORTD configurado como salida.
PORTD= %11111111
Ahora vamos a asignar un valor al registrar PORTD. El registro PORTD es de 8 bits, por
lo que puede establecer su valor al usar cualquier número de 0 a 255. % 11111111 es
el número binario. Usted podría escribir la misma instrucción como:
PORTD= 255
255 es el número decimal, equivalente a% 11111111, o podría utilizar el número
hexadecimal, como:
PORTD= $FF
Observe el signo $ antes del número hexadecimal, y un signo% antes del número
binario. Los compiladores varían en estos signos.
3.
End
Tan pronto como se establece el registro PORTD con este valor el efecto se refleja en
los pines. La declaración End crea un bucle sin fin, manteniendo el procesador
ocupado, por lo que no puede tomar ninguna acción hasta que el programa se
restablezca. Cualquiera que sea la salida fijada en los pines del puerto se mantendrá
fija, aún en la declaración final.
Ahora trate de cambiar el valor que se asigne a PORTD. Asignación de 0 a su vez,
todos los LED apagados, y un % 10101010 para LEDS alternados en ON y OFF. Espero
que esto sea bastante simple y claro.
Parpadeo de LED
En nuestro próximo proyecto, vamos a hacer que estos LED parpadeen. El parpadeo
tiene dos fases, una ON y OFF. Ambas fases tienen un período de tiempo determinado,
antes de cambiar a otro estado. Esto determina la frecuencia de parpadeo. Si los
tiempos de ON y OFF son los mismos, podemos decir que es una onda cuadrada. Para
ver estos pulsos, estamos usando LEDS a través de sentencias de bucle.
Device=18F4550 'seleccionar PIC
XTAL 20 ' frecuencia 20MHz
ALL_DIGITAL true 'Todas las líneas digitales
Output PORTD 'PORTD como salida TRISD=0
Loop:
PORTD= 255 'Asigna todos los bits de portD a 1 lógico
DelayMS 1000 'Dejar que los LEDS queden encendidos durante l segundo
PORTD= 0 'LEDs OFF
DelayMS 1000 'Mantenerlos en OFF por 1 Segundo
GoTo Loop 'Repita proceso
4.
Se declara una etiqueta llamada Loop, y una declaración correspondiente Goto Loop.
Las instrucciones entre estas dos declaraciones se repetirán indefinidamente.
PORTD = 255 todos los LEDS en ON. Sin embargo, antes de desactivarlos, tenemos
que imponer un retraso.
DelayMS 1000
Esta declaración da un retraso en mili-segundos del número. Así 1000ms de demora es
igual a 1 segundo, de manera similar 500ms retraso es medio segundo, y 100 ms es
1/10 de un segundo. También se pueden hacer retrasos en micro-segundos usando
DelayUs.
Los LEDS se encienden, y el procesador demora la activación en 1 segundo, entonces
PORTD = 0 apagará los LEDS. Una vez más, introducir un retraso, para mantenerlos
en la condición actual durante 1 segundo. Después del un retraso de 1segundo,
cuando testigos están apagados, el comando GOTO transfiere el control de nuevo a la
sentencia de bucle, que es seguido por PORTD = 255, que volverá a su vez LEDS ON.
El ciclo de ON / OFF con 1 segundo continuará para siempre
En otras palabras, podemos decir una onda cuadrada de 1 Hz se está generando en
todos los pines de PORTD.
Compilar el programa y cargarlo en el microcontrolador. Ejecutarlo, y todos los LED
deberían parpadear, precisamente, ON durante 1 segundo y OFF durante 1 segundo.
Ahora puede experimentar de varias maneras: Así que hemos visto que podemos
asignar distintos valores a PORTD, que se reflejan en LED para activar o desactivar
salidas del PIC 18F4550.
Hágalo usted mismo:
1. LED en ON durante medio segundo y OFF durante 1 segundo
2. LED activado durante 200ms y apagado durante 2 segundos
3. Crear una frecuencia de onda cuadrada de 10Hz.
4. Parpadeo de LED de dos veces, con un retraso de 500 ms seguidos por un
estado OFF de 2 segundos
Utilización de una Variable
Ahora vamos a tratar de mostrar algunos números binarios en los LED. Se creara una
variable, para asignarle un valor y mostrarlo en los LEDS. Eso es bastante simple.
¿Qué pasa si queremos que todos los valores de 0 a 255 sean mostrados en LEDS,
con un retraso de 200ms intervenir? Ciertamente, no es una buena idea escribir 255
bloques de código con cada uno con un valor diferente. Aquí el uso de variables y los
bucles es muy útil. Veamos este ejemplo:
5.
'EJEMPLO3.Bas
‘Mostrar los números binarios de 0 a 255 en los LED:
Device=18F4550 'Seleccionar PIC
XTAL 20 'Frecuencia de Cristal 20MHz
ALL_DIGITAL true 'Poner todas las líneas del PIC como digital
Output PORTD 'PORTD como salida al igual que TRISC=0
Dim x As Byte
Loop:
For x=0 To 255 'Iniciar un bucle controlado de la variable X
PORTC=x 'Asignar x a PORTC
DelayMS 200
Next x
GoTo Loop
En este programa hemos declarado una variable llamada X, que es una variable de
tamaño bytes. Para uso de un For... Next, el valor del bucle X se le permite variar de
0 a 255; cada vez, a PORTD se le asigna un valor de X, que inmediatamente se
muestra en los LEDs, un retraso 200ms se inserta de manera que podamos ver el
estado de los LED. Next X es el contador del valor de incremento de x por 1, todo este
proceso se repite cada vez con un nuevo valor de X, después de que el valor ha
llegado a 255, el bucle se termina y el control se transfiere a la declaración después de
X. La instrucción Goto Loop transfiere el control al bucle For, que se inicia de nuevo
desde 0 a 255.
Con este ejemplo se muestra dos cosas:
1. La utilidad del bucle, para variar el valor de una variable y luego usar la
variable dentro del bucle.
2. En segundo lugar el uso de dos bucles, uno (el For... Next) bucle está limitado a
255 repeticiones y el segundo bucle sin fin de mantener este ciclo, a partir de
Loop y Goto Loop .Estos ciclos se denominan "bucles anidados. Ahora aplique
de estas variaciones:
En la Comunicación del EJEMPLO3.Bas: For x=0 To 255 Step 2 ‘informa
compilador que se incrementan en 2.
Ejercicios Propuestos
1. Los números de inicio y final de 65 a 190
2. Inicio Números de 0 a 255 se incrementan en 2
3. Los números de inicio 0 a 255, cada intervalo de tiempo también se incrementa
por el mismo factor
4. Número de inicio y la disminución de 255 a 0
6. 5. Iniciar desde 0 a 255, todos los LEDs se mantienen en ON durante 2 segundos
después de decremento 255 a 0, mantenga todos los LEDs en OFF durante 2
segundos y luego repite el proceso
6. Iniciar 0 a 255 entonces los LED parpadean 5 veces y luego disminuir a 0
esperar 2 segundos y repetir
Utilización de un Bit por Puerto
Eso está muy bien, usted ha pasado por una serie de ejercicios, para asignar números
distintos a un puerto. Hasta ahora se han asignado valores a la totalidad del puerto,
que afectan a los 8 bits a la vez. En nuestros proyectos del mundo real la
totalidad del puerto prácticamente no se utiliza, de hecho bits individuales de un
puerto se adjuntan a los diferentes dispositivos. Por ejemplo, si el bit 0 del PORTD está
conectado a un relé de control del ventilador, y el bit 1 conectado a un relé de control
de segundo ventilador y el bit 3 adjunto al relevo calentador. Así que nos gustaría que
el control de los tres bits de forma individual. A pesar de que puede hacerse mediante
la asignación de número es mejor el control de bits individuales directamente sin
afectar a otros bits. Esto es aún más útil, cuando algunos de los bits en un puerto
actúan como insumos.
Un bit individual puede ser contemplado no sólo en un puerto, sino también en los
registros de funciones especiales, e incluso variables de memoria. Esto hace la
programación muy fácil y manejable. Los bits del puerto se hacen referencia mediante
la colocación de un período después del nombre del puerto y un número para indicar el
número de bits. Por ejemplo, para referirse al bit 7 (bit más alto) en PORTB, usamos
PORTB.7, observe que el número 7 indica el número de bit. Al igual que en el acceso
del registro de estado 0, por ejemplo, usamos STATUS.0 similar para hacer el bit 0 de
PORTB como entrada, con registro TRISB, TRISB.0 = 1.
Con el fin de establecer el bit de puertos de alta o baja, puede asignar un valor de 1 o
0. También puede utilizar el comando, High y Low hacen lo mismo. Los comandos
High and Low sólo funcionan en bits del registro del puerto y no en los bits de
variable general.
Device=18F4550
XTAL=20
ALL_DIGITAL=true
Output PORTD.7
Loop:
High PORTD.7
DelayMS 500
Low PORTD.7
DelayMS 500
GoTo Loop
7.
En este programa, como pueden ver, tenemos acceso directo al bit 7 de PORTD. Uso
de los comandos High y Low que alternan el bit seleccionado entre el 1 lógico y 0.
Comando Toggle
Protón tiene el comando Toggle que varía el valor de un bit. Este comando acepta un
pin de puerto, y los cambios de nivel opuesto. Así que si el bit es 1, es cambiado a 0 y
si se ha cambiado a 0 el 1.Este programa produce esencialmente los mismos
resultados, sin embargo mediante un comando de conmutación.
8.
Device=18F4550
XTAL=20
ALL_DIGITAL=true
Output PORTD.7
High potd.7
loop:
DelayMS 500
Toggle PORTD.7
GoTo loop
Cambio de Operadores
Los Bits pueden ser transferidos dentro de una variable o un puerto a la izquierda o la
derecha, como las posiciones. El Desplazamiento de los bits hacia la izquierda tiene un
efecto matemático de multiplicar por 2, y el desplazamiento de los bits a la derecha se
divide por defecto en 2 .El Desplazamiento a la izquierda se indica con operador << y
desplazamiento a la derecha por operador >>.
Device=18F4550
XTAL=20
ALL_DIGITAL=true
Output PORTD
PORTD=0
Loop:
High PORTD.0
Dim x As Byte
For x=0 To 7
DelayMS 500
PORTD=PORTD << 1
Next x
DelayMS 500
GoTo Loop
Este ejemplo se carga el bit 0 del PORTD en alto, entonces después de cada 500ms
desplaza los bits a la izquierda, los bits de 0 lógico se colocan a la derecha, el bit
menos significativo, cuando se desplazan bits.
Operaciones
AND, OR, XOR y NOT son las puertas lógicas, sin embargo, también se aplican en la
misma lógica dentro del software. Dos variables, o los números pueden ser
comparados entre sí mediante estos operadores lógicos y el resultado se utiliza
directamente para tomar una decisión, como en los bucles IF, While o almacenada en
otra variable para su posterior uso en el programa. Estos los ejemplos concretos se
darán en las secciones pertinentes del tutorial.