Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Capitulo 2 Entradas y Salidas
Capitulo 2 Entradas y Salidas
slo lectura y no es voltil. Las diferentes tecnologas para realizar las memorias de slo lectura
son: ROM, EPROM, EEPROM, OTP, FLASH. Tanto la memoria RAM como las memorias ROM son de
acceso aleatorio, pero la costumbre ha dejado el nombre de RAM para las memorias de lectura y
escritura. El trmino acceso aleatorio se refiere a que el tiempo necesario para localizar un dato
no depende del lugar de la memoria donde este almacenado. En las memorias de acceso
secuencial, en cambio, cuando ms alejado est un dato de la posicin a la que se ha accedido por
ltima vez, ms se tarda en localizarlo.
La memoria ROM se emplea para almacenar permanentemente el programa que debe de ejecutar
el microcontrolador. En la memora RAM se almacenan temporalmente los datos con los que se
trabaja el programa. Un nmero creciente de microcontroladores dispone de alguna memoria no
voltil de tipo EEPROM para almacenar datos fijos o que slo sean cambiados espordicamente.
La cantidad de memoria ROM disponible es normalmente muy superior a la cantidad de memoria
RAM. Esto obedece a dos razones. La primera es que la mayora de las aplicaciones requieren
programas que manejan pocos datos. La segunda razn es que la memoria RAM ocupa mucho ms
espacio en el circuito integrado que la memoria ROM, de modo que es mucho ms costosa que
est.
Las entradas y salidas son particularmente importantes en los microcontroladores, pues a travs
de ellas el microcontrolador interacciona con el exterior. Forman parte de las entradas y salidas los
puertos paralelo y serie, los temporizadores y la gestin de las interrupciones. El microcontrolador
puede incluir entradas y salidas analgicas asociadas a convertidores A/D y D/A, tiene particular
importancia los recursos que garantizan un funcionamiento seguro del microcontrolador, como el
denominado perro guardin.
Un microcontrolador combina los recursos fundamentales disponibles en una microcomputadora,
es decir, la unidad central de procesamiento (CPU), la memoria y los recursos de entrada salida, en
un nico circuito integrado. En la siguiente figura se muestra el diagrama de bloques de un
microcontrolador.
La instruccin CLR afecta los 'flag', mientras que la instruccin SER no lo hace, a pesar de
que parecen ser instrucciones complementarias (dejar todos los bits en 1, y dejar todos los
bits en 0 respectivamente).
Los cdigos de operacin 0x95C8 y 0x9004 hacen exactamente lo mismo (LPM).
Como los PIC, tiene una comunidad de seguidores (ejemplificadas por el foro de internet
AVRFreaks), principalmente debido a la existencia de herramientas de desarrollo gratuitas o de
bajo costo. Estos microcontroladores estn soportados por tarjetas de desarrollo de costo
razonable, capaces de descargar el cdigo al microcontrolador, y por una versin de las
herramientas GNU. Esto ltimo es posible por su uniformidad en el acceso al espacio de memoria,
propiedad de la que carecen los procesadores de memoria segmentada o por bancos, como el PIC
o el 8051 y sus derivados.
2.2 Componentes bsicos del microcontrolador
El microcontrolador AVR requiere de pocos componentes externos para comenzar a utilizarlo.
Estos componentes son el circuito de reset y el circuito de reloj. Inclusive pueden llegar a ser
opcionales en algunos microcontroladores.
2.2.1 Reloj.
Para el funcionamiento del AVR, se requiere una fuente de pulsos de reloj, la cual se encargue de
suministrar al AVR con una frecuencia de trabajo al reloj del CPU del microcontrolador. Este reloj
del CPU est ligado a los mdulos de los registros de propsito general, registro de estado,
registros de memoria de datos entre otros. Al detener el reloj del CPU, se inhibe al ncleo para
realizar operaciones o clculos.
Una fuente de reloj externa confiable, es un cristal o un oscilador. La conexin de un cristal como
fuente de reloj del AVR se muestra en la siguiente figura.
El microcontrolador atmega48, tiene la caracterstica de que puede utilizar una fuente de reloj
interna, pre calibrado para frecuencia de 8 MHZ, y la posibilidad de utilizar un divisor de reloj
entre 8, lo que resulta en una frecuencia de trabajo de 1 MHZ.
2.2.2 Reset.
El reset es una accin con la cual se inicia el trabajo de los microprocesadores y
microcontroladores. Esta accin se ejecuta cuando se aplica una seal denominada reset- a una
terminal, designado tambin como reset. El efecto prctico de la seal es poner el contador de
programa (PC) en un valor predeterminado (por ejemplo PC = 0), haciendo as que el
microprocesador o microcontrolador comience a ejecutar las instrucciones que estn a partir de
esa posicin de memoria apuntada por el AVR.
El circuito de reset es aquel que permite regresar todos los registros de entradas y salidas a sus
valores inciales y empezar a ejecutar el programa en el vector del reset.
Cuando una fuente de reset se activa, todos los puertos de entradas y salidas regresan
inmediatamente a sus estados inciales; sin requerir ningn ciclo de reloj.
Una vez que todas las fuentes de reset son desactivadas, transcurre un ciclo de espera retardo-,
que ampla la duracin del reset interno, permitiendo que las fuentes de poder almacene un nivel
estable antes de comenzar con las operaciones regulares. Este tiempo de espera puede ser
seleccionado por el usuario a travs de los bits fusibles CKSEL. El circuito bsico a reset y un cristal
externo es el siguiente:
Figura 2.2 Diagrama esquemtico de un pin de entrada y salida del microcontrolador AVR
Cantidad
cantidad
1
Cristal de cuarzo de 4 MHZ.
2
Capacitores de 22 pf
1
Interruptor tipo push button
1
Resistor de 10K
1
Resistor de 1K
4
Resistores de 220
4
Diodos emisores de luz LEDs
1
Programador de microcontroladores
1
Microcontrolador atmega48
1
Fuente de alimentacin de 5 volts
Pinzas, protoboard, cable telefnico
2.4.3 Desarrollo.
Arme el circuito de la siguiente figura.
2.4.4 Cdigo.
//_____________inicio de programa
#include <avr/io.h>
#define step1 8
#define step2 4
#define step3 2
#define step4 1
void config_io(void) {
DDRC=0x0F;
DDRD=0b11111011;
PORTD=_BV(PD2);
}
void retardo (void) {
int16_t i;
//funcin de retardo
//declaracin de entero de 16 bits i
retardo();
PORTC=step2;
retardo();
PORTC=step3;
retardo();
PORTC=step4;
retardo();
}
void secuencia2 (void){
PORTC=step4;
retardo();
PORTC=step3;
retardo();
PORTC=step2;
retardo();
PORTC=step1;
retardo();
}
void main(void){
//funcin principal
config_io();
while(1){
//ciclo infinito
//se va a la secuencia 1
break;
//para la secuencia
case(0):
}
}
}
//se va a la secuencia 2
break;
//para la secuencia
//___________fin de programa
int
PASOS;
/* DECLARA VARIABLE */
int main(void)
{
PORTD=_BV(PD2);
DDRC= 0x0F;
while(1)
{
if ((PIND & _BV(PD2)) == _BV(PD2))
PASOS++;
else
PASOS--;
asm("nop");
if (PASOS>4)
PASOS=1;
if (PASOS<=0)
PASOS=4;
for (int i = 0 ; i < 30000 ; i++);
switch (PASOS)
{
case(1): PORTC=PASO_1;
break;
case(2): PORTC=PASO_2;
break;
case(3): PORTC=PASO_3;
break;
case(4): PORTC=PASO_4;
break;
default: break;
}
Parpadeo de un LED
Descripcin.
En este programa se maneja el puerto para hacer parpadear un LED, en este caso se realiza el
parpadeo a travs de dos mtodos distintos de programacin, utilizando todo el puerto o slo un
bit del mismo, se selecciona el pin deseado el cual se conecta a un LED en el cual se visualiza el
parpadeo.
Diagrama Esquemtico.
Materiales.
1 LED.
1 Resistores de 220 Ohms.
1 Microcontrolador ATmega48.
Introduccin.
El microcontrolador tiene varios puertos de los cuales se puede hacer uso, estos puertos se
pueden configurar como se quiera, como entrada o como salida, para poder hacer esto es
necesario escribir en los registros del puerto para darle las instrucciones necesarias. Existen tres
principales formas de controlar los puertos, si se toma como ejemplo el puerto B.
DDR.
Para obtener que el puerto B se comporte como entrada, como salida o ambos, es necesario
indicarle esto en el DDR, este registro no activara ni desactivara ningn pin del microcontrolador,
simplemente le indicara al puerto si este ser entrada o salida.
Para indicarle al DDR si el puerto sea de entrada o salida, el 1 indica salida, y el 0 entrada, se le
puede escribir como hexadecimal, decimal, o binario, por ejemplo, si se desea que todos los bits
del puerto sean salidas se puede escribir como sigue:
DDRB=0xFF;
DDRB=255;
DDRB=0b11111111;
//como hexadecimal.
//como decimal.
//como binario.
//como hexadecimal.
//como decimal.
//como binario.
Se puede escribir en cualquiera de los tres tipos (binario hexadecimal y decimal), en todos los
registros.
PORT.
El registro PORT controla la salida del puerto, este se emplea en caso de que el DDR haya sido
seleccionado como salida, un 1 en el PORT indica un nivel alto en el puerto como salida, un 0
indica que el pin esta en nivel bajo. A continuacin se muestran varias configuraciones de ejemplo
para el PORT:
PORTB=0xFF;
PORTB=0x00;
PORTB=0x03;
PIN.
El PIN es un registro de lectura (es conveniente hacer notar en la imagen del registro donde dice
Read/Write, todos son R), este registro presenta un 1 si a un pin del microcontrolador se le est
alimentando externamente, y un cero si esta en nivel bajo de voltaje.
En este caso el valor del PIN se le puede asignar a una variable la cual guardara el valor de la
misma, al momento de ejecutar la instruccin por ejemplo.
valor =PINB;
Programa en C.
#include <avr/io.h>
#include <util/delay.h>
Esta librera es necesaria para poder utilizar los retardos de tiempo requeridos.
int main (void){
El main es la funcin principal, es donde el programa inicia, siempre es necesario declarar la
funcin main.
DDRB=0xFF;
Los puertos del micro contienen tres registros los cuales son, el DDR el PORT y el PIN, en este caso
se hace uso del registro DDR, ste es el que determina el uso que se le va a dar al puerto del
microcontrolador, si se le asigna un uno es de salida, y un cero es de entrada.
En este caso 0xFF es la nomenclatura para indicar un valor hexadecimal, si se expresa en binario,
este se escribe 0b11111111, en donde se puede ver claramente que los 8 bits del DDR estn
activados como salidas.
while(1){
El ciclo while, es un ciclo que ejecuta todas las instrucciones que se encuentran dentro de sus
corchetes, siempre y cuando lo que este dentro del parntesis se cumpla, en este caso el 1 es lo
mismo que TRUE, por lo tanto, siempre se cumple y se ejecutaran cclicamente las instrucciones
dentro del while. Esto se hace con la intencin de que el programa nunca se detenga, y siempre
repita lo mismo.
PORTB=0x01;
_delay_ms(250);
PORTB=0x00;
_delay_ms(250);
Una manera de hacer parpadear un LED es activando y desactivando la fuente, en este caso, la
fuente de alimentacin del mismo viene del bit 0 o el primero pin del puerto B, como se puede ver
en el cdigo, se le asigna un 0x01, se espera 250 milisegundos, se le asigna 0x00 y vuelve a esperar
el mismo tiempo.
Estas instrucciones manejan a los 8 bits del puerto, la tabla a continuacin describe el cdigo.
PORTB|=_BV(PB0);
_delay_ms(250);
PORTB&=~(_BV(PB0));
_delay_ms(250);
En este caso las instrucciones de activar y desactivar el pin del puerto, son algo ms complejas, ya
que se separa y se activa o desactiva el bit 0 del puerto B.
Prcticamente el cdigo hace lo mismo, pero la principal diferencia y ventaja, es que al usar este
cdigo, se manejan independiente los bits del puerto, esto es, que al aislar los bits, se puede
trabajar con ellos de manera que si se cambia a uno, no afecte al otro. Esto se observa en la
siguiente tabla.
Diagrama Esquemtico.
Materiales.
1
1
1
1
LED.
Resistor de 220 Ohms.
Push Button.
Resistor de 10Kohms.
1 Microcontrolador ATmega48.
Introduccin.
while
Como se puede ver en el diagrama de flujo, el ciclo while, ejecuta toda instruccin dentro del
mismo, siempre y cuando la condicin se cumpla. La nomenclatura del ciclo while es:
while("condicin") {
instruccin A;
instruccin B;
}
Por lo tanto, siempre y cuando la condicin se cumpla, las instrucciones se ejecutaran, en caso de
que la condicin no se cumpla, se brinca las instrucciones y el programa continua.
if else
En el if/else, tambin hay una condicin y si esta se cumple ejecuta el proceso o las instrucciones
indicadas dentro de los corchetes, en caso de que no se cumpla es opcional escribir el "else" el
cual ejecutara un proceso, en caso de que la condicin haya sido falsa.
Programa en C.
#include <avr/io.h>
#include <util/delay.h>
}
}
}
Se incluye la librera avr/io que contiene la informacin de las entradas y salidas del
microcontrolador.
#include <util/delay.h>
Esta librera es necesaria para poder utilizar los retardos de tiempo.
int main (void){
El main es la funcin principal, es donde el programa inicia, siempre es necesario declarar la
funcin main.
DDRB=0x00;
DDRD=0xFF;
Se declara el puerto B como entrada y el puerto D como salida.
while(1){
El 1 es igual a verdadero, el ciclo while nunca se termina.
if (PINB==0x01){
Al emplear el if la condicin tiene que ir dentro de parntesis, y en este caso como se puede ver se
usa doble smbolo de igual para diferenciarlo de cuando se le asigna un valor a una variable.
variable =14;
variable ==14;
Ntese que se est utilizando PINB, el cual pertenece al puerto B, el mismo que se declaro como
salida en el DDR. Esta condicin corresponde al Push Button conectado en el pin del puerto B.
PORTD=0x01;
_delay_ms(1000);
Instruccin de retardo de 1000 milisegundos, el valor dentro de los parntesis puede ser ajustado
como se requiera.
PORTD=0x00;
Se desactivan todos los pines del puerto D.