Mostrando entradas con la etiqueta vuestras dudas. Mostrar todas las entradas
Mostrando entradas con la etiqueta vuestras dudas. Mostrar todas las entradas

martes, 24 de febrero de 2009

sábado, 28 de junio de 2008

¿Qué son los registros DPL y DPH?

Una pregunta de Francisco:

"Hola Luis: Tengo unas dudas respecto al problema de ensamblador de Junio 2006. Copio el programa literalmente aqui:

org 5000h
Etiqueta1:
MOV R0,30h
Etiqueta2:
MOV DPL, 31h
MOV DPH,32h
MOVX A,@DPTR
INC DPTR
MOV 31h,DPL
MOV 32h,DPH
MOV DPL,33h
MOV DPH,34h
MOVX @DPTR,A
INC DPTR
MOV 33h,DPL
MOV 34h,DPH
DJNZ R0,Etiqueta2end

"Vale pues mi pregunta es la siguiente: cuando pone DPL y DPH ¿cómo lo tengo que considerar?, así a simple vista puedo entender que uno es la parte alta y otro la baja, pero ¿cómo busco eso en las tablas? Saludos y Gracias."

Respuesta del profesor:

El microcontrolador visto en clase dispone de un registro de 16 bits llamado DPTR, pero como no dispone de una instrucción para cargarlo de una vez, debemos hacerlo con dos instrucciones MOV, primero cargando la parte baja (MOV DPL,31h) y luego la parte alta (MOV DPH,32h). Ambos registros puedes verlos en las tablas, te los pongo señalados en la figura siguiente:

Mucho ánimo!!

martes, 24 de junio de 2008

Dudas de un problema de examen

En el examen de Junio de 2006, sobre el siguiente problema:

"Se desea controlar un proceso industrial que temporice un tiempo t1 de 1 segundo,
posteriormente otro tiempo t2 de medio segundo y cuando finalice t2 escriba en el puerto
P2 el valor 0xF1 y así sucesivamente. Para ello se utilizará el Timer 0 del microcontrolador Atmel y se programará en modo 16 bits atendido por interrupciones. Para temporizar los tiempos t1 y t2 se utilizará el conteo de desbordamientos. Reloj de 12 Mhz."


Pregunta1: En el enunciado, nos dicen sacar por el puerto P2 el valor en hexadecimal de F1 y sucesivamente. ¿Qué quieren que hagamos?

-R: lo que quería decir (yo puse el problema) es que se enviara dicho valor por el puerto y volviera a comenzar el proceso de nuevo...

Pregunta2: Para calcular los valores de THO y TLO tenemos que calcular el tiempo del ciclo de maquina ¿Qué fórmula se utiliza?

-R: por supuesto, es lo primero que debes hacer porque todos los cálculos se basan en el ciclo de máquina y éste depende de la velocidad de la máquina, a mayor frecuencia, el ciclo de máquina es más 'rápido' (el tiempo que tarda en ejecutar una instrucción es más pequeño ya que el reloj va más rápido). Por lo tanto lo primero es calcular vuestro CM (ciclo máquina) en función de la frecuencia que os den.

Un ejemplo: Supongamo un problema en el que te dan una frecuencia de 12Mhz...

- Primero calcula el inverso para sacar el periodo: 1/12Mhz=0,8333microsegundos.

- Después mira la documentación del micro para ver cuantos ciclos de reloj tiene un ciclo de máquina (Atmel tiene 12CLK por CM, Microchip tiene 4CLK por CM).

- En nuestro caso (Atmel) si ves las transparencias tiene 12, por lo tanto un ciclo de máquina en este micro tardará en ejecutarse: 12x0,8333...= 1microsegundo.

Fíjate que ésto es lo primero que tienes que hacer en un problema, ya que todos los cálculos están basados en el tiempo de ciclo de máquina. Prueba a hacerlo para otras frecuencias como 2Mhz, 10Mhz o 40Mhz.

Pregunta3: Una vez calculado el TCM calculamos el número de cuentas necesarias. Si el número de cuentas es superior a 2^número de bits del temporizador se tiene que obtener el resto que introducimos en THO y TLO. ¿Tiempo total = TCM x Cuentas?

-R: Imagina que te sale una cuenta de 65.781 (una cuenta completa de 65.536 más una parcial de 245), en este caso tendrás que cargar primero el resto 245 en TL0 (TH0=0) para contabilizarlo primero y después dejar que se desborde una vez para completar la cuenta...

Puedes hacerlo al revés, primero la cuenta completa y después la parcial. En ambos casos necesitas una variable que te cuente los desbordamientos.

Resumiendo: cuando la cuenta supera el valor máximo del registro, hay que hacer varias pasadas o desbordamientos para ir 'acumulando', por lo tanto el tiempo total será: TCMxCuentas.

Sobre el examen de Junio (2º parcial)

Unas preguntas de Antonio...

Pregunta1 ¿cómo va a ser el examen? ¿test, problemas como las practicas...?
-R: habrá 3 problemas, ensamblador, interrupciones y temporizadores.

Pregunta2: ¿las tablas las llevamos nosotros, no?
-R: Sí, no os las olvidéis, las necesitaréis para resolver los problemas.

Pregunta3: el tema de las practicas... ¿cuándo saldrá la lista para saber cuales nos faltan por hacer y cuando se podran recuperar?
-R: A estas alturas las prácticas ya no se recuperan.

Pregunta4: ¿cuándo son tus tutorias....?
-R: Estaré el viernes 27 todo el día en el despacho.

Pregunta5: ¿El tema de conversión A/D entra?
-R: Para el examen de Junio de 2008 no entra este tema.

sábado, 21 de junio de 2008

A vueltas con el modo Autorrecarga...

Óscar preguntaba lo siguiente:

"Tengo una duda bastante específica sobre los Timers que no he podido aclarar en el libro. Se que el modo autorrecarga de un timer sirve para cargarlo a un valor predefinido tras el desborde del mismo, vale , ok. Pero si no lo cargase, ¿qué pasaría con el valor de los registros (en este caso registro) TL0 tras eldesbordamiento? ¿Se pondría a 0? o ¿seguiría en el valor máximo 'contando'? De lo que he podido leer en el libro, me queda claro que sigue funcionando, osea contando tras ocurrir el desborde. Quiere decir esto que: llega al valor máximo (supongamos 256)--> se pone a 0 yluego vuelve a seguir aumentando hasta que se desborde de nuevo?Entonces, esto quiere decir que, en el caso de que me interesase tener como cuenta inicial un 0(para los modos de 13bits y 16), no necesitaría hacer recarga software del contador al desbordar éste? (puesto que se pondría por defecto a 0)..."

Respuesta del profesor: A ver...dejad que mire las tablas y os copie la figura del modo...


Como puedes ver en la figura, en el modo autorrecarga, el registro que lleva la 'cuenta' es TLx (es el que genera el 'Overflow') y por lo tanto cuando finaliza dicha cuenta, se recarga con el valor de THx (mira el sentido de la flecha). Por lo tanto NO hace falta cargarlo cada vez que desborda, ya que THx tiene el valor que hayas definido (actuando como una memoria). En este caso, debes cargar inicialmente THx, que determinará la temporización elegida.

Cuando acaba la cuenta, TLx NO necesariamente empieza de nuevo desde cero, leerá el valor de THx. Si le has puesto en THx, el valor 23, será éste el inicio de la cuenta en TLx, ¿entendido?

También es cierto que si cargas inicialmente THx a cero, la cuenta empezará desde cero, pero utilizar este modo en este caso es desaprovechar la funcionalidad de la autorrecarga.

Ten en cuenta que el modo autorrecarga se utiliza para temporizaciones repetitivas y está pensado precisamente para que no tengas que recargar el mismo valor continuamente en el contador...

Si tienes más dudas, escribe!

viernes, 30 de mayo de 2008

Definir correctamente los registros SFR

A la hora de programar una aplicación basada en un microcontrolador, la definición de los registros es clave. Cada registro tiene una dirección de memoria única que hay que escribir correctamente teniendo delante la hoja de características (las tablas del micro).

Por ejemplo, imagina que en un problema se pide definir los registros siguientes: IPL1, CL, IEN1 y ADCON. Siguiendo la figura que puedes ver aquí, tendríamos:


sfr IPL1= F8h; (F8h corresponde al registro de la primera columna).
sfr CL= E9h; (dirección base E8 + 1).
sfr IEN1= E8h; (E8h corresponde al registro de la primera columna).
sfr ADCON= F3; (dirección base F0 + 3);

Ten en cuenta que tienes que sumar a la dirección base de la primera columna izquierda, el desplazamiento correspondiente. Por ejemplo si tuvieras que definir el registro CCAMP2, su dirección sería DCh (base D8h+4) y no D4h (es bastante habitual leer en la primera fila de arriba y confundir los valores), por lo que os recomiendo que os fijéis bien o que contéis columnas para evitar errores.

martes, 20 de mayo de 2008

Siempre hay que habilitar las interrupciones

Prácticamente cualquier microcontrolador del mercado tiene dispositivos integrados como temporizadores, conversores A/D, etc. Cuando se programa cada uno de estos dispositivos, funcionan de manera autónoma, interrumpiendo al microprocesador sólo cuando acaban su trabajo (por ejemplo para los temporizadores cuando finaliza su cuenta).

Esta señal de aviso se transmite directamente desde el dispositivo (temporizador) hasta el microprocesador por hardware, pero antes de llegar pasa un filtro, éste es el registro de habilitación de interrupciones IENx (Interrupt Enable).

En el caso del micro visto en clase, hay dos registros de habilitación de interrupciones (IEN0 e IEN1), ambos permite habilitar/deshabilitar cada una de las interrupciones que genera los dispositivos. Cada vez que diseñamos un programa basado en interrupciones, no debemos olvidar habilitar las interrupciones de cada dispositivo en este registro, además de habilitar el bit de interrupciones general (EAL).

Un ejemplo puede ser:

EAL=0; 'se inhabilita todas las interrupciones antes de modificar nada..
...... aquí habilito las interrupciones particulares, del timer, A/D, etc...
EAL=1; 'se habilita las interrupciones de nuevo..

¡Los registros no son elásticos!

He visto en algunos ejercicios el siguiente error:

TH0=5.536
TL0=45.536

¿Cuál es el problema? Recordad que estamos trabajando con un micro cuyos registros, sus SFR, son de 8 bits. Esto quiere decir que pueden almacenar valores de como máximo 255 (2^8). Por lo tanto no se puede iniciar un registro de 8 bits a un valor mayor como los ejemplos que he puesto arriba.

El número binario que corresponde a 5.536 es: 1010110100000, intenta colocarlo en un registro de 8 bits...si lo consigues, me lo dices!!

Si los registros fueran de 16 bits, el primer valor (mira el valor binario) sí que podrías inicializarlo.

¿De cuántos bits necesitarías que fuera TL0 para inicializarlo a 45536?...

jueves, 8 de mayo de 2008

Los vectores de interrupción

Cuando se genera una interrupción, el programa principal se detiene y el flujo de ejecución salta a la rutina de servicio (es un trozo de código que tiene una función determinada). La dirección a la que se salta es el VECTOR DE INTERRUPCIÓN, es una dirección física de memoria como por ejemplo 40Ah, etc. Cada microcontrolador tiene definidas unas direcciones fijas de memoria para 'alojar' estas rutinas de servicio, independientemente de si se utilizan o no. Si quieres ver qué dirección de memoria (vector) está asociada a cada interrupción, sólo tienes que echar un vistazo a las hojas de características de cada micro:

En el ejemplo de la figura de arriba que corresponde al micro de clase, T89C51CC01, puedes ver que cada interrupción está asociada a una dirección (su vector), por ejemplo cuando se produzca la interrupción 4, el microcontrolador saltará a la dirección de memoria 0023h para ejecutar la rutina asociada. Estas direcciones son fijas y no se pueden cambiar. En realidad a la hora de escribir el código de una interrupción no te hace falta saber su vector, lo que sí es importante es añadir el número asociado a la interrupción que estás programando.

martes, 22 de abril de 2008

Direccionamiento bit a bit

No todos los registros de un microcontrolador pueden accederse bit a bit. En el caso de nuestro micro (Atmel) y según el manual, sólo aquellos registros que aparecen en la primera y última columna (señaladas en rojo en la figura) pueden direccionarse bit a bit. Todos los demás deben definirse como un registro completo tipo sfr.


Ejemplo: Puede definirse como sbit cualquier de los bits de los puertos P0, P1, P2 y P3 porque están en la primera columna y son direccionables bit a bit.

Recuerda que primero tienes que definir las variables sbit:
sbit bit1_P1 = 90h^1;
sbit bit4_P1 = 90h^4;
sbit bit3_P2 = A0h^3;
sbit bit6_P2 = A0h^6;

Una vez hecho, ya puedes utilizarlas asignándole el valor que desees:
bit1_P1=0;
bit4_P1=1;
bit3_P2=0;
bit6_P2=1;

* Utilizar sbit es una manera muy cómoda de cambiar el estado de un bit sin alterar el resto del registro.

Por otro lado, el registro FCON, que está en la segunda columna, tiene que definirse necesariamente como sfr:
sfr FCON = D1h;

Esto no quiere decir que no se pueda acceder a cualquier de sus bits, lo que sucede es que hay utilizar máscaras y se tiene que escribir un poco más.

jueves, 10 de abril de 2008

Saltos relativos (SJMP) vs saltos largos (LJMP)

Cuando aparece una instrucción de salto relativo tipo SJMP, el segundo byte (salto relativo) es la distancia en bytes desde la siguiente instrucción a la etiqueta que se indique. Puede ser un salto hacia adelante (el valor de 'salto relativo' será positivo y se escribirá tal cual en el byte) o puede ser hacia atrás (el valor de 'salto relativo' será negativo y habrá que escribir el valor en complemento a dos).

Por el contrario cuando aparece una instrucción de salto largo tipo LJMP, los dos bytes siguientes son la dirección de salto. Por ejemplo si la instrucción tiene que saltar a la dirección F43Ah, tendrás que escribir la parte alta (F4h) en el segundo byte y la parte baja (3Ah) en el tercer byte, aquí no hay que calcular distancia en bytes ya que se da dirección de salto exacta.

¿Es lo mismo PIC que ATMEL?

Fabricantes de microcontroladores hay muchos, por citar algunos ejemplos: ATMEL, Intel, Toshiba, Microchip, etc. Por lo tanto cuando nos referimos a un modelo en concreto, no podemos confundirlos. Cuando nos referimos a los micros de clase (ATMEL, http://www.atmel.com/) no debemos confundirlos con los 'PIC', ya que éstos son de otro fabricante (Microchip, http://www.microchip.com).