1 de junio de 2010

Ejemplo de temporizadores sin usar calculadora

Temporiza 6 segundos con el timer T0 (v.1.1)
Se desea supervisar un sensor (S0) con un microcontrolador compatible 8051. El sensor “S0” está conectado al bit 4 del puerto “P1”. Cuando se detecta un nivel bajo en el sensor “S0”, el bit 7 del puerto “P0” deberá ponerse a nivel alto e iniciarse una temporización de 6 segundos. Cuando finalice este tiempo, el bit 7 del puerto “P0” deberá ponerse a nivel bajo.








Se pide:

Realizar un programa en C que implemente la especificación anterior. Para ello, se deberá contemplar la programación de los registros involucrados (“sfr”), los bits necesarios y la utilización de las variables. La temporización se realizará por encuestas (sin utilizar interrupciones). Considérese que el reloj del sistema funciona a 12 Mhz.

Solución:

Como nos piden una temporización grande, usaremos el modo 1 (16 bits).
desbordamientos_enteros: 6000000/65536=91
resto: 6000000-(91*65536)=36224 (un desborde parcial).

Por lo tanto debemos realizar:

- 91 desbordamientos completos (timer empieza en cero) y
- 1 desbordamiento parcial (timer no empieza en cero).






















* Sin calculadora, se deja indicado:
desbordamientos_enteros: 6000000/65536 (91)
resto: 6000000 % 65536 (36224)


El desbordamiento parcial debe temporizar resto (36224 microsegundos).
Para cargar “TH0” y “TL0” con esta cuenta inicial, debemos, como siempre, restar del valor total del temporizador:

cuenta_inicial=65536-36224 = 29312 = 0x7280
TH0 = 0x72;
TL0 = 0x80;

* Sin calculadora, se deja indicado:
cuenta_inicial=65536-resto
TH = cuenta_inicial/256;

TL= cuenta_inicial % 256;

Esta operación anterior “separa” un valor de 16 bits en dos registros de 8 bits. Se hace así porque este micro no permite la asignación de un registro de 16 bits en una operación única.

Ejemplo del programa:

void main (void){

TR1=0;
P0=0x01; // configura línea 0 del puerto P0 como entrada
TMOD=0x01; // modo temporizador, gate=0, modo 16 bits

while (1){
desbordes=92;
if (s0 == 0) {
salida = 1;
TH0 = 29312/256; // carga parcial

TL0= 29312 % 256; // carga parcial
TR0=1;
// puesta en marcha del timer

…terminarlo y probarlo…

1 comentario:

Irenuela =) dijo...

¿Podrías colgar el resultado completo del ejercicio como este que pusisteis el último día de clase? Aquel sí que era con interrupciones.