Paso 6: El programa
Los archivos aquí son una versión de texto del programa C junto con el archivo de diseñador de ciprés completado en formato zip.Su no muy larga...
//----------------------------------------------------------------------------
Programa en C para controlador de temperatura PSOC
//----------------------------------------------------------------------------
#include < m8c.h > / / parte específicas constantes y macros
#include "PSoCAPI.h" / / definiciones de PSoC API para todos los módulos de usuario
#include "stdlib.h"
int MAXC = 0;
int TEMPC = 500;
Char [grados centígrados] = "500";
Char [] degF = "932";
int TEMPF = 932;
void main()
{
int w, z;
int BenzLeer, KeyBuffer;
int x, buffer;
Float temperatura = 0;
flotador temperature2 = 0;
int cuenta = 0;
int tope = 1;
int CycleBuffer;
int base = 1;
int InputADC;
int InputADC2;
char lcd_Reading [8];
char lcd_Setting [8];
PGA_1_SetGain(PGA_1_G1_00);
PGA_1_Start(PGA_1_LOWPOWER);
DAC9_1_Start(DAC9_1_FULLPOWER);
LCD_1_Start(); Inicializar LCD
M8C_EnableGInt; Activar interrupciones globales
AboveTop:
DAC9_1_WriteBlind(0); conjunto salida a 0V
ADCINC12_1_Start(ADCINC12_1_LOWPOWER); Aplique corriente al bloque SC
ADCINC12_1_GetSamples(0); Tiene ADC funciona continuamente
LCD_1_Control(LCD_1_DISP_CLEAR_HOME);
LCD_1_Position(0,0);
LCD_1_PrCString ("límite máximo");
LCD_1_Position(0,10);
Si (base == 0)
{
MAXC = TEMPF;
LCD_1_PrString(degF);
LCD_1_Position(0,14);
LCD_1_PrCString("F");
} else
{
MAXC = TEMPC;
LCD_1_PrString(degC);
LCD_1_Position(0,14);
LCD_1_PrCString("C");
}
for(;;) {
Arriba:
BenzLeer = PRT1DR; leer pulsación de tecla
while(ADCINC12_1_fIsDataAvailable() == 0); Bucle hasta valor listo
ADCINC12_1_ClearFlag(); Clara bandera de ADC
x=ADCINC12_1_iGetData(); Obtener resultado de ADC
Si (InputADC > = temperatura) / / sistema autostop y condición inicial
{
DAC9_1_WriteBlind(0); salida 0V
}
Si (parada == 0) / / bucle de reinicio automático en condiciones de iniciar
{
Si (CycleBuffer < temperatura)
{
DAC9_1_WriteBlind(510); salida 5V
}
}
Si (x == buffer) / / check para ADC válido de lectura
{
InputADC =(x*0.5208)-12; / / corrección para la resistencia de la sonda.
Si (base == 0)
{
InputADC = (9.0/5.0*InputADC) + 32;
}
Si (InputADC < = 99) / / configurar pantalla para 10 y 100 a la izquierda
{
lcd_Reading [0] = ' ';
w = 1;
Si (InputADC < = 9)
{
lcd_Reading [1] =' ';
w = 2;
}
} else w = 0;
InputADC2 = abs(InputADC); valor absoluto
convertir el int en una base cadena terminada en 10 nulo ASCII
itoa (& lcd_Reading [w], (unsigned int) InputADC2, 10);
Si (temperatura < = 99) / / configurar entrada a leer correctamente
{
lcd_Setting [0] = ' ';
z = 1;
Si (temperatura < = 9)
{
lcd_Setting [1] =' ';
z = 2;
}
} else z = 0;
temperature2 = abs(temperature);
convierte el int en una base cadena terminada en 10 nulo ASCII
itoa (y lcd_Setting [z], (unsigned int) temperature2, 10);
CycleBuffer = InputADC + 2; Límite inferior de reinicio
LCD_1_Position(1,0);
LCD_1_PrString(lcd_Reading); exhibición de la temperatura continua
LCD_1_Position(1,5);
LCD_1_PrCString ("sistema ->");
LCD_1_Position(1,10);
LCD_1_PrString(lcd_Setting);
clave función repetición para arriba abajo solamente
Si (BenzLeer! = 0 x 00) //0x03 cuando programador
{
cuenta ++;
Si (cuenta > 15)
Si (BenzLeer == 0x80|| BenzLeer == 0 x 40)
Goto
} otra cuenta = 0;
Si (KeyBuffer == BenzLeer) / / pasar por alto clave duplicada
Goto Top;
AQUÍ:
Programador añadirá 0 x 03 para todos los casos cuando
interruptor (BenzLeer) {}
caso (0 x 80): / / incremento de temperatura
if(Count>15)
{temperatura = temperatura + 10;
cuenta = 0;
Si (temperatura > = MAXC)
{goto HIGHlimit;
}
Goto Top;
}
KeyBuffer = BenzLeer;
Si (temperatura > = MAXC)
{goto HIGHlimit;
}
Goto TempUp;
rotura;
caso (0 x 40): / / disminuir la temperatura
if(Count>15)
{temperatura = temperatura-10;
cuenta = 0;
Si (temperatura < = 0)
{goto LOWlimit;
}
Goto Top;
}
KeyBuffer = BenzLeer;
Si (temperatura < = 0)
{goto LOWlimit;
}
Goto TempDown;
rotura;
caso (0 x 20): / / claro
KeyBuffer = BenzLeer;
Goto claro;
rotura;
caso (0 x 10): //start
KeyBuffer = BenzLeer;
Goto Inicio;
rotura;
caso (0x08): //stop
KeyBuffer = BenzLeer;
Goto Stop;
rotura;
caso (0 x 04): //base cambio
KeyBuffer = BenzLeer;
Si (base == 1)
{//Change a F
base = 0;
Goto Base;
}
Si (base == 0)
{//Change a C
base = 1;
}
Goto Base;
rotura;
por defecto:
KeyBuffer = BenzLeer;
rotura;
}
}
buffer = x; Buffer de validación ADC
Goto Top;
TempUp:
temperatura ++; ajuste de incremento
Goto Top;
TempDown:
temperatura--; ajuste de decremento
Goto Top;
Claro:
temperatura = 0;
cuenta = 0;
LCD_1_Position(1,10);
LCD_1_PrString(lcd_Setting);
Goto AboveTop;
Parada:
LCD_1_Control(LCD_1_DISP_CLEAR_HOME);
LCD_1_Position(0,0);
LCD_1_PrCString ("detenido en");
LCD_1_PrString(lcd_Reading);
DAC9_1_WriteBlind(0);
Stop = 1;
Si (base == 0)
{
MAXC = TEMPF;
LCD_1_Position(0,15);
LCD_1_PrCString("F");
} else
{
MAXC = TEMPC;
LCD_1_Position(0,15);
LCD_1_PrCString("C");
}
Goto Top;
Inicio:
LCD_1_Control(LCD_1_DISP_CLEAR_HOME);
LCD_1_Position(0,0);
LCD_1_PrCString ("calefacción");
LCD_1_PrString(lcd_Setting);
Si (InputADC < = temperatura)
{
DAC9_1_WriteBlind(510);
} else
{
DAC9_1_WriteBlind(0);
}
detener = 0;
Si (base == 0)
{
MAXC = TEMPF;
LCD_1_Position(0,15);
LCD_1_PrCString("F");
} else
{
MAXC = TEMPC;
LCD_1_Position(0,15);
LCD_1_PrCString("C");
}
Goto Top;
LOWlimit:
temperatura = 0;
Goto Top;
HIGHlimit:
temperatura = MAXC;
Goto Top;
Base:
Si (base == 1) //Degrees F a grados C
{
Si (temperatura! = 0)
{
temperature2 = temperatura;
Temperature=(5.0/9.0*(temperature2-32)); cambio de F a C
}
Goto BaseBottom;
} else
Si (temperatura! = 0)
{
temperature2 = temperatura;
temperatura = (9.0/5.0*temperature2) + 32; convertir C a F
}
BaseBottom:
Si (parada == 0)
{
Goto Top;
} else goto AboveTop;
}
}