Вы находитесь на странице: 1из 30

Sistemas Digitales

UNIVERSIDAD NACIONAL DE
QUILMES
INGENIERA EN AUTOMATIZACIN Y
CONTROL INDUSTRIAL

Control de
Temperatura del
Invernadero
Profesor:
Jurez, Jos
Alumnos:
PEPA, Hernn Carlos
LIO, Guillermo Gustavo

Pgina 1 de 30

Sistemas Digitales

Introduccin
El proyecto consiste en un control de
temperatura de un invernadero. En el mismo
se
trata
de
controlar
la
temperatura
mediante un sistema de calefaccin y otro de
enfriamiento. El sistema de calefaccin
consta de tres lmparas de 150 watts, las
cuales son controladas (la potencia aplicada
a las mismas ) con modulacin de fase por
medio de una seal PWM .El sistema de
enfriamiento consta de un motor de corriente
continua con una hlice acoplada a su eje ,
el cual es el encargado de extraer el aire
que
se
encuentra
en
el
interior
del
invernadero produciendo una circulacin de
aire de recambio que genera una disminucin
de la temperatura. La actuacin sobre las
lmparas esta gobernada mediante una accin
PWM . Esta accin PWM, de muy baja
frecuencia,
es
posible
de
implementar
gracias a la utilizacin de un optotriac que
posee un circuito de deteccin de cruce por
cero, el cual se encarga de interfasear la
modulacin por ancho de pulso con la
modulacin de fase que se necesitara para
controlar potencia en corriente alterna. El
mismo optotriac actuar sobre un triac que
ser
quien
alimente
finalmente
a
las
lmparas.
Sobre el motor del extractor se aplicar un
PWM de baja frecuencia. Esta seal PWM es la
encargada de excitar un optoacoplador, el
mismo actuar sobre un mosfet que ser la
interfaz de alimentacin hacia el motor .
Se usarn dos sensores de temperatura y se
acondicionar la seal para poder usar el
conversor A/D del micro en todo su rango
Pgina 2 de 30

Sistemas Digitales

para obtener un valor proporcional a la


temperatura.
Se implementar un control PI. Segn lo que
este me diga se actuar sobre las lmparas,
el motor o ambos.
Tendr pulsadores que me permiten cambiar de
manual a automtico, otros para subir y
bajar la potencia de salida cuando el equipo
se encuentra en manual y si esta en
automtico con estos pulsadores podr variar
el Set Point.
Los datos sern enviados a un display LCD
que me mostrar el valor del Set Point, la
variable de proceso y la potencia entregada
a la resistencia calefactora.

Pgina 3 de 30

Sistemas Digitales

Flujo del Programa

FLUJO DEL
PROGRAMA

INICIALIZACION
GENERAL

MEDICION
TEMPERATURA

BARRER
TECLADO

CAMBIO
TECLAS?

NO

SI

ESTA EN MANUAL
O AUTOMATICO?

SUBIR O BAJAR SP
TECLAS = $01 => SUBIR SP
TECLAS = $02 => BAJAR SP
(FIJARSE QUE ESTE ENTRE 00-FF)
TECLAS = $03 => CAMBIAR A MANUAL

Pgina 4 de 30

SUBIR O BAJAR % POTENCIA


TECLAS = $01 => SUBIR % POT
TECLAS = $02 => BAJAR % POT
(FIJARSE QUE ESTE ENTRE 00-FF)
TECLAS = $03 => CAMBIAR A AUTO

Sistemas Digitales

ESTA EN MANUAL
O AUTOMATICO?

PI

% POTENCIA
=> LAMPARAS

NEG(% POTENCIA)
=> EXTRACTOR

MUESTRO
% POTENCIA

MUESTRO
TEMPERATURA

MUESTRO
SET POINT

Pgina 5 de 30

Sistemas Digitales

Diagrama En Bloques

Pgina 6 de 30

Sistemas Digitales

Entradas-Salidas
*2
entradas
analgicas
conectadas
conversor
A/D
del
micro
(sensor
temperatura).

al
de

*3 entradas digitales (pulsadores).


*2 salida PWM
*Salidas varias para el manejo del display.
Detalles Del Programa
*Se realiz un programa estructurado.
*Se implementaron subrutinas y funciones
varias.
*Interrupcin de tiempo real.
*Se modulariz en secciones y en archivos
separados para poder reutilizar el cdigo
fcilmente.
*Cdigo mixto.
Switch Case Principal
Se ubic en el main un Switch Case principal
que ser la estructura de mi control.
Se declar una variable Teclas_Nuevo que
tendr
el
valor
actualizado
de
los
pulsadores luego de haber sido filtrados
adecuadamente.
Teclas_Nuevo = Sin_Cambio Ningn pulsador
fue pulsado
Teclas_Nuevo = Incrementa Se pulso el
pulsador Subir
Teclas_Nuevo = Decrementa Se pulso el
pulsador Bajar
Pgina 7 de 30

Sistemas Digitales

Teclas_Nuevo =
pulsador Man/Auto

Man_Auto

Se

pulso

el

Cualquier otro valor, por ejemplo pulsar dos


pulsadores a la vez no se tomar como
entrada vlida y se lo descartar.
Tambin se de declar una variable Fase
que me indica en que estado esta mi control.
Fase = Auto indica que mi control esta en
modo automtico.
Fase = Manual indica que mi control esta
en modo manual.
Ambas
variables
fueron
declaradas
como
enun, o sea, slo pueden tomar dichos
valores.
Lo que hace el switch es analizar estas dos
variables e indicar cul es la accin que se
debe tomar segn el valor de estas.
Si ninguna tecla fue presionada el switch no
realiza ninguna accin.
Si se toco la tecla ManAuto lo que hace es
mirar el valor de Fase y cambiarla. Si la
fase esta en Auto la cambia a Manual y
si esta en Manual la pone en Auto. O sea
que con un solo pulsador podemos poner al
control en Manual o Automtico.

Pgina 8 de 30

Sistemas Digitales

Si se puls Incrementa lo que hace es


mirar la Fase y segn en que valor est ser
la accin que realice. Si esta en Auto lo
que hace es incrementar el SetPoint y si
esta en manual el % de Potencia de salida.
Si se puls Decrementa lo que hace es
mirar la Fase y segn en que valor est ser
la accin que realice. Si esta en Auto lo
que hace es decrementar el SetPoint y si
esta en manual el % de Potencia de salida.

switch(Teclas_Nuevo) //SWITCH CASE PRINCIPAL


{
case Man_Auto:
{
//CAMBIA DE MANUAL A AUTO Y VICEVERSA
if(Fase == Manual)
{
Fase = Auto;
}
else
{
Fase = Manual;
}
break;
}
case Incrementa:
{
//INCREMENTA EL SP O %POT
if(Fase == Manual)
{
Incre_Pot();//INCREMENTAR POTENCIA
}
else
{
Incre_Sp();//INCREMENTAR SP
}
break;
}
case Ambos:
{
//SE PULSARON AMBOS PULSADORES

Pgina 9 de 30

Sistemas Digitales

break;
}
case Decrementa:
{
//DECREMENTA EL SP O %POT
if(Fase == Manual)
{
Decre_Pot();//DECREMENTAR POTENCIA
}
else
{
Decre_Sp();//DECREMENTAR SP
}
break;
}
}

Funciones
Decre_Pot

Incre_Sp,

Decre_Sp,

Incre_Pot,

En el archivo func_teclas se ubicaron


las funciones que realizan las teclas.
Lo que hacen estas funciones es incrementar
y decrementar el SetPoint o el % de
Potencia.
Se les puso un filtro por la velocidad del
micro para que no crezca muy rpido su valor
al ser presionada.
Se control que no se vaya del rango de 0x00
0xFF. O sea, se las limito para que no
desborden.
void Incre_Sp(void) //INCREMENTA SP
{
Aux01--;
if(Aux01 == 0)
{
//Filtro por la velocidad del micro
if (SP != 0xFF)
{
//Se fija que no me pase de $FF
Pgina 10 de 30

Sistemas Digitales

SP++;
}
Aux01 = Aux01_Valor;
}
}
void Decre_Sp(void) //DECREMENTA SP
{
Aux01--;
if(Aux01 == 0)
{
//Filtro por la velocidad del micro
if (SP != 0x00)
{
//Se fija que no me pase de $00
SP--;
}
Aux01 = Aux01_Valor;
}
}

Subrutina Barrido
En el archivo teclas se creo una subrutina
de assembler dedicada a leer el puerto de
los
pulsadores.
Se
logr
mezclar
el
assembler con el c para obtener un
cdigo mixto. Esta subrutina se la llam
desde el main de la siguiente forma:
//Declaracin
extern void Barrido(void);
//Barrido_Teclas();
Barrido();

Esta subrutina tiene un filtro contra


el rebote de teclas que se puede
ajustar a gusto tambin y detecta el
flanco de subida.
En el caso de tener presionados por un
tiempo los botones de subir y bajar permite
subir permitir subir y bajar mas rpido para
que no sea engorroso presionar muchas veces

Pgina 11 de 30

Sistemas Digitales

por la deteccin del


tambin es ajustable.
xdef
xdef
xdef
xdef
xdef
xdef
xdef
xdef
xdef
xdef
xdef
xdef

flanco.

_Barrido
_Ini_Var_ASM
PortC
Msk_PortC
PortC_Viejo
Ret_Tec
Ret_Tec_Val
Teclas_Viejo
_Teclas_Nuevo
PortC_Nuevo
Ret_Tec2
Ret_Tec2_Val

_Ini_Var_ASM:
ldaa
staa
ldaa
staa
ldaa
staa

Ret_Tec_Val
Ret_Tec
Ret_Tec2_Val
Ret_Tec2
#$FF
PortC

rts

;************************************
;BARRIDO DE TECLADO CON FILTRO
;DETECTA FLANCO SUBIDA
_Barrido:
;***************************************
;FILTRO TECLAS
ldaa
cmpa
beq
ldaa
staa
ldaa
staa
bra

PortC
PortC_Viejo
Barrido_10
Ret_Tec_Val
Ret_Tec
PortC
PortC_Viejo
Barrido_20

Pgina 12 de 30

Este

tiempo

Sistemas Digitales

Barrido_10:
dec
bne
ldaa
staa
ldaa
staa

Ret_Tec
Barrido_20
PortC_Viejo
PortC_Nuevo
Ret_Tec_Val
Ret_Tec

Barrido_20:
;***************************************
;***************************************
;DETECCION FLANCO SUBIDA
ldaa Teclas_Viejo
coma
staa Teclas_Viejo
ldaa PortC_Nuevo
coma
anda
Msk_PortC

anda Teclas_Viejo
staa _Teclas_Nuevo
ldaa PortC_Nuevo
coma
anda
Msk_PortC
staa Teclas_Viejo
;***************************************
;SUBIR Y BAJAR RAPIDO
;SOLO PARA ESTOS PULSADORES
;NO SE APLICA A CAMBIO DE FASE
ldaa
coma
cmpa
beq
cmpa
beq
bra

PortC_Nuevo
#$02
Barrido_30
#$04
Barrido_30
Barrido_40

Barrido_30:
dec Ret_Tec2
bne Barrido_40
staa _Teclas_Nuevo

Pgina 13 de 30

Sistemas Digitales

ldaa Ret_Tec2_Val
staa Ret_Tec2
Barrido_40:
;***************************************
rts
;***************************************

PortC:
Msk_PortC:
PortC_Viejo:
Ret_Tec: dc.b
Ret_Tec_Val:
Teclas_Viejo:
PortC_Nuevo:
Ret_Tec2: dc.b
Ret_Tec2_Val:

equ
equ
dc.b
$00
equ
dc.b
dc.b
$02
equ

$1006
$07
;3 PRIMEROS BITS
$00
;FILTRO POR REVOTE TECLAS
$01
$00
$00
;SUBIR Y BAJAR MAS RAPIDO
$01

Subrutina Ini_Var_ASM
Lo que hace esta subrutina es inicializar
las variables de assembler. Es llamada desde
el main de la siguiente manera:
//Declaracin
extern void Ini_Var_ASM(void);
//Inicio variables en assembler
Ini_Var_ASM();
_Ini_Var_ASM:
ldaa
staa
ldaa
staa
ldaa
staa

Ret_Tec_Val
Ret_Tec
Ret_Tec2_Val
Ret_Tec2
#$FF
PortC

rts

Pgina 14 de 30

Sistemas Digitales

Variables globales
Se creo un archivo variables_c para
contener todas las variables globales de mi
proyecto.
///////VARIABLES C////////

//typedef char BYTE;


int contar=0,comparar=22;
char Pot = 0x00, Aux01 = 0x00, Aux01_Valor = 0x01, SP =
0x00;
char ii=0x00;
char Sum, Error,kk;
enum {Manual, Auto} Fase = Manual;
enum {Sin_Cambio, Man_Auto, Incrementa, Ambos,
Decrementa,a,b,c,d} Teclas_Nuevo = Sin_Cambio;
int
int

pausa_cls=0x1000;
pausa_lcd=0x0020;

char
datos_lcd[3];
char prom_conv=0;
char
conversion1=0,conversion2=0;

Control
Se llam a la funcin desde el cuerpo
principal del programa. Se fija la fase del
programa, si esta en Manual deja el %Pot
para que se modifique con los pulsadores. Si
esta en Auto lo que hace es calcular la
distancia de la variable de proceso con el
SetPoint y aplicar un %Pot proporcional a
esa distancia. En prom_conv tenemos el el
valor de la temperatura promediado. En SP
el SetPoint fijado.
Error= SP - prom_conv;
Pgina 15 de 30

Sistemas Digitales

Primeramente tenemos que fijarnos si SP es


mayor que prom_conv. En caso de que sea al
revez quiere decir que nuestra temperatura
es superior al SP por lo cual debemos poner
la Potencia a cero.
%Pot

0%

Si el Error es positivo y adems mayor a 50


cuentas quiere decir que estamos a unos 18C
de distancia entonces aplicamos.
%Pot

100%

Si el Error es menor a 50 cuentas y mayor a


8
(2C
aprox.)
aplicamos
un
control
proporcional.
%Pot = 0x03*Error;
%Pot
contiene
un
numero
de
cuentas
proporcional al ancho del pulso del PWM que
aplicamos para mover el Triac que aplica la
tensin en las lmparas.
Por ejemplo si %Pot = 0x80 estaremos
aplicando un PWM con un ciclo de actividad
del 50%.
Al extractor se le aplicar la Potencia
negada porque son acciones opuestas.
Ejemplo:
Para
temperaturas
extremas
si
queremos
calentar al mximo necesitamos que las
lmparas estn al 100% y el extractor al 0%.
Para enfriar al mximo necesitamos las
lmparas al 0% y extractor al 100%.

Pgina 16 de 30

Sistemas Digitales

O sea, que en el momento de controlar una


temperatura, si necesito calentar aumento un
poco la potencia de las lmparas y disminuyo
las del extractor. Y si necesito enfriar,
aumento
la
potencia
del
extractor
y
disminuyo la de las lmparas.
Pwm_Lamp(Pot);
Pwm_Motor(Neg(Pot));
Si estamos dentro de la banda de 2C no
aplicamos accin de control, o sea, le
dejamos una histresis.
void Control(void) //Control P
{
if(Fase == Auto)
{
if(SP > prom_conv)
{
Error= SP - prom_conv;
if(Error>0x50)
{
Pot=0xFF;
}
else
{
if(Error>8)
{
Pot=0x03*Error;
}
}
}
else
{
Pot=0x00;
}
}
}

Pgina 17 de 30

Sistemas Digitales

Rutina se servicio de interrupcin

RTI

La rutina de servicio de interrupcin fue


programada
para
que
se
active
la
interrupcin
de
tiempo
real
cada
32
milisegundos aproximadamente. Ese tiempo
sera el tiempo de scan que tiene nuestro
sistema, en el cual debemos actualizar los
datos del teclado. Se puso una variable que
cuenta 33 veces para generar un scan de 1
segundo
para
tomar
el
valor
de
la
temperatura por medio del conversor, aplicar
el
control
estimado
segn
los
datos
obtenidos y hacer el refresco del display
con los datos actuales.

//void rutina(void)
@interrupt void rutina(void) //Interrupcion de tiempo real
{
TFLG2=0x40;
//Barrido_Teclas();
Barrido();
cuenta--;
if(cuenta == 0)
{
//Conversor;
CAPTURA_CONVERSORAD();
Enviar();
control();
cuenta = 33;
}
switch(Teclas_Nuevo) //SWITCH CASE PRINCIPAL
{
......
}
}

Pgina 18 de 30

Sistemas Digitales

Conversor A/D
Los sensores de temperatura entran al
conversor A/D que esta configurado de modo
multiple y single scan.
Este conversor esta sincronizado con la RTI,
o sea que se llama a la rutina de conversin
desde dentro de la rutina de la RTI.
Configuracin del conversor A/D:
OPTION=0x80;
ADCTL=0x10;

Dentro de la RTI se realiza la llamada a la


funcin CAPTURA_CONVERSORAD(), dentro de la
misma
funcin
se
llama
a
la
funcin
conversin_canal() que es la encargada de
iniciar la conversin y esperar el fin de
conversin, una vez finalizada la conversin
volcamos los resultados de los canales
convertidos ADR1 y ADR2 en las variables
globales
conversin1
y
conversin2
respectivamente.
Estas variables son tratadas por la funcin
promedio() y q hace un promedio mvil de las
muestras para reducir las posibilidades de
grandes variaciones de medicin por causas
de intromisin de ruido en la medicin que
efectan
los
sensores
y
volcamos
ese
resultado en la variable global prom_conv.
void CAPTURA_CONVERSORAD(void)
{
conversion_canal();
conversion1=ADR1;
conversion2=ADR2;
promedio();
}
void conversion_canal(void)
Pgina 19 de 30

Sistemas Digitales

{
ADCTL|=0x80;
while((ADCTL & 0x80)==0)//ESPERAR FIN DE CONVERSION
{
}
}

void promedio (void)


{
short conv1, conv2, prom;
conv1 = (short)conversion1;
conv2 = (short)conversion2;
prom = (short)prom_conv;
//Promedia las dos muestras nuevas y ademas promedia
el valor
//viejo para obtener un mejor filtrado de la seal
prom = ((conv1 + conv2)/2 + prom)/2;
prom_conv = (char)prom;
}

Conversin ASCII
La conversin
de los datos a ASCII se
realiza para enviar los datos al lcd.
Los datos de potencia , porcentaje de
actuacin, variable de setpoint y variable
medida de temperatura son cargadas a un
array datos_lcd[i] y mediante la funcin
que vemos a continuacin son convertidas a
ASCII
void ascci(char var_asci)
{
char i=3, resto=0;
datos_lcd[2] = var_asci/100; //guardamos la centena en
el vector
resto = var_asci-(datos_lcd[2]*100);
datos_lcd[1]=resto/10;//guardamos la decena
datos_lcd[0]= resto-(datos_lcd[1]*10);//guardamos
unidad
//convertimos a ascci

Pgina 20 de 30

la

Sistemas Digitales

while(i!=0)
{
i--;
datos_lcd[i]=datos_lcd[i] + 48;
}
}

Configuracin del LCD


El lcd se configuro en base a las subrutinas
en assembler q se tradujeron al lenguaje c.
En
el
lcd
se
pueden
visualizar
la
temperatura medida, la potencia entregada a
los pwm que actan sobre las lmparas y
sobre el motor y la seal de setpoint.
Mediante la siguiente rutina se configuro e
inicializ
el
display,
esta
funcin
ini_lcd() se llama solo una vez desde el
main con el solo propsito de inicializar el
lcd y prepararlo para recibir datos:
void INI_LCD(void)
{
CMD_LCD(0x38);
CMD_LCD(0x0e);
CMD_LCD(0x01);
}
//***********************
//enviar un comado al lcd
//***********************
char CMD_LCD(char a)
{
PORTA=a;
PORTF &= 0xF9;
ENABLE_LCD();
if(a!=0x01)
{
PAUSA(pausa_lcd);
}
else

Pgina 21 de 30

Sistemas Digitales

{
PAUSA(pausa_cls);
}
}
//*******************
// habilitar el lcd
//*******************
void ENABLE_LCD(void)
{
PORTF ^= 0x01;
PORTF &= 0xFE;
}
//************************
//pausa comandos lcd
//************************
void PAUSA(int b)
{
while(b!=0)
{
b--;
}
}

Envo al LCD
Las
funciones
que
se
describen
a
continuacin son utilizadas cada vez que el
refresco del display , o sea cada vez q
entro
en
la
rutina
de
servicio
de
interrupcin de la RTI , que fue configurada
previamente
para
actualizar
los
datos
aproximadamente cada 1000 milisegundos.
Con la siguiente funcin se enva un dato al
lcd, que previamente fue convertido a ASCII:
void Envio_Dato(char a)
{
PORTF ^= 0x04; //RS=1
PORTF &= 0xFD; //R/W=0
PORTA = a;
ENABLE_LCD();
PAUSA(pausa_lcd);
PORTF &= 0xF8; //
}

Pgina 22 de 30

Sistemas Digitales

Con la funcin cursor nos posicionamos sobre


la primera o segunda lnea del display para
escribir el dato deseado:
void Cursor(char a)
{
PORTA = a;
PORTF &= 0xF9; //RS=0 R/W=0
ENABLE_LCD();
PAUSA(pausa_cls);
}

La funcin enviar() engloba a todas las


funciones
antes
descriptas
para
el
procesamiento y envo de datos al display:

void Enviar(void)
{
char i=3, aux;
Cursor(0x80);//Linea de Arriba
Envio_Dato('T');
Envio_Dato(' ');
//Acondiciono la Temp y convierto a ASCII
//Acondiciono la Temp y convierto a ASCII
aux = (char)((60*prom_conv)/255);
ascci(aux);
while(i != 0)
{
i--;
Envio_Dato(datos_lcd[i]);
}
Cursor(0xC0);//Linea de abajo
if(Fase == Manual)
{
Envio_Dato('P');
Envio_Dato(' ');
i=3;
//Acondiciono la Pot y convierto a ASCII
aux = (char)((100*Pot)/255);
ascci(aux);
while(i != 0)
{
i--;
Envio_Dato(datos_lcd[i]);
}
Pgina 23 de 30

Sistemas Digitales

//Envio_Dato(' ');
//Envio_Dato('%');
}
else
{
Envio_Dato('S');
Envio_Dato('P');
Envio_Dato(' ');
i=3;
//Acondiciono el SP y convierto a ASCII
aux = (char)((60*SP)/255);
ascci(aux);
while(i != 0)
{
i--;
Envio_Dato(datos_lcd[i]);
}
}
}

PWM
Se configuraron dos TOC para crear dos PWM.
while(1)
{
if((TFLG1&0x40)!=0)
{
TFLG1=TFLG1|0x40;
if(estado==0)//estadobajo)
{
TCTL1=TCTL1&(~0x40);
estado=1;//estadoalto;
TOC2=TOC2 + 10*Pot;
}
else
{
TCTL1=TCTL1|0x40;
estado=0;//estadobajo;
TOC2=TOC2 + (Periodo - 10*Pot);
}
}
//*****************************
//pwm lamparas de calefaccion
//*****************************
if((TFLG1&0x20)!=0)
{

Pgina 24 de 30

Sistemas Digitales

TFLG1=TFLG1|0x20;// limpio el flag


if(estado2==0)//estado bajo)
{
TCTL1=TCTL1&(~0x10);
estado2=1;//estadoalto;
TOC3=TOC3 + 100*(Periodo - Pot);
}
else
{
TCTL1=TCTL1|0x10;
estado2=0;//estadobajo;
TOC3=TOC3 + (100*Pot);
}
}
}

Los PWM se pusieron dentro del bucle


infinito ya que son de alta frecuencia. Se
declar una variable estado que contiene el
valor de la salida y se configur el TCTL1
para que pase a bajo o alto segn el estado.
El perodo se fijo en una variable que
contena una cierta cantidad de cuentas que
me
permita
obtener
aproximadamente
un
perodo de 1.5 mseg para el del motor y diez
veces ms para el de las lmparas. Se eligi
Perodo de 2550 para que sea fcil el
escalado ya que Pot va de 0 a 255.
TOC2=TOC2 + 10*Pot Ciclo ON del motor
TOC2=TOC2 + (Periodo - 10*Pot); Ciclo OFF
del motor.

Pgina 25 de 30

Sistemas Digitales

Software de Desarrollo
Archivo LINKER:
#
#
#

GENERIC LINK COMMAND FILE FOR 68HC11


Copyright (c) 1999 by COSMIC Software

+seg .text -b 0x000 -n Init # Program start address


crts.o # Startup routine
+seg .data -a Init -n VarIni # Variables Inicializadas
+seg .bss -a VarIni -n VarNoIni # Variables no
Inicializadas
+seg .const -a VarNoIni -n Constantes # Constantes
+seg .text -b 0xC4 -n VectInt # Vectores de Interrupcion
vector.o
+seg .text -a VectInt -n Prog # Codigo
variables_C.o
main.o
teclas.o
conv_ascii.o
conversorad.o
actuacion_pwm.o
control_pid.o
func_teclas.o
"C:\Archivos de programa\COSMIC\EVAL11\Lib\libf.h11"
"C:\Archivos de programa\COSMIC\EVAL11\Lib\libi.h11"
"C:\Archivos de programa\COSMIC\EVAL11\Lib\libm.h11"
#Agregado para programa a EEPROM
+seg .text -b 0xFE00 -n .text
display.o

Debido al tamao del programa, fue necesario


la utilizacin de la memoria EEPROM para
almacenar las funciones mas genricas, es
decir, aquellas funciones que una vez
probadas no volveran a ser modificadas. Por
ejemplo la del display.

Pgina 26 de 30

Sistemas Digitales

Al realizar un build del proyecto utilizando


el archivo de linker descripto mas arriba,
queda bien diferenciado en el archivo de
salida .s19 principal, la parte del programa
que residir en la memoria RAM y la parte
del programa que residir en la memoria
EEPROM.
En base al archivo .s19 principal se
construyeron manualmente dos archivos .s19
secundarios, uno destinado a la memoria RAM
y otro destinado a la memoria EPPROM:
.s19 para la RAM:
S0480000433A5C446F63756D656E747320616E642053657474696E67735
C616C756D6E6F735C4D697320646F63756D656E746F735C54502046696E
616C5C547046696E616C2E6831311B
S10900008E04007E00EEF8
S1160006000000160000010000000010000020000000009C
S12300C400EE00EE00EE00EE00EE00EE00EE00EE00EE00EE00EE00EE00E
E00EE00EE00EE38
S10D00E400EE00EE00EE00EE000056
S12300EE3C3C306F01C6F818CE100018E707C6FF18E701BDFE00C68018C
E100018E739C662
S123010E1018E7307F000AC605F7000C7F000DF7000BC601F7000F7F001
0BD01DBC6FFE708
S123012E0020046A00E60026FABD01EBBD029A7C001CE6012607BDFEABC
650E7016A01F6A6
S123014E00105A270B5A27195A27325A2722202DF6000F2607C601F7000
F20217F000F20C6
S123016E1CF6000F2605BD031C2012BD0345200DF6000F2605BD0331200
3BD035AF6001C71
S123018EF1000A2404C6FF2005C1FF240A5F18CE100018E70420037F001
CF6000F5A2703B3
S12301AE7E012BF6000DF100152317F00015F7001DC1502304C6FF200AC
10823E386033D6B
S12301CE20015FF7000A4FBD02C87E012B9601B702499601B7024C86FFB
7100639B6100680
S12301EEB10248270D9601B70249B61006B7024820107A0249260BB6024
8B7024B9601B7E0
S123020E0249B6024A43B7024AB6024B439407B4024AB70010B6024B439
407B7024AB602F5
S123022E4B438102270681042702200D7A024C2608B700109601B7024C3
90000000005BD3F
S123024E03AC05C603E7034FE606BD036E64F7001B86643DE702E606E00
2E7044FBD036E00

Pgina 27 de 30

Sistemas Digitales

S123026E0AF7001A860A3DE702E604E002F7001920126A0318CE0019E60
3183A18E600CB1D
S123028E3018E700E60326EAAE0038393C3C3018CE1000181C3080181F3
080FB18E6314F23
S12302AEED0018E632E300BD036E02FB00158900BD036E02F7001538383
9393C373630F676
S12302CE0027A6013DEB07F70018F6001EEB01F7001EF60026B6001E3DF
B0018F70018E6B6
S12302EE01F00021B600253DFB0018F70018F100242305F600242008F10
0232406F60023CA
S123030EF70018E601F70021F600183838397A000B260FF6000A5C27037
C000AF6000CF747
S123032E000B397A000B260EF6000A27037A000AF6000CF7000B397A000
B260FF6000D5CAA
S123034E27037C000DF6000CF7000B397A000B260EF6000D27037A000DF
6000CF7000B39F1
S123036E3C364D2A028D1830EE03EE008F164F8F028F306C0426026C036
D0031382A04403D
S123038E508200393C364D2A028DF430EE03EE008F164F8F0220DB18383
C373020061838DC
S11603AE3C3730368F308F18E00082008F35ED00186E015F
S903FFFFFE

.s19 para la EEPROM:


S0480000433A5C446F63756D656E747320616E642053657474696E67735
C616C756D6E6F735C4D697320646F63756D656E746F735C54502046696E
616C5C547046696E616C2E6831311B
S123FE00CC00388D0BCC000E8D06CC00018D01393C373630E60118CE100
018E700181D0552
S123FE200618E605C80118E705181D0501E6015A2705FC00132003FC001
18D033838393C8C
S123FE40373630EC002005830001ED0026F93838393C37363018CE10001
8E605C80418E71A
S123FE6005181D0502E60118E70018E605C80118E705181D0501FC00138
DC418CE100018DE
S123FE801D05073838393C373630E60118CE100018E700181D050618E60
5C80118E70518AF
S123FEA01D0501FC00118D973838393CCC00808DD5CC00548D9BF600158
63C3DBD036EFFD8
S123FEC0BD024DC603F7000E7A000ECE0019F6000E3AE6004FBDFE51F60
00E26EBCC00C0B5
S123FEE08DA4C603F7000ECC0050BDFE51F6000A86643DBD036EFFBD024
D20107A000ECEF1
S123FF000019F6000E3AE6004FBDFE51F6000E26EBC603F7000ECC0053B
DFE51F6000D86AE
S123FF203C3DBD036EFFBD024D20107A000ECE0019F6000E3AE6004FBDF
E51F6000E26EBD8
S105FF4038394A
S903FFFFFE

Pgina 28 de 30

Sistemas Digitales

Para la escritura de la memoria EEPROM se


utiliz el programa JBug11:
El procedimiento para la escritura de la
memoria EEPROM es el siguiente (se asume que
el programa ya ha sido convenientemente
configurado):
1. Conectar el micro controlador con el JBug
y resetearlo.
2. Escribir los siguientes comandos:
R BPROT=10 habilita la escritura de la
EEPROM.
EBULK borra la memoria EEPROM.
3. VE FE00 FFFF verificamos el borrado de la
memoria.
4. Utilizando el botn Load S 19 file to
MCU memory seleccionar el archivo .s19
destinado a la memoria EEPROM.
5. Para la escritura de la memoria RAM se
utilizo el ya conocido Cargador del HC11F1
para WIN32.

Conclusiones
Este proyecto nos permiti usar un lenguaje
poderoso como es el C para programar el
micro. Se pudo hacer un cdigo mixto, o sea,
parte en C y parte en assembler.
Se tuvieron problemas de falta de memoria lo
que provoc que no se modularise tanto como
se pretenda. Se termino grabando parte en
RAM y parte en ROM al ltime.

Pgina 29 de 30

Sistemas Digitales

Los logros fueron


*Adquirir dos valores de temperatura
simulados con presets.
*Obtener dos seales PWM con el ciclo de
trabajo opuesto y de dos frecuencias
distintas.
*Funcionamiento correcto de la lgica de
control creada.
*Poder mandar los datos de temperatura, set
point y % de potencia a travs del display.
Fracasos
*No se pudo cerrar el lazo en la planta por
falta de tiempo. Slo se llego a prepear
todo y verificar que funcione.
*No se pudo hacer una buena presentacin en
el display por falta de memoria del micro.
Slo se pudo mostrar lo mnimo y necesario.
*No se llego a implementar un PI por falta
de tiempo y memoria. Se realiz un control
P.
Mejoras
*Usar un micro mas moderno con ms memoria
para evitar tantos problemas y prdida de
tiempo.

Pgina 30 de 30

Вам также может понравиться