Programa del microcontrolador
El programa de nuestro microcontrolador esta desarrollado en el lenguaje Mikrobasic de la empresa Mikroe. Este lenguaje de programación utiliza sentencias al estilo de Basic.
Mikrobasic nos ofrece una amplia gama de microcontroladores soportados incluyendo muchos microcontroladores de alta gama, también incluye diversas marcas pasando por los PIC.
El programa completo se encuentra en el cuadro inferior y será detallado más adelante en el presente informe.
program incubadora
SYMBOL ICERRAR = PORTB.1
SYMBOL IABRIR = PORTB.4
SYMBOL IINICIO = PORTB.6
SYMBOL IPARAR = PORTB.7
SYMBOL INIVEL = PORTA.7
SYMBOL ICOCINA = PORTA.6
SYMBOL OABRIR = PORTA.1
SYMBOL OCERRAR = PORTA.2
SYMBOL OCOCINA = PORTA.3
SYMBOL OMOTOR = PORTA.4
'1. Declaración de variables
dim habilitar as byte
dim incr as word
dim REF as WORD
dim REF_TXT as string [10]
dim incr_txt as string [10]
dim ref1 as float
dim porc as float
'2. Declaración de procedimientos
sub procedure cerrar
OCERRAR = 1
OABRIR = 0
end sub
sub procedure abrir
OCERRAR = 0
OABRIR = 1
end sub
sub procedure leer_temp
REF = ADC_READ(0)
REF1 = 3*(REF -726)/20 + 31
floatTOSTR(REF1, REF_TXT)
end sub
sub procedure forzar
IF IINICIO = 0 THEN
habilitar = 1
END IF
IF IABRIR = 0 THEN
abrir
END IF
IF ICERRAR = 0 THEN
cerrar
END IF
if ICOCINA = 0 then
OCOCINA = 1
end if
if ICOCINA = 1 then
OCOCINA = 0
end if
if IPARAR = 0 THEN
incr = 0
delay_ms(2000)
TRISB = %00000100
LCD_out(1,1, "El contador ha ")
LCD_out(2,1, "sido reiniciado ")
TRISB = %11010110
END IF
end sub
sub procedure interrupt
if TestBit(PIR1,TMR2IF) = 1 then
Inc(incr)
PIR1.TMR2IF = 0
end if
end sub
sub procedure finaldeproceso
habilitar = 0
OCOCINA = 0
OMOTOR = 0
abrir
delay_ms(2000)
TRISB = %00000100
LCD_out(1,1, "Este Proceso ")
LCD_out(2,1, "ha terminado ")
TRISB = %11010110
end sub
main:
OSCCON = %01111110
ANSEL = 1
TRISA = %11100001
TRISB = %00000100
LCD_CONFIG(PORTB, 7,6,1,4, PORTB, 3,5,0)
delay_ms(2000)
LCD_cmd(lcd_clear)
Lcd_Cmd(Lcd_CURSOR_OFF)
LCD_out(1,3, "Bienvenido")
delay_ms(3000)
LCD_out(1,3, "Bienvenido")
LCD_out(2,1, "y preparado")
TRISB = %11010110
OMOTOR = 0
cerrar
T2CON = $FF
TMR2 = 0
INTCON = $C0
incr = 0
WHILE TRUE
forzar
PIE1.TMR2IE = 0
WHILE (habilitar = 1) and (INIVEL = 0)
PIE1.TMR2IE = 1
TRISB = %00000100
if incr < 102 then
LCD_out(1,1, "Inic de proceso")
end if
lcd_out(2,9, "temp")
lcd_out(2,13, ref_txt)
if incr = 102 then
lcd_out(1,1, "Estamos en ")
end if
if incr > 103 then
porc = incr/100
floatTOSTR(porc, incr_txt)
lcd_out(1,12, incr_txt)
end if
if OCOCINA = 1 THEN
lcd_out(2,1, "coc enc ")
else
lcd_out(2,1, "coc apa ")
END IF
TRISB = %11010110
if incr > 10000 then
finaldeproceso
incr = 0
break
end if
OMOTOR = 1
cerrar
leer_temp
IF ref1 < 42 THEN
OCOCINA = 1
END IF
IF ref1 > 43 THEN
OCOCINA = 0
END IF
IF IPARAR = 0 THEN
habilitar = 0
OMOTOR = 0
TRISB = %00000100
Lcd_cmd(lcd_clear)
Lcd_Cmd(Lcd_CURSOR_OFF)
delay_ms(1000)
LCd_out(1,1, "Estamos en pausa")
Lcd_out(2,1, "presione iniciar")
TRISB = %11010110
END IF
WEND
WEND
END.
Partes del programa
Declaración de símbolos
La declaración de símbolos sirve para representar casi cualquier fragmento de código de nuestro microcontrolador con nombres que nos sean familiares.
La declaración de símbolos es muy útil para recordar cuál es la conexión de los dispositivos hacia el microcontrolador.
SYMBOL ICERRAR = PORTB.1
SYMBOL IABRIR = PORTB.4
SYMBOL IINICIO = PORTB.6
SYMBOL IPARAR = PORTB.7
SYMBOL INIVEL = PORTA.7
SYMBOL ICOCINA = PORTA.6
SYMBOL OABRIR = PORTA.1
SYMBOL OCERRAR = PORTA.2
SYMBOL OCOCINA = PORTA.3
SYMBOL OMOTOR = PORTA.4
En el código de ejemplo se hace referencia a las entradas / salidas de nuestro microcontrolador y se las relaciona con nombres comunes como ICERRRAR u OCERRAR se les colocó las letras "I" y "O" en referencia a patillas que serán usadas como salidas o entradas.
Declaración de variables
Tomo programa necesita almacenar en su memoria valores momentáneos para luego ser usados dentro del transcurso del programa.
Aquí la lista de variables utilizadas en nuestro programa.
dim habilitar as byte
dim incr as word
dim REF as WORD
dim REF_TXT as string [10]
dim incr_txt as string [10]
dim ref1 as float
dim porc as float
Declaración de procedimientos
En los procedimientos se puede hacer referencia a rutinas que resultarían tediosas repetirlas dentro del cuerpo del programa.
sub procedure cerrar
OCERRAR = 1
OABRIR = 0
end sub
sub procedure abrir
OCERRAR = 0
OABRIR = 1
end sub
Arriba se encuentran algunos de los procedimientos más comunes y más sencillos de entender en ellos se explica el funcionamiento de abrir y cerrar la válvula.
Luego estos procedimientos pueden ser invocados con simplemente escribir el nombre del procedimiento.
Aquí se presenta el siguiente procedimiento.
sub procedure leer_temp
REF = ADC_READ(0)
REF1 = 3*(REF -726)/20 + 31
floatTOSTR(REF1, REF_TXT)
end sub
Este procedimiento posee una lectura del puerto ADC activado es decir el puerto analógico 0.
sub procedure forzar
IF IINICIO = 0 THEN
habilitar = 1
END IF
IF IABRIR = 0 THEN
abrir
END IF
IF ICERRAR = 0 THEN
cerrar
END IF
if ICOCINA = 0 then
OCOCINA = 1
end if
if ICOCINA = 1 then
OCOCINA = 0
end if
if IPARAR = 0 THEN
incr = 0
delay_ms(2000)
TRISB = %00000100
LCD_out(1,1, "El contador ha ")
LCD_out(2,1, "sido reiniciado ")
TRISB = %11010110
END IF
end sub
En este procedimiento se pueden leer cada uno de los botones conectados a nuestro microcontrolador, y luego toman medidas de acuerdo al botón que se presione.
sub procedure interrupt
if TestBit(PIR1,TMR2IF) = 1 then
Inc(incr)
PIR1.TMR2IF = 0
end if
end sub
Este procedimiento es el que se ejecuta durante la interrupción y hace que la variable incr se incremente en una cifra lo que hace que nos encontremos más cerca de nuestro proceso final.
sub procedure finaldeproceso
habilitar = 0
OCOCINA = 0
OMOTOR = 0
abrir
delay_ms(2000)
TRISB = %00000100
LCD_out(1,1, "Este Proceso ")
LCD_out(2,1, "ha terminado ")
TRISB = %11010110
end sub
El final de todo el proceso se encuentra detallado en el procedimiento "finaldeproceso" en ella la variable "habilitar" regresa a 0 y con ello el proceso se ve interrumpido como se puede apreciar más adelante en el cuerpo del programa, además de mostrar el mensaje de "Este proceso ha terminado.
Cuerpo del programa
main:
OSCCON = %01111110
ANSEL = 1
TRISA = %11100001
TRISB = %00000100
LCD_CONFIG(PORTB, 7,6,1,4, PORTB, 3,5,0)
delay_ms(2000)
LCD_cmd(lcd_clear)
Lcd_Cmd(Lcd_CURSOR_OFF)
LCD_out(1,3, "Bienvenido")
delay_ms(3000)
LCD_out(1,3, "Bienvenido")
LCD_out(2,1, "y preparado")
TRISB = %11010110
OMOTOR = 0
cerrar
T2CON = $FF
TMR2 = 0
INTCON = $C0
incr = 0
Este es el programa principal, la variable OSCCON es el que determina la frecuencia de operación de nuestro microcontrolador, gracias a este microcontrolador no requerimos del uso de cristales. Se puede usar el reloj interno de nuestro microcontrolador.
Luego se configura la pantalla LCD indicando cada uno de los pines a utilizar de nuestro micro para ser usados en el LCD.
Después se muestra el mensaje de Bienvenida, se apaga el motor, se cierra la válvula, posteriormente se configura el contador del microcontrolador.
En esta parte del programa se hace referencia a un WHILE TRUE el cual es una sentencia repetitiva que no ha de terminar.
WHILE TRUE
forzar
PIE1.TMR2IE = 0
Dentro de eta sentencia se llama al procedimiento forzar que es aquel que lee el estado de cada uno de los botones.
WHILE (habilitar = 1) and (INIVEL = 0)
PIE1.TMR2IE = 1
TRISB = %00000100
if incr < 102 then
LCD_out(1,1, "Inic de proceso")
end if
Luego se ingresa a otro while que sólo se activa cuando la variable habilitar es 1 y el la entrada de nivel es 0. Es decir cuando se ha presionado al menos una vez el botón IINICIO y el nivel se encuentra activado o el tanque está lleno.
La siguiente sentencia activa el contador interno del micro, y luego espera que nuestra variable incr alcance el valor de 102 para dejar de mostrar en la pantalla un mensaje de inicio de proceso.
lcd_out(2,9, "temp")
lcd_out(2,13, ref_txt)
if incr = 102 then
lcd_out(1,1, "Estamos en ")
end if
if incr > 103 then
porc = incr/100
floatTOSTR(porc, incr_txt)
lcd_out(1,12, incr_txt)
end if
if OCOCINA = 1 THEN
lcd_out(2,1, "coc enc ")
else
lcd_out(2,1, "coc apa ")
END IF
En las primeras dos sentencias del código arriba mostrada muestra el mensaje de la temperatura grabada en la variable "ref_txt".
Luego el siguiente "IF" muestra un fragmento del texto que aparece en la pantalla LCD. El "IF" posterior muestra la variable "incr" dividida en 100 para mostrar un valor en porcentaje del avance del proceso.
El siguiente "IF" dependerá si nuestra cocina se encuentra encendida o se encuentra apagada e informará al usuario con un mensaje de texto en la pantalla LCD.
TRISB = %11010110
if incr > 10000 then
finaldeproceso
incr = 0
break
end if
OMOTOR = 1
cerrar
leer_temp
En el código que se encuentra arriba se refiere al final de nuestro proceso se especifica que si nuestro contador llega al valor de 10 000 nuestro programa llegará automáticamente al final de proceso.
También se encuentra la sentencia que activa el motor de la batidora (OMOTOR =1) luego se especifica que la válvula se debe cerrar.
IF ref1 < 42 THEN
OCOCINA = 1
END IF
IF ref1 > 43 THEN
OCOCINA = 0
END IF
"ref1" es una variable en la cual se almacena de forma numérica la temperatura en grados centígrados. Está variable es la que determina si se prende o se apaga la cocina por tanto tiene como límites la temperatura mínima y la máxima permisible.
IF IPARAR = 0 THEN
habilitar = 0
OMOTOR = 0
TRISB = %00000100
Lcd_cmd(lcd_clear)
Lcd_Cmd(Lcd_CURSOR_OFF)
delay_ms(1000)
LCd_out(1,1, "Estamos en pausa")
Lcd_out(2,1, "presione iniciar")
TRISB = %11010110
END IF
WEND
WEND
END.
Este es el último "IF" y este se activa cuando el usuario presiona el botón de parado (IPARAR) con esta acción se rompe el bucle repetitivo además de mostrar el mensaje de "Estamos en pausa presione iniciar".
Por último se muestran las últimas sentencias que son las que cierran el bucle.

