Buscar este blog

Mostrando entradas con la etiqueta Arquitectura. Mostrar todas las entradas
Mostrando entradas con la etiqueta Arquitectura. Mostrar todas las entradas

domingo, 4 de octubre de 2015

Como programar un microcontrolador parte 3 (Programando el pic 18F4550)

0 comentarios

En el post anterior empezamos a ver algunas funciones basicas para emplear el pic 18f4550, estas funciones son como configurar los puertos de E/S.

En este capitulo vamos a seguir programando el puerto como entradas para realizar algunas aplicaciones basicas en el manejo del microcontrolador Pic18F4550.


Para programar el puerto como entradas del  pic18f4550 se comentó que el registro encargado era el TRISx y que tenia que cargarse con un uno lógico para ser entrada.

Por ejemplo si queremos configurar el puerto B como entrada tenemos que escribir lo siguiente:

TRISB = 0XFF;

Y si solo queremos emplear algunas terminales se debe escribir el uno donde se requiera, por ejemplo para configurar la terminal (3, 4 y la 7 por decir algo) como entradas tendriamos que el numero en binario seria:

1001 1000 donde el bit de mas peso es el de la izquierda y el de menor peso es el de la derecha.

Pero eso seria en binario para hexadecimal seria :   0x98
Por lo que quedaria asi:

TRISB = 0X98 // para las terminales 3,4 y 7

Y si solo empleamos la primer terminal  en binario seria: 0000 0001
y en hexadecimal : 0X01

Por lo que quedaria asi:

TRISB = 0X01;


Ya con eso y lo visto en el post anterior se puede generar el siguiente enunciado.

Con el microcontrolador pic18f4550 configure la terminal 1 del puerto B como entrada y la terminal 7 del puerto A como salida  que tendra un led conectado y que por medio de un botón el cual este conectado a la terminal 1 del puerto B, cuando se oprima el boton se encienda el led y cuando este sin oprimir el boton el led se encuentre apagado.



#include <p18f4550.h> // Incluye procesador

void main (void)
{

TRISB = 0X01;// Configurar la terminal 1 del puerto B como entrada
PORTB=0X00;// Puerto B en ceros
TRISA = 0x00;// Puerto A como salida
PORTA=0x00;// Puerto A en ceros

// configura pines como digitales
ADCON1 |= 0X0F;

while(1)
{
  if (PORTB==0x01) // Si la terminal 1 tiene un 1
  PORTA = 0x80;// La terminal 7 del puerto A se pone un uno
  else // Si no
  PORTA = 0x00; // Puerto A apagado.
}
}

miércoles, 22 de octubre de 2014

Como programar un microcontrolador parte 2

0 comentarios
En esta segunda parte de como programar un microcontrolador vamos empezar a ejemplificar con un microcontrolador en particular puesto que lo dicho en la primera parte se explico que se necesita saber de cualquier microcontrolador en general.

Algunos colegas electronicos recomiendan que para aprender a programar un microcontrolador se debe de empezar por uno sencillo un ejemplo de esto puede ser el pic16f84 de la compañia de microchip, este microcontrolado es considerado de gama baja por sus limitadas prestaciones (numero de pines, perifericos, instrucciones reducidas, etc...), pero por experiencia propia les podria decir que no importa con que microcontrolador empiezen a programar todos basicamente todos se programan con la misma idea, solo cambian las instrucciones, la estructura de los programas.

Como les menciono parrafos arriba podemos programar cualquiera (Pic's, texas instruments, freescale) pero en los siguientes post se enseñara a programar con el pic18f4550 de gama media (temas basicos) y despues se enseñara a programar el msp430  de texas instruments y haremos una comparacion para que se den cuenta en que cambian las metodologias en cada microcontrolador de diferentes compañias, tambien se dara unos ejemplos de como programar los avr's de ATMEL para completar este pequeño cursillo, si despues se deseara profundizar en cualquier microcontrolador ya sabrian como hacerlo. Asi que empezemos con el pic 18f4550.

Empezando a programar el pic18f4550

Antes que nada para empezar a programar el pic en particular se necesita saber en que lenguaje se programara dicho microcontrolador. Para el pic18f4550 existen dos lenguajes en particular para programarlos (ensamblador y C), por "simplicidad" y no meternos tanto en la arquitectura de los microcontroladores en particular ya que lo que nos interesa en si es solo programarlos, es decir, ver al microcontrolador como una caja negra solamente, se optara en programarlo en lenguaje C y esto ademas es una gran ventaja ya que es el lenguaja preferido por su gran flexibilidad. El lenguaje ensamblador tambien es muy importante pero este requiere de un curso mas extenso y para ejemplificarlo con un microcontrolador en particular, pero la finalidad de este curso es mostrar como programar cualquier microcontolador con la misma idea por eso el lenguaje C es el ideal ya que lo unico que cambiaria seria los mnemonicos de cada microcontrolador.

Para empezar se necesita descargarse el IDE de MPLAB del siguiente link MPLAB puede descargar el IDE de MPLAB segun la version que soporte su computadora. Como por ejemplo yo tengo la version 8.92 para windows en 32 bits.Ustedes pueden elegir la version que requieran para el sistema operativo que usen, en nada cambiara la version para seguir este tutorial.

Una vez que instalen el MPLAB y abran el IDE les aparecera la siguiente imagen.





Lo que tienen que hacer para crear un nuevo proyecto es lo siguiente:

1) Ir a la pestaña Project --> Set Lenguage Tool Locations abrir esta pestaña
2)Se abrira una pestaña y buscar la parte dice Microchip C18 Toolsuite
3)En Executables ver que los 4 ejecutables correspondientes a C18 se encuentre en la direccion adecuada o se encuentren añanidos. En dado que no se encuentre disponible debes descargar la suite de C18 para empezar a programar y añadirlo en la direccion correspondiente.
4) Una vez verificado lo anterior en la pestaña de Project --> Project Wizard
5) Aparecera una ventana que nos dira WELCOME le daremos en siguiente
6) Seleccionaremos Device pic18f4550 y siguiente
7)Nos aparecera una nueva ventana y seleccionaremos Microchip C18 Toolsuite siguiente
8)Nos aparecera una ventana que nos pedira un nombre para nuestro proyecto, en este caso hay que darle primero en Browse para crear una nueva carpeta en la direccion que nosotros queramos. Creamos la carpeta y dentro de esa carpeta añadiremos un nombre nuevo de proyecto que terminara con .mcp que por default MPLAB lo añade al nombre que elijamos por lo que no es necesario porne la extencion .mcp damos en guarda y pondremos siguiente a esa ventana.
9) La siguiente ventana solo muestra si queremos añadir algun archivo en nuestro caso no es necesario por lo que le daremos en siguiente.
10) Ya por ultimo aparecera una nueva ventana que bastara darle clic en finalizar.

Ya con esto nos aparecera nuestro espacio de trabajo.



Teniendo nuestro espacio de trabaja nos enfocaremos en escribir nuestro primer programa.
Para esto lo primero que vamos a explicar como utilizar los puertos de entrada/salida del microcontrolador.


Lo principal y primero que tenemos que escribir en nuestro programa es incluir una directiva que le diga al programa que microcontrolador vamos a emplear en nuestro caso es el pic18f4550.


#include <p18f4550.h> // Incluye directiva pic a usar


Lo siguiente que vamos a escribir es el cuerpo del programa para esto se va a emplear el siguiente codigo.


void main (void)
{

//Programa a escribir
}

Este codigo nos indica el programa principal. Dentro del programa principal vamos a escribir las instrucciones que queremos que haga el microcontrolador.

Lo siguiente que vamos a escribir es la configuracion de los puertos I/O  para esto escribimos
con los registros TRISA   y PORTA.

Con TRISx configuraremos los puertos ya sea como entrada o salida. la "x" nos indica el puerto que
emplearemos. Por ejemplo si queremos emplear el puerto A solo necesitamos escribir "TRISA" y si
queremos emplear el puerto C escribimos "TRISC".

Los puertos se pueden configurar de dos formas (como entrada o como salida). Para configurarlo
como entrada tenemos que escribir un 1 en el registro TRISx y para configurarlo como salida se tiene
que escribir un 0 en el registro TRISx.

Como en este ejemplo vamos a hacer parpadear un led del puerto A de una sola terminal (ya que
todo el puerto tiene 8 terminales) debemos escribir el siguiente codigo.

TRISA = 0XFE; // Aqui le decimos que la primera terminal del puerto A esta como salida.


Lo siguiente que debemos configurar es que si inicialmente el led va estar apagado o encendido para
este se configura el registro PORTx. Como en el caso anterior la "x" indica el puerto que queremos
configurar como es el puerto A escribimos PORTA, si fuera el puerto D se escribiría PORTD. Para
poner el puerto en bajo "apagado" se escribe en el registro PORTx un 0 y para ponerlo en alto
escribimos un 1 "encendido". El código quedaría de la siguiente forma.

PORTA= 0x00; // Inicialmente el led estara apagado.


Lo siguiente que hay que configurar es si los puertos van a funcionar como analogicos o digitales
en nuestro caso es obvio que serán digitales para esto se emplea el registro ADCON1 ya que
inicialmente los puertos están configurados como analógicos para esto emplearemos el siguiente
código.


ADCON1 |= 0x0f; // Configura las terminales como digitales


Mas adelante se explicara mas detalladamente este registro ADCON1.

Enseguida escribiremos nuestra primera condición en el programa ya que lo que haremos es hacer
prender y apagar nuestro led indefinidamente emplearemos un bucle infinito para esto la mejor
opción es la condicional "while". Con while las instrucciones que se localicen dentro se ejecutaran
hasta que la condición sea 0 pero en nuestro caso lo haremos indefinidamente por lo que bastara
poner un 1 dentro de la condición así la condición siempre sera diferente de 0 por lo que las
instrucciones se ejecutaran indefinidamente.


while(1)
{

//Todo lo que se encuentre dentro se ejecutara una y otra vez.

}


Dentro de la condicional while ejecutaremos las instrucciones de encendido y apagado por lo que
escribiremos el siguiente código.


PORTA = 0x01;
Delay10KTCYx (1000);
PORTA = 0x00;
Delay10KTCYx (1000);

Primero encenderemos el led con la instrucción PORTA =0x01;
Lo segundo es esperar 1 segundo que es el tiempo que el led estará encendido esto se hace con la
instrucción Delay10KTCYx (1000);

Donde el Delay10KTCYx(); es una función de C18 cuya libreria es la siguiente:

delays.h

Lo tercero es apagar el led con la instruccion PORTA= 0x00;
Lo cuarto y ultimo es esperar otro segundo que es el tiempo que el led permanecera apagado esto
se logra con la instruccion Delay10KTCYx (1000);

Apartir de aqui las instrucciones se volveran a ejecutar desde un principio. Encendiendo el led, esperando 1 segundo, apagando el led y volver a esperar otro segundo.

Por ultimo nuestro programa deberá quedar de la siguiente manera.


#include <p18f4550.h> // Incluye directiva pic a usar
#include <delays.h>//libreria del retardo
void main (void)
{

TRISA = 0x00; // Configurar puerto A como salida
PORTA=0x00; // Se pone el puerto A  apagado

// configura pines como digitales
ADCON1 |= 0x0f;

while(1)
{
PORTA = 0xf0;// Cuatro ultimos bits encendidos
Delay10KTCYx (1000);// Retardo
PORTA = 0x00;// Todo el  puerto A apagado
Delay10KTCYx (1000);// Retardo

}
}

En la siguiente parte veremos como generar un barrido de leds y como controlar un servomotor con
tan solo lo explicado en este capitulo.

sábado, 18 de octubre de 2014

Sistema minimo con microprocesador Z80 capitulo 2

1 comentarios
Continuamos en el armado del sistema minimo con microprocesador Z80. El siguiente paso para nuestro sistema minimo es agregarle la memoria EEPROM.

Memoria de programa (EEPROM)

La memoria EEPROM ya se habia comentado  en un post anterior ( Manejo de memoria EEPROM ). Esta memoria EEPROM es la encargada de guardar las instrucciones que le vamos a dar al microprocesador Z80 para que realice dicha funcion. La memoria EEPROM se conecta en las terminales de datos, en las terminales de direccion y control del Z80 que despues el microprocesador  leerá en forma secuencial y ejecutará las instrucciones guardadas en la memoria.


La memoria EEPROM sera programada en forma independiente al microprocesador Z80. Dentro de la memoria  y en cada localidad se almacenara las instrucciones en forma binaria. La forma en que interactua la memoria EEPROM y el Z80 es la siguiente: El microprocesador con su contador de programa direcciona la localidad de memoria, lee la informacion en ella, la decodifica, la ejecuta, el contador de programa se incrementa y se lee una nueva direccion de memoria.

La conexión de nuestro sistema minimo quedara de la siguiente manera.




En nuestro siguiente post se añadira un nuevo elemento al sistema minimo para las lineas de control ademas se hara un programa simple para monstrar el funcionamiento del sistema minimo con el Z80.

domingo, 10 de agosto de 2014

Sistema minimo con microprocesador Z80 capitulo 1

5 comentarios
Los microprocesadores son dispositivos digitales encargados de ejecutar los programas que se almacenan en una unidad de memoria. El microprocesador solo puede ejecutar instrucciones de bajo nivel ( ceros y unos) realizando operaciones aritmeticas y logicas, accediendo a memoria ó mover datos de registros a registros.

Los microprocesadores estan constituidos esencialmente de registros, unidad de control, ALU (unidad logica aritmetica), bus de datos, bus de direcciones etc...

El microprocesador que vamos a estar estudiando en este post es el viejo y famoso Z80 con este microprocesador vamos a implementar el armado de un sistema minimo que en realidad es una computadora completa. El sistema minimo que vamos a implementar se basa en la arquitectura Von Neumann el cual consta de reloj, un microprocesador, memoria ROM de programa, memoria RAM de datos, puertos de entrada y salida y dispositivos perifericos. El microprocesador puede ejecutar programas en ensamblador e interactuar con dispositivos externos o con el usuario.

El diagrama a bloques del sistema minimo a armar es el siguiente.


Antes de implementar el sistema minimo debemos advertir  que los dispositivos empleados son de tecnologia CMOS y NMOS por lo que son sensibles a las descargas de voltaje y podria ocacionar daños a los dispositivos para esto se sugiere al usuario descargarse previamente sobre algun objeto metalico y tomar los dispositivos por los extremos y no por las terminales, tambien se puede sugerir tener un brazalete especial con el fin de estar siempre aterrizado.

Para empezar ha armar el sistema minimo basado en el microprocesador Z80 nos basaremos en varios capitulos ya que el armado final resulta ser un circuito moderadamente grande y que nos llevara algun tiempo armarlo. Para este capitulo empezaremos armando el circuito de reloj y el circuito de reset.

Generador de reloj para Z80

El generador de reloj para el sistema minimo es el encargado de proporcionar una señal digital con una frecuencia determinada por el microprocesador en cuestion. Otras caracteristicas importantes, tales como el ciclo de trabajo  que es el tiempo en que la señal esta en estado alto (th) en relacion al periodo de la señal (T) tal y como se muestra a continuacion.

    


La señal generada por el reloj actua como sincronia para el microprocesador el cual ejecuta las instrucciones de programas e interactua con los elementos que conforman el sistema tales como la memoria ROM y  RAM las entradas/salidas digitales, a cado pulso de reloj que se va generando se va ejecutando las instrucciones en el microprocesador.

Una forma para generar la señal de reloj es por medio de compuertas logicas retroalimentadas usando resistencias y capacitores como se muestra en la figura utilizando compuertas NOT.




Aunque tambien se puede emplear cristales  de cuarzo para tener mayor estabilidad en la frecuencia. En la siguiente figura se muestra un circuito que utiliza un cristal de cuarzo a 4 Mhz garantizando frecuencias mas estables.


Otro generador de reloj que se puede implementar es el circuito temporizador 8224 que proporciona dos fases de reloj, una señal READY en combinacion con el segundo reloj y la propia señal READY.
Otro circuito integrado que se puede utilizar es el 8284 el cual proporciona la temporizacion y dos señales de control para los microprocesadores. El circuito del 8284 es el siguiente.


En este capitulo se va sugerir el armado del generador de reloj utilizando las compuertas NOT por lo que acontinuacion se dara la lista de materiales a requerir.

2 resistencias de 10kilo ohms a 1/4 watt
1 capacitor de 0.001 uf
1 capacitor de 0.01 uf
1 capacitor 470 uf
1 circuito integrado 74ls04
1 cristal de 4Mhz.

Se sugiere armar alguno de los dos circuitos mostrados con el material dado. El tercer circuito se sugiere armar solo si requiere mayor presicion.

Recuerde alimentar el circuito integrado con 5 volts.


Circuito de auto reset y el  microprocesador Z80


En el microprocesador Z80 la señal de reset  se utiliza para llevar al microprocesador a un estado conocido. Esta señal de reset inicia al Z80 de forma interna  del siguiente modo.

Limpia el Flip Flop asociado con las interrupciones mascarables.
Limpia el registro de contador de programa "PC"  y los registros de interrupcion "l"  y de refresco de memoria "R".
Selecciona el modo "O" de interrupcion mascarable.
Deshabilita las interrupciones mascarables.

De forma externa la señal de reset se refleja en el estado de algunas de sus señales como se indica.

El bus de direcciones y de datos se pone en alta impedancia mientras la señal de reset esta activa.
Todas las señales de salida del bus de control se mantienen  inactivas. 

Para que la inicializacion sea exitosa la señal de reset debe de mantenerse en bajo por lo menos 3 ciclos completos de reloj. El circuito de reset se implementa por medio de una malla "RC" que mantiene un cero logico mientras el capacitor se encuentra descargado despues de 5t (constantes de tiempo), el capacitor es carga 99.3% del voltaje de alimentacion, lo que produce que la señal de reset pase a inactiva. Para que la señal de reset se mantega en bajo los 3 ciclos  de reloj se requiere que el voltaje de carga  del capacitor se mantega por debajo del voltaje "Vil" considerado como cero logico.



La carga del capacitor esta dada por

 
 Por lo que el tiempo necesario para alcancar Vil es de


 Si se cumplen estas condiciones el microprocesador Z80 mantendra el tiempo necesario para el auto reset al alimentar el circuito completo.

A medida el microprocesador se requerira resetearlo de forma manual por lo que es conveniente agregarle un push button en paralelo al capacitor para poderlo descargar y lograr la condicion en estado bajo mientras el push button este oprimido cuando este se deje de pulsar el capacitor volvera a cargarse y regresara al estado alto a su condicion previa del reset.


A continuacion se vera como implementar el circuito de reset y el microprocesador Z80, el material necesario para implementar esta parte del circuito es el siguiente.

1 capacitor de 0.1 uf
1 resistencia de 1 kilo ohm a 1/4 watt
1 push button normalmente abierto
1 diodo 1n4001
1 microprocesador Z80

El diagrama siguiente es como se debe implementar el armado del circuito.

 

En el siguiente diagrama se ve ya acoplado el circuito de reloj que armamos previamente.





En el siguiente capitulo proseguiremos el armado de nuestro sistema minimo explicaremos y adicionaremos la memoria EEPROM o de programa.

Electronica facilita