Está en la página 1de 43

Circuitos Digitales II, Año 2016, Junio 11 de 2016. Universidad Tecnológica de Pereira. ISSN 0122-1701.

CONTROL DE TEMPERATURA ON/OF


Autor 1: Julio Cesar Ramírez Palacio, Autor 2: David Fernando
Cajígas.
Ingeniería Electrónica, Universidad Tecnológica de Pereira, Pereira, Colombia
julio.crp@hotmail.com, dfcajigas@utp.edu.co.

1. DESCRIPCIÓN DEL PROYECTO:


Este proyecto es un “control de temperatura ON/OF” este circuito nos brinda la posibilidad de controlar la
temperatura de un bombillo el cual permanecerá en un rango de temperatura determinado por el usuario. Este
rango es posible modificarlo mediante el uso de tres teclas las cuales son UP, DOWN, AJUSTE. Una vez se ha
presionado la tecla AJUSTE se deberá ajustar las dos temperatura denominadas T-, y T+, para poder volver a
adquirir la temperatura actual (Tact). T+ no podrá ser menor que T-. Es por ello que implementamos mediante
software una función la cual una vez fijado T- pasara a ser el mínimo valor que podrá adoptar T+. Aparte de
esto se diseñó una interfaz gráfica en matlab que se podrá comunicar serialmente con el circuito. Siendo así
una garantía para el usuario de poder comparar los datos mostrados en la pantalla LCD con los datos
observados en la interfaz que además de observar los valores del rango de temperatura numéricamente los
podrá también observar en una gráfica de temperatura con respecto al tiempo, pudiendo así visualizar el
comportamiento grafico de la temperatura del bombillo.

RESUMEN

 El proyecto desarrollado es un “control de temperatura ON/OF“; la funcionalidad la podríamos ver aplicada en


el sistema de control de un aire acondicionado; pero por razones prácticas acá controlaremos la temperatura
de una bombilla donde el usuario será quien decida entre que rangos de temperatura desea que permanezca
la bombilla. Este rango de temperatura podrá ser modificado por el usuario mediante tres pulsadores (UP,
DOWN, AJUSTE). El rango de temperatura mínimo se visualizara en el display como T-; y el de temperatura
máximo se visualizara como T+. Además con la ayuda de una interfaz desarrollada en matlab comunicada por
un puerto serie se podrá ver gráficamente la variación de la temperatura medida en tiempo real (Tact) y además
se observaran de igual modo las temperaturas establecidas por el usuario
Circuitos Digitales II, Año 2016, Junio 11 de 2016. Universidad Tecnológica de Pereira. ISSN 0122-1701. 1

DIAGRMAS DE BLOQUE

2. CONSIDERACIONES DE DISEÑO
Para el desarrollo de nuestra aplicación (Control De Temperatura ON/OF) se nos hizo conveniente utilizar los
puertos PTB y PTD. Debido a que en el puerto PTD contamos con el módulo de comunicación serial; y en el
puerto PTB nos coincidirían los pesos de los pines del MCU con los pines de la LCD; es por ello que omitimos el
uso del PTA ya que este puerto solo cuenta con 6 pines y no nos coincidirían los pesos con los de la LCD; por
ello no se nos era conveniente utilizarlo. Una vez establecimos este criterio configuramos los registros de
dirección de datos E/S así:

Configuración del registro de dirección de datos (DDRB) = 0xFC

Configuración del registro de dirección de datos (DDRD) = 0x04


Circuitos Digitales II, Año 2016, Junio 11 de 2016. Universidad Tecnológica de Pereira. ISSN 0122-1701. 1

REQUERIMIENTOS DE LA APLICACIÓN

 Para la construcción o ensamble de nuestra aplicación requerimos de los siguientes componentes:


I. Pantalla LCD, MCU JL8-08, pulsadores, condensadores, cristal, resistencias, potenciómetro, 1 relé,
diodo, diodo led, transistor 2N3904, sensor de temperatura LM-35 conector DB-9 hembra, CI-
MAX232, CI-LM358, plafón, bombillo de 100 watts.

MCU JL8-08: de este componente se requirió de tres de sus módulos; los cuales fueron el conversor
análogo-digital (ADC), comunicación serial asíncrono del MCU JL8-08 (RS-232), y el oscilador.

o El módulo análogo-digital ADC: fue utilizado con el propósito de convertir la señal análoga
capturada por el sensor de temperatura LM-35. Para la utilización de este módulo fue
necesario habilitar 2 de los 3 registros los cuales fueron; (ADSCR) Y (ADICLK).

Configuración de registro de entrada y control (ADSCR)=h”01”:

Decidimos colocar en 1 el bit 0 del registro (ADSCR) ya que seleccionando este bit o canal de
conversión (ADCH0) obtendríamos habilitada el pin (PTB1) como entrada (ADC). Y este es uno
de los pines que nos quedan libres del puerto (PTB). Ya que los otros pines estaban siendo
utilizados por la LCD. La habilitación de este pin (PTB1) como entrada la observamos en la
siguiente tabla
Circuitos Digitales II, Año 2016, Junio 11 de 2016. Universidad Tecnológica de Pereira. ISSN 0122-1701. 1

Tabla 1.

Configuración de registro del reloj de entrada (ADICLK) = h”20”

Este registro nos permite elegir la frecuencia de reloj para el (ADC) la cual debe ser
aproximadamente 1MHZ según el data-sheet del MCU. Y para lograr estar cerca de esta
frecuencia nos basamos en la tabla 2. La cual nos indica que si ponemos el bit 5 o (ADIV0) en
“1” y el divisor del reloj de bus será 2; y así estaremos lo más cerca posible de la frecuencia de
reloj sugerida. Este cálculo lo veremos más adelante en la sección de cálculos.
Circuitos Digitales II, Año 2016, Junio 11 de 2016. Universidad Tecnológica de Pereira. ISSN 0122-1701. 1

Tabla 2.

o Modulo comunicación serial asíncrona del MCU JL8-08 (RS-232): se usó para la lectura grafica
de la temperatura por medio del PC y mostrada por una interfaz creada en matlab. Para lograr
esta comunicación fue necesario habilitar 2 de los 3 registros de control (SCI) para así lograr
una velocidad de comunicación de 9600 baudios y un tamaño de 8 bits, sin paridad y con un
solo bit de paro (9600, 8, N, 1).

Configuración del registro de control 1 (SCC1) = h”40”

Este registro fue configurado así con el fin de lograr una velocidad de comunicación de 9600
baudios y un tamaño de 8 bits, sin paridad y con un solo bit de paro (9600, 8, N, 1). Esto lo
evidenciamos en la siguiente tabla 3.

Tabla 3.
Circuitos Digitales II, Año 2016, Junio 11 de 2016. Universidad Tecnológica de Pereira. ISSN 0122-1701. 1

Configuración del registro de control 2 (SCC2) = h”2C”

En este registro habilitamos SCRIE en “1” para generar las interrupciones de la CPU, TE y RE en
“1” es para mantener el transmisor y receptor activado ósea la PTD6 y PTD7 del MCU

o El modulo oscilador: es necesario ensamblarlo externamente para este tipo de MCU; ya que
no cuentan con su oscilador interno. Este circuito es el encargado de establecer la frecuencia
a la cual va a trabajar nuestro MCU

CI-LM-35: este circuito integrado es un sensor de temperatura el cual utilizamos para adquirir la
temperatura del bombillo de 100 watts. Esta señal análoga capturada es del orden de los (mV) por ello
fue necesario amplificar la señal con un CI-LM358 y posteriormente esta señal es enviada al PTB1 el
cual es un pin con la funcionalidad de ADC.
Este sensor tiene la capacidad de detectar cambios de temperatura cada 10mv, mientras que el
modulo (ADC) del MCU es capaz de detectar cambios de señales a los 20mV por ello es necesario
amplificar la señal, con un amplificador en configuración no inversora con una ganancia de 2v/v. el
acondicionamiento de esta señal la veremos en la sección de cálculos
Algunas características del sensor utilizado es que el opera con una alimentación de 4 hasta 30v y que
tiene la capacidad de medir temperaturas que estuviesen en el rango de −55℃ hasta 150℃ por lo
cual se nos acomoda para el desarrollo de nuestra aplicación en la cual tendremos temperaturas que
podrían variar entre 0℃ hasta 99℃

CI-LM358 : este circuito integrado es el encargado de la amplificación del voltaje que nos suministra
el sensor de temperatura. El cual se diseñó para que tuviese una ganancia de 2v/v

MAX-232 : es el encargado de realizar la comunicación serial entre el pc y el (MCU)

SELECCIÓN DEL MICROCONTROLADOR

 el microcontrolador (MCU) escogido es el MC68HC908Jl8 de Motorola

CALCULOS

 para el desarrollo de nuestro aplicación necesitamos tan solo de cuatro cálculos lo cuales fueron hallar la
Configuración del registro del reloj de entrada (ADICLK) del modulo (ADC), velocidad de comunicación serial,
acondicionamiento de la señal obtenida por el sensor, y resistencia del transistor el cual permite el paso a de
la alimentación del relé
Circuitos Digitales II, Año 2016, Junio 11 de 2016. Universidad Tecnológica de Pereira. ISSN 0122-1701. 1

Configuración del registro del reloj de entrada (ADICLK) del modulo (ADC):
Para configurar el registro del reloj de entrada (ADICLK) el cual debe ser aproximadamente de 1MHz;
debemos saber la frecuencia del bus. Una vez conocido este valor ya podremos conocer la frecuencia
de reloj a la que trabajara nuestro modulo (ADC).

Frecuencia del bus:


4.9152𝑀𝐻𝑍
𝐹𝐵𝑈𝑆 = =1.23MHZ
4

Posteriormente obtenemos la frecuencia de reloj del modulo (ADC):

𝐹𝐵𝑈𝑆 1.23𝑀𝐻𝑍
𝐹𝐴𝐷𝐶 = = = 614.4𝐾𝐻𝑍
𝐷𝐼𝑉 𝐴𝐷𝐶 2

Velocidad de comunicación serial: El calculo de la velocidad de comunicación resulta de la siguiente


ecuación asumiendo que PD=1 y BD=2
4.9152𝑀𝐻𝑍
𝑆𝐶𝐼𝐶𝐿𝐾 4
𝐵𝑎𝑢𝑑𝑒 𝑅𝑎𝑡𝑒 = = = 9600𝑏𝑝𝑠
64∗𝑃𝐷∗𝐵𝐷 64∗1∗2

Acondicionamiento de la señal obtenida par el sensor: como ya lo hemos dicho este sensor tiene la
capacidad de detectar cambios de temperatura cada 10mv por °C, mientras que el modulo (ADC) del
MCU es capaz de detectar cambios de señales a los 20mV por ello es necesario amplificar la señal, con
un amplificador en configuración no inversora con una ganancia de 2v/v, para ello se procedió así:
o Como el voltaje de salida entregado por el sensor hacia el amplificador esta dado por:
𝑉𝑠 = (10𝑚𝑉) ∗ 𝑇°𝐶 (𝐸𝐶1)

𝑣𝑜𝑢𝑡
Y sabemos que la ganancia (A) esta dada por 𝑣𝑖𝑛𝑡
donde 𝑣𝑜𝑢𝑡 para nuesto caso seria lo
mismo que 𝑉𝐴𝐷𝐶 ; y 𝑣𝑖𝑛𝑡 seria lo mismo que 𝑉𝑠 entonces tendremos que:
𝑣
𝐴 = 𝐴𝐷𝐶 (𝐸𝐶2)
𝑣𝑆

Despejando Vs de (𝐸𝐶2) y reemplazando en (𝐸𝐶1) y posteriormente despejando


T°C tenemos que:
100
𝑇°𝐶 = 𝐴
∗ 𝑣𝐴𝐷𝐶 (𝐸𝐶3)
Circuitos Digitales II, Año 2016, Junio 11 de 2016. Universidad Tecnológica de Pereira. ISSN 0122-1701. 1

Por otro por parte del (ADC) tenemos que:


𝑣𝐴𝐷𝐶 = 𝑅𝐸𝑆𝑉𝑂𝐿𝑇 ∗ 𝑣𝐷𝐼𝐺 (𝐸𝐶4)

Reemplazando (𝐸𝐶4) en (𝐸𝐶3) y despejando 𝑅𝐸𝑆𝑉𝑂𝐿𝑇 tenemos que:


𝑉
𝑅𝐸𝑆𝑉𝑂𝐿𝑇 = 1.96078 ∗ 10−2 (𝑏𝑖𝑡) (𝐸𝐶5)

Reemplazando (𝐸𝐶5) en (𝐸𝐶4) y este resultando se reemplaza en (𝐸𝐶3) llegamos a la


Conclusión de que:
𝑇°𝐶 = 𝑣𝐷𝐼𝐺 (𝐸𝐶6)

Finalmente concluimos que para leer la temperatura se deberá leer el registro de datos.

Resistencia del transistor: esta resistencia es la resistencia de base de un transistor en donde este es
es el que permite el paso de corriente para la alimentación de la bobina del relé el cual tiene una
resistencia interna de 113 ohmios según su data_sheet. Este relé es el que cierra el circuito de la
alimentación del bombillo.
Para el cálculo de esta resistencia se tiene la siguiente ecuación

𝑉𝑖−𝑉𝑏𝑒 5−0.7
𝑅𝐵 = 𝐼𝑐 𝑅𝐵 = 5 = 17𝐾
𝛽 113
175
Circuitos Digitales II, Año 2016, Junio 11 de 2016. Universidad Tecnológica de Pereira. ISSN 0122-1701. 1

3. DIAGRAMA CIRCUITAL

Circuitos Digitales II, Año 2016, Junio 11 de 2016. Universidad Tecnológica de Pereira. ISSN 0122-1701. 1

4. DIAGRAMAS DE FLUJO Y PROGRAMAS DE LA APLICACIÓN TANTO DEL MICROCONTROLADOR COMO DEL PC


(SOFTWARE)

 DIAGRAMAS DE FLUJO:

Inicio
Main
MAINMA

Configuración

Temp_obt

Detec_pul

Ctrl_temp

Comu_pc
Circuitos Digitales II, Año 2016, Junio 11 de 2016. Universidad Tecnológica de Pereira. ISSN 0122-1701. 1

Temp_obj

Config=”0”

ADCO=0

COC0=O

Tobt<=99

Envio coco

Detec_pul

Tecla==”0

Circuitos Digitales II, Año 2016, Junio 11 de 2016. Universidad Tecnológica de Pereira. ISSN 0122-1701. 1

Detec_pul

Tecla==”0”

No se presiona pul

Tecla==”1”

Config T+ Y T-

Tecla==”2

Circuitos Digitales II, Año 2016, Junio 11 de 2016. Universidad Tecnológica de Pereira. ISSN 0122-1701. 1

CTrl_temp

Temp-obj
Detect_pul Ajuste=’0’ Tact=’t-

PTD2=1

Tact>=
t+

PTD2=0

CTRL_Temp
Circuitos Digitales II, Año 2016, Junio 11 de 2016. Universidad Tecnológica de Pereira. ISSN 0122-1701. 1
Envio_comp

Cnfg==”0”

Fla=´1´?

Scte=’0’?

SCDR=deci+0x30

Scte==´0´
?

Scdr=uni+0x30

Scte==’0’
?

Sdcr=dec+0x30

Scte==’0’?

A
Circuitos Digitales II, Año 2016, Junio 11 de 2016. Universidad Tecnológica de Pereira. ISSN 0122-1701. 1

Scdr=unim+0x30

Scte==’0’
?

Scdr=decact+0x30

Scte==’0’
?

Scdr=uniact+0x30 Scte==’0
’?

Scte==0?

Fla==0

FIN
Circuitos Digitales II, Año 2016, Junio 11 de 2016. Universidad Tecnológica de Pereira. ISSN 0122-1701. 1

 Código de la guide de matlab

function varargout = Temp(varargin)

% Medidor de temperatura con comunicación serial. Ejemplo 12.

% Código de inicialización - NO EDITAR

gui_Singleton = 1;

gui_State = struct('gui_Name', mfilename, ...

'gui_Singleton', gui_Singleton, ...

'gui_OpeningFcn', @Temp_OpeningFcn, ...

'gui_OutputFcn', @Temp_OutputFcn, ...

'gui_LayoutFcn', [] , ...

'gui_Callback', []);

if nargin && ischar(varargin{1})

gui_State.gui_Callback = str2func(varargin{1});

end

if nargout

[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});

else

gui_mainfcn(gui_State, varargin{:});

end

% --- Subfunción de apertura

function Temp_OpeningFcn(hObject, eventdata, handles, varargin)

% Asignación variable de salida de la GUI

handles.output = hObject;

% Creación del objeto puerto serie

% Configuración por defecto -> 9600,8,N,1


Circuitos Digitales II, Año 2016, Junio 11 de 2016. Universidad Tecnológica de Pereira. ISSN 0122-1701. 1

handles.puerto=serial('COM1');

% Apertura del puerto serial

fopen(handles.puerto);

% Actualiza estructura de handles

guidata(hObject, handles);

% --- Subfunción de salida

function varargout = Temp_OutputFcn(hObject, eventdata, handles)

% Variable de salida de la GUI

varargout{1} = handles.output;

% --- Subfunción de callback para pushbutton1

function pushbutton1_Callback(hObject, eventdata, handles)

% Averigua estado del botón

estado=get(handles.pushbutton1,'Value');

t = linspace(0,1,400);

y = zeros(size(t));

X =1;

% Ciclo para la temperatura

while estado==1

% Envía caracter de solicitud

fprintf(handles.puerto,'*');

% Espera de 200ms

pause(0.2);

% Lectura de la temperatura

datos=fscanf(handles.puerto);

if ((datos(1,1)-48)==0)
Circuitos Digitales II, Año 2016, Junio 11 de 2016. Universidad Tecnológica de Pereira. ISSN 0122-1701. 1

msgbox('¡Config de Temp!','Mensaje');

end

if ((datos(1,1)-48)~=0)

liminf=(((datos(1,1)-48)*10)+(datos(1,2)-48));

limsup=(((datos(1,3)-48)*10)+(datos(1,4)-48));

y(end) = (((datos(1,5)-48)*10)+(datos(1,6)-48));

% Envío de la temperatura a la GUI

set(handles.text9,'String',[datos(1:2) '°C']);

set(handles.text11,'String',[datos(3:4) '°C']);

set(handles.text2,'String',[datos(5:6) '°C']);

%set(handles.text3,'String',[datos(3:4) '°C']);

y(1:end-1) = y(2:end);

axes(handles.axes2);

plot(t,y,'b',t,liminf,'g',t,limsup,'g');

title('Proyecto Digitales II');

xlabel('Tiempo');

ylabel('Temp');

ylim([0 100]);

grid on

drawnow

% Averigua de nuevo el estado del botón

estado=get(handles.pushbutton1,'Value');

end

end

% --- Executes on button press in pushbutton2.

function pushbutton2_Callback(hObject, eventdata, handles)


Circuitos Digitales II, Año 2016, Junio 11 de 2016. Universidad Tecnológica de Pereira. ISSN 0122-1701. 1

estado=get(handles.pushbutton2,'Value');

while estado==1

fprintf(handles.puerto,'*');

pause(0.2);

datos=fscanf(handles.puerto);

% hObject handle to pushbutton2 (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB

% handles structure with handles and user data (see GUIDATA)

set(handles.text9,'String',['°C']);

set(handles.text11,'String',['°C']);

set(handles.text2,'String',['°C']);

estado=get(handles.pushbutton1,'Value');

end

function figure1_CloseRequestFcn(hObject, eventdata, handles)

% Cierre y borrado del puerto serial

fclose(handles.puerto);

delete(handles.puerto);

% Cierre de la GUI

delete(hObject);

function pushbutton3_Callback(hObject, eventdata, handles)

% hObject handle to pushbutton3 (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB


Circuitos Digitales II, Año 2016, Junio 11 de 2016. Universidad Tecnológica de Pereira. ISSN 0122-1701. 1

% handles structure with handles and user data (see GUIDATA)

estado=get(handles.pushbutton3,'Value');

t = linspace(0,1,400);

y = zeros(size(t));

X =1;

% Ciclo para la temperatura

while estado==1

% Envía caracter de solicitud

fprintf(handles.puerto,'*');

% Espera de 200ms

pause(0.2);

% Lectura de la temperatura

datos=fscanf(handles.puerto);

if ((datos(1,1)-48)==0)

msgbox('¡Config de Temp!','Mensaje');

end

if ((datos(1,1)-48)~=0)

liminf=(((datos(1,1)-48)*10)+(datos(1,2)-48));

limsup=(((datos(1,3)-48)*10)+(datos(1,4)-48));

y(end) = (((datos(1,5)-48)*10)+(datos(1,6)-48));

% Envío de la temperatura a la GUI

set(handles.text9,'String',[datos(1:2) '°C']);

set(handles.text11,'String',[datos(3:4) '°C']);

set(handles.text2,'String',[datos(5:6) '°C']);

%set(handles.text3,'String',[datos(3:4) '°C']);

y(1:end-1) = y(2:end);

axes(handles.axes2);
Circuitos Digitales II, Año 2016, Junio 11 de 2016. Universidad Tecnológica de Pereira. ISSN 0122-1701. 1

plot(t,y,'b',t,liminf,'g',t,limsup,'g');

title('Proyecto Digitales II');

xlabel('Tiempo');

ylabel('Temp');

ylim([0 100]);

grid on

drawnow

% Averigua de nuevo el estado del botón

estado=get(handles.pushbutton1,'Value');

end

end

function figure1_CloseRequestFcn(hObject, eventdata, handles)

% Cierre y borrado del puerto serial

fclose(handles.puerto);

delete(handles.puerto);

% Cierre de la GUI

delete(hObject);

 Código en ensambldor

/******************************************************************/
/* NOMBRE1:David Fernando Cajigas Cordoba */
/* NOMBRE2:Julio Cesar Ramirez */
/* VERSIÓN: Control ON/OF TEMP */
/******************************************************************/
Circuitos Digitales II, Año 2016, Junio 11 de 2016. Universidad Tecnológica de Pereira. ISSN 0122-1701. 1

#include <hidef.h> /* Macros */


#include "derivative.h" /* Registros MCU */

//Variables para las funciones de retardo


volatile char K1@0x0060,K2@0x0061,TECLA@0x0062;
// Mensajes
const char MSG1[]="Tact: °C";
const char MSG2[]="T-:00°C";
const char MSG3[]="T+:00°C";
const char MSG4[]="Cnfg";
//Variables para temperaturas
unsigned char UNIMIN;
unsigned char TMIN;
unsigned char DECMAX;
unsigned char UNIMAX;
unsigned char DECMED;
unsigned char UNIMED;
unsigned char TMED;
unsigned char DECMIN;
unsigned char TMAX;
unsigned char i,aux,AJUSTE,AUXDEC,AUXUNI;
unsigned char FLAG=0;
unsigned char alto;
void RETARDO (void) {
asm {
mov #100,K1
LAZO1: mov #248,K2
LAZO2: dbnz K2,LAZO2
dbnz K1,LAZO1
rts
}
}
// Retardos LCD
void ret_lcd1(void) {
asm {
mov #12,K1 ; Carga constante de retardo 1
LAZO: dbnz K1,LAZO ; Ciclo interno
}
}

void ret_lcd2(void) {
asm {
Circuitos Digitales II, Año 2016, Junio 11 de 2016. Universidad Tecnológica de Pereira. ISSN 0122-1701. 1

mov #15,K1 ; Carga constante de retardo 1


LAZO1: mov #26,K2 ; Carga constante de retardo 2
LAZO2: dbnz K2,LAZO2 ; Ciclo interno
dbnz K1,LAZO1 ; Ciclo externo
}
}
void ret_lcd3(void) {
asm {
mov #50,K1 ; Carga constante de retardo 1
LAZO1: mov #23,K2 ; Carga constante de retardo 2
LAZO2: dbnz K2,LAZO2 ; Ciclo interno
dbnz K1,LAZO1 ; Ciclo externo
}
}

void cmd_lcd(char cmd) {


PTB=cmd&0xF0;
PTB_PTB3=1;
PTB_PTB3=0;
if (cmd==0x01) {
ret_lcd2();
} else {
ret_lcd1();
}
PTB=cmd<<4;
PTB_PTB3=1;
PTB_PTB3=0;
if (cmd==0x01) {
ret_lcd2();
} else {
ret_lcd1();
}
}

//inicio LCD
void ini_lcd(void) {
ret_lcd3();
ret_lcd3();
ret_lcd3();
ret_lcd3();
PTB=0x30;
PTB_PTB3=1;
PTB_PTB3=0;
Circuitos Digitales II, Año 2016, Junio 11 de 2016. Universidad Tecnológica de Pereira. ISSN 0122-1701. 1

ret_lcd3();
PTB=0x30;
PTB_PTB3=1;
PTB_PTB3=0;
ret_lcd1();
ret_lcd1();
PTB=0x30;
PTB_PTB3=1;
PTB_PTB3=0;
ret_lcd1();
PTB=0x20;
PTB_PTB3=1;
PTB_PTB3=0;
ret_lcd1();
cmd_lcd(0x28);
cmd_lcd(0x0C);
cmd_lcd(0x01);
cmd_lcd(0x06);

cmd_lcd(0x83);
for(i=0;i!=9;i++) {
dat_lcd(MSG1[i]);
}

cmd_lcd(0xC0); //Posición 0, renglón 2


for(i=0;i!=7;i++) {
dat_lcd(MSG2[i]);
}
//Envío del mensaje 3 (renglón 2)
cmd_lcd(0xC8); //Posición 8, renglón 2
for(i=0;i!=7;i++) {
dat_lcd(MSG3[i]);
}
cmd_lcd(0x87); //Posición 8, renglón 2
dat_lcd(0xDF);
cmd_lcd(0xC5);
dat_lcd(0xDF);
cmd_lcd(0xCD);

dat_lcd(0xDF);
}
void mos_decmin(){
switch (DECMIN){
case 0:
cmd_lcd(0xC3);
Circuitos Digitales II, Año 2016, Junio 11 de 2016. Universidad Tecnológica de Pereira. ISSN 0122-1701. 1

dat_lcd('0');
cmd_lcd(0xC3);
break;
case 1:
cmd_lcd(0xC3);
dat_lcd('1');
cmd_lcd(0xC3);
break;
case 2:
cmd_lcd(0xC3); //Posición 5, renglón 1
dat_lcd('2');
cmd_lcd(0xC3);
break;
case 3:
cmd_lcd(0xC3)
dat_lcd('3');
cmd_lcd(0xC3);
break;
case 4:
cmd_lcd(0xC3);
dat_lcd('4');
cmd_lcd(0xC3);
break;
case 5:
cmd_lcd(0xC3);
dat_lcd('5');
cmd_lcd(0xC3);
break;
case 6:
cmd_lcd(0xC3);
dat_lcd('6');
cmd_lcd(0xC3);
break;
case 7:
cmd_lcd(0xC3);
dat_lcd('7');
cmd_lcd(0xC3);
break;

case 8:
cmd_lcd(0xC3);
dat_lcd('8');
cmd_lcd(0xC3);
break;
case 9:
cmd_lcd(0xC3);
Circuitos Digitales II, Año 2016, Junio 11 de 2016. Universidad Tecnológica de Pereira. ISSN 0122-1701. 1

dat_lcd('9');
cmd_lcd(0xC3);
break;
}
}

void mos_unimax(){
switch (UNIMAX){
case 0:
cmd_lcd(0xCC);
dat_lcd('0');
cmd_lcd(0xCC);
break;
case 1:
cmd_lcd(0xCC);
dat_lcd('1');
cmd_lcd(0xCC);
break;
case 2:
cmd_lcd(0xCC);
dat_lcd('2');
cmd_lcd(0xCC);

break;
case 3:
cmd_lcd(0xCC);
dat_lcd('3');
cmd_lcd(0xCC);
break;
case 4:
cmd_lcd(0xCC)
dat_lcd('4');
cmd_lcd(0xCC);
break;
case 5:
cmd_lcd(0xCC);
dat_lcd('5');
cmd_lcd(0xCC);
break;
case 6:
cmd_lcd(0xCC);
Circuitos Digitales II, Año 2016, Junio 11 de 2016. Universidad Tecnológica de Pereira. ISSN 0122-1701. 1

dat_lcd('6');
cmd_lcd(0xCC);
break;
case 7:
cmd_lcd(0xCC);
dat_lcd('7');
cmd_lcd(0xCC);
break;

case 8:
cmd_lcd(0xCC);
dat_lcd('8');
cmd_lcd(0xCC);
break;
case 9:
cmd_lcd(0xCC);
dat_lcd('9');
cmd_lcd(0xCC);
break;
}
}
void mos_decmax(){
switch (DECMAX){
case 0:
cmd_lcd(0xCB);
dat_lcd('0');
cmd_lcd(0xCB);
break;
case 1:
cmd_lcd(0xCB);
dat_lcd('1');
cmd_lcd(0xCB);
break;
case 2:
cmd_lcd(0xCB);
dat_lcd('2');
cmd_lcd(0xCB);
break;
case 3:
cmd_lcd(0xCB);
dat_lcd('3');
cmd_lcd(0xCB);
break;
case 4:
cmd_lcd(0xCB);
dat_lcd('4');
Circuitos Digitales II, Año 2016, Junio 11 de 2016. Universidad Tecnológica de Pereira. ISSN 0122-1701. 1

cmd_lcd(0xCB);
break;
case 5:
cmd_lcd(0xCB);
dat_lcd('5');
cmd_lcd(0xCB);
break;
case 6:
cmd_lcd(0xCB);
dat_lcd('6');
cmd_lcd(0xCB);
break;
case 7:
cmd_lcd(0xCB);
dat_lcd('7');
cmd_lcd(0xCB);
break;

case 8:
cmd_lcd(0xCB);
dat_lcd('8');
cmd_lcd(0xCB)
break;
case 9:
cmd_lcd(0xCB);
dat_lcd('9');
cmd_lcd(0xCB)
break;
}
}
void mos_unimin(){
switch (UNIMIN){
case 0:
cmd_lcd(0xC4); // psociones lcd
dat_lcd('0');
cmd_lcd(0xC4);
break;
case 1:
cmd_lcd(0xC4);
dat_lcd('1');
cmd_lcd(0xC4);
break;
case 2:
cmd_lcd(0xC4);
dat_lcd('2');
cmd_lcd(0xC4);
Circuitos Digitales II, Año 2016, Junio 11 de 2016. Universidad Tecnológica de Pereira. ISSN 0122-1701. 1

break;
case 3:
cmd_lcd(0xC4);
dat_lcd('3');
cmd_lcd(0xC4);
break;
case 4:
cmd_lcd(0xC4);
dat_lcd('4');
cmd_lcd(0xC4);
break;
case 5:
cmd_lcd(0xC4);
dat_lcd('5');
cmd_lcd(0xC4);
break;
case 6:
cmd_lcd(0xC4);
dat_lcd('6');
cmd_lcd(0xC4);
break;
case 7:
cmd_lcd(0xC4);
dat_lcd('7');
cmd_lcd(0xC4);
break;

case 8:
cmd_lcd(0xC4);
dat_lcd('8');
cmd_lcd(0xC4);
break;
case 9:
cmd_lcd(0xC4);
dat_lcd('9');
cmd_lcd(0xC4);
break;
}

}
void adq_temp ()
{
if (AJUSTE==0||AJUSTE==2||AJUSTE==4){
//Solicita una muestra y espera resultado de conversión
ADSCR_ADCO=0;
while (ADSCR_COCO==0);
Circuitos Digitales II, Año 2016, Junio 11 de 2016. Universidad Tecnológica de Pereira. ISSN 0122-1701. 1

//Descompone resultado en unidades y decenas.


TMED=ADR;
DECMED=TMED/10;
UNIMED=TMED%10;
if (TMED<=99){

//envio decenass de tmedida a lcd


switch (DECMED){
case 0:
cmd_lcd(0x88);
dat_lcd('0');
break;
case 1:
cmd_lcd(0x88);
dat_lcd('1');
break;
case 2:
cmd_lcd(0x88);
dat_lcd('2');
break;
case 3:
cmd_lcd(0x88);
dat_lcd('3');
break;
case 4:
cmd_lcd(0x88);
dat_lcd('4');
break;
case 5:
cmd_lcd(0x88);
dat_lcd('5');
break;
case 6:
cmd_lcd(0x88);
dat_lcd('6');
break;
case 7:
cmd_lcd(0x88);
dat_lcd('7');
break;

case 8:
cmd_lcd(0x88);
dat_lcd('8');
break;
case 9:
Circuitos Digitales II, Año 2016, Junio 11 de 2016. Universidad Tecnológica de Pereira. ISSN 0122-1701. 1

cmd_lcd(0x88);
dat_lcd('9');
break;
}

switch (UNIMED){
case 0:
cmd_lcd(0x89);
dat_lcd('0');
break;
case 1:
cmd_lcd(0x89);
dat_lcd('1');
break;
case 2:
cmd_lcd(0x89);
dat_lcd('2');
break;
case 3:
cmd_lcd(0x89);
dat_lcd('3');
break;
case 4:
cmd_lcd(0x89);
dat_lcd('4');
break;
case 5:
cmd_lcd(0x89);
dat_lcd('5');
break;
case 6:
cmd_lcd(0x89);
dat_lcd('6');
break;
case 7:
cmd_lcd(0x89);
dat_lcd('7');
break;

case 8:
cmd_lcd(0x89);
dat_lcd('8');
break;
case 9:
cmd_lcd(0x89);
dat_lcd('9');
Circuitos Digitales II, Año 2016, Junio 11 de 2016. Universidad Tecnológica de Pereira. ISSN 0122-1701. 1

break;
}

} else{

cmd_lcd(0x88);
dat_lcd('N');
cmd_lcd(0x89);
dat_lcd('D');
}
}
}

char PUL(){
asm{
brset 3,PTD,UNO
brset 4,PTD,TRES
brset 5,PTD,DOS
clr TECLA
rts
UNO: jsr RETARDO
UN: brset 3,PTD,UN
jsr RETARDO
lda #1
sta TECLA
rts
DOS: jsr RETARDO
DO: brset 5,PTD,DO
jsr RETARDO
lda #2
sta TECLA
rts
TRES: jsr RETARDO
TR: brset 4,PTD,TR
jsr RETARDO
lda #3
sta TECLA
rts
}
return TECLA;
}
void LeePul() {
PUL();
if (TECLA==0){
}
Circuitos Digitales II, Año 2016, Junio 11 de 2016. Universidad Tecnológica de Pereira. ISSN 0122-1701. 1

if (TECLA==1){
AJUSTE++;
if (AJUSTE==1){
cmd_lcd(0xC3);
cmd_lcd(0x0D);
}
if (AJUSTE==2){
cmd_lcd(0x0C);
}
if (AJUSTE==3){
cmd_lcd(0xC4);
cmd_lcd(0x0D);
}
if (AJUSTE==4){
if(DECMIN==9&&UNIMIN>4){
UNIMIN=4;
mos_unimin();
cmd_lcd(0x0C);
TMIN=(DECMIN*10+UNIMIN);
TMAX=TMIN+4;
DECMAX=TMAX/10;
UNIMAX=TMAX%10;
AUXDEC=DECMAX;
AUXUNI=UNIMAX;
mos_decmax();
mos_unimax();

} else
cmd_lcd(0x0C);
TMIN=(DECMIN*10+UNIMIN);
TMAX=TMIN+4;
DECMAX=TMAX/10;
UNIMAX=TMAX%10;
AUXDEC=DECMAX;
AUXUNI=UNIMAX;
mos_decmax();
mos_unimax();
}
if (AJUSTE==5){
cmd_lcd(0xCB);
cmd_lcd(0x0D);
}
if (AJUSTE==6){
cmd_lcd(0X0C);
if (AJUSTE==7){
Circuitos Digitales II, Año 2016, Junio 11 de 2016. Universidad Tecnológica de Pereira. ISSN 0122-1701. 1

cmd_lcd(0xCC);
cmd_lcd(0x0D);
}
if (AJUSTE==8){
cmd_lcd(0x0C);
TMAX=(DECMAX*10+UNIMAX);
mos_unimax();
AJUSTE=0;
}
}

if (TECLA==2){
if(AJUSTE==1) {
if (DECMIN<=8){
DECMIN++;
mos_decmin();
}
else
DECMIN=0;
mos_decmin();
}
if (AJUSTE==3) {
if (DECMIN==9) {
if (UNIMIN<4) {
UNIMIN++;
mos_unimin();
}
else
UNIMIN=0;
mos_unimin();
}
if (DECMIN!=9) {
if(UNIMIN<9) {
UNIMIN++;
mos_unimin();
}else
UNIMIN=0;
mos_unimin();
}
}
if (AJUSTE==5) {
if (DECMAX>=AUXDEC && DECMAX<9){
DECMAX++;
mos_decmax();
}
else
Circuitos Digitales II, Año 2016, Junio 11 de 2016. Universidad Tecnológica de Pereira. ISSN 0122-1701. 1

DECMAX=AUXDEC;
mos_decmax();
}
if (AJUSTE==7) { .

if (DECMAX==AUXDEC){
if (UNIMAX>=AUXUNI && UNIMAX<9){
UNIMAX++;
mos_unimax();
}
else
UNIMAX=AUXUNI;
mos_unimax();
}
if (DECMAX!=AUXDEC){
if(UNIMAX<9){
UNIMAX++;
mos_unimax();
}else
UNIMAX=0;
mos_unimax();
}
}
}

if (TECLA==3){
if (AJUSTE==1) {
if (DECMIN!=0){
DECMIN--;
mos_decmin();
}
else
DECMIN=9;
mos_decmin();
}

if (AJUSTE==3){
if (DECMIN==9){
if (UNIMIN!=0){
UNIMIN--;
mos_unimin();
}
else
UNIMIN=4;
mos_unimin();
}
Circuitos Digitales II, Año 2016, Junio 11 de 2016. Universidad Tecnológica de Pereira. ISSN 0122-1701. 1

if (DECMIN!=9) {
if(UNIMIN!=0){
UNIMIN--;
mos_unimin();
}
else
UNIMIN=9;
mos_unimin();
}
}
if (AJUSTE==5){
if (DECMAX>AUXDEC&&DECMAX<=9){
DECMAX--;
mos_decmax();
}
else
DECMAX=9;
mos_decmax();
}

if (AJUSTE==7){
if (DECMAX==AUXDEC){
if (UNIMAX>AUXUNI && UNIMAX<=9){
UNIMAX--;
mos_unimax();
}
else
UNIMAX=9;
mos_unimax();
}
if (DECMAX!=AUXDEC){
if(UNIMAX>0&&UNIMAX<=9){
UNIMAX--;
mos_unimax();
} else
UNIMAX=9;
mos_unimax();
}
}

}
}
void Env_pc(){ //Funcion para enviar temp
if(AJUSTE!=0){
if (SCS1_SCTE==0);
SCDR=0+0x30;
Circuitos Digitales II, Año 2016, Junio 11 de 2016. Universidad Tecnológica de Pereira. ISSN 0122-1701. 1

while (SCS1_SCTE==0);
SCDR=0x0A;
FLAG=0;
}
if (AJUSTE==0){
if (FLAG==1) {
while (SCS1_SCTE==0);
SCDR=DECMIN+0x30;
while (SCS1_SCTE==0);
SCDR=UNIMIN+0x30;
while (SCS1_SCTE==0);
SCDR=DECMAX+0x30; //Envía decenas de T+
while (SCS1_SCTE==0);
SCDR=UNIMAX+0x30; //Envía unidades de T+
while (SCS1_SCTE==0);
SCDR=DECMED+0x30; //Envía decenas de Tact
while (SCS1_SCTE==0);
SCDR=UNIMED+0x30; //Envía unidades de Tact
while (SCS1_SCTE==0);
SCDR=0x0A; //Envía terminador (LF)
FLAG=0;
}
}
}

void Ctrl_Temps (){


unsigned char A=0;
unsigned char B=0;
if(AJUSTE==0){ //valida que no se este editnado el rango de temperaturas (Tmin y
Tmax)
if(TMED<=TMIN){
alto=0;
}
if(TMED>=TMAX){
alto=1;
}
if(TMED<=TMIN){ //compara Tmed con Tmin para encender calefactor
PTD_PTD2=1;
}

A=TMIN-6;
B=TMAX+6;

if(TMED>=A && TMED<=B){


if(alto==1 ){
Circuitos Digitales II, Año 2016, Junio 11 de 2016. Universidad Tecnológica de Pereira. ISSN 0122-1701. 1

PTD_PTD2=0;
}else
PTD_PTD2=1;
}
}
else
PTD_PTD2=0;
}
interrupt 13 void INT_REC(void) {
char AUX; //Variable auxiliar
AUX=SCS1; //Reconoce recepción
if (SCDR=='*') //Valida si es el caracter de solicitud y si hay solicitudes pendientes
if (FLAG==0) //Indica solicitud de envío pendiente
FLAG=1;
}
//Programa principal
void main(void) {
//Configuración MCU
CONFIG1_COPD=1;
DDRB=0xFD;
DDRD=0x44;
PTD_PTD2=0;
AJUSTE=0;
ADICLK=0x20;
ADSCR=0x01;

//Comunicacion serial

SCC1=0x40; //SCI
SCC2=0x2C;
SCBR=0x01;
EnableInterrupts; //Habilita interrupciones

ini_lcd(); //Inicialización de la pantalla LCD

for (;;){ //lazo principal


adq_temp();
LeePul();
Ctrl_Temps();
Env_pc();

if (AJUSTE!=0){ //parpadeo de un led si se esta editando la temperatura


PTB_PTB0=1; //Posición 0, renglón 2
RETARDO();
PTB_PTB0=0;
RETARDO();
Circuitos Digitales II, Año 2016, Junio 11 de 2016. Universidad Tecnológica de Pereira. ISSN 0122-1701. 1

}
}
}
Circuitos Digitales II, Año 2016, Junio 11 de 2016. Universidad Tecnológica de Pereira. ISSN 0122-1701. 1

5. PRUEBAS DEL SISTEMA

DATOS E IMÁGENES DE DIFERENTES SITUACIONES A LAS QUE SE SOMETE EL DISPOSITIVO, PARA DEMOSTRAR SU
CORRECTO FUNCIONAMIENTO.

 Algunas de la imágenes de la prueba de funcionamiento:


Circuitos Digitales II, Año 2016, Junio 11 de 2016. Universidad Tecnológica de Pereira. ISSN 0122-1701. 1

6. PROTOTIPO: MÍNIMO MONTAJE EN EL PROTOBOARD (PRUEBA DE FUNCIONAMIENTO

 A continuación veremos algunas imágenes del circuito ya ensamblado totalmente y algunas imágenes como
prueba de su correcto funcionamiento:
Circuitos Digitales II, Año 2016, Junio 11 de 2016. Universidad Tecnológica de Pereira. ISSN 0122-1701. 1
Circuitos Digitales II, Año 2016, Junio 11 de 2016. Universidad Tecnológica de Pereira. ISSN 0122-1701. 1

También podría gustarte