//************************************************************************************ //** //** File name: C:\Documents and Settings\Skeeter\My Documents\Control.c //** Generated by: Flowcode v4.0.0.53 //** Date: Monday, October 26, 2009 21:10:07 //** Licence: Demo //** //** ***DEMO VERSION*** //** //** //** NOT FOR COMMERCIAL USE //** //** http://www.matrixmultimedia.com //************************************************************************************ #define MX_PIC //Defines for microcontroller #define P16F690 #define MX_EE #define MX_EE_SIZE 256 #define MX_SPI #define MX_SPI_BCB #define MX_SPI_SDI 4 #define MX_SPI_SDO 7 #define MX_SPI_SCK 6 #define MX_UART #define MX_UART_B #define MX_UART_TX 7 #define MX_UART_RX 5 #define MX_I2C #define MX_MI2C #define MX_I2C_B #define MX_I2C_SDA 4 #define MX_I2C_SCL 6 #define MX_PWM #define MX_PWM_CNT 1 #define MX_PWM_TRIS1 trisc #define MX_PWM_1 5 //Functions #include #pragma CLOCK_FREQ 5000000 //Configuration data #pragma DATA 0x2007, 0x3bf1 //Internal functions #include "C:\Flowcode V4\FCD\internals.h" //Macro function declarations void FCM_Refill(); //Variable declarations short FCV_TIMEOUT; char FCV_UPPERSENSOR; char FCV_OUTPUTS; char FCV_LOWERSENSOR; char FCV_MODE1; char FCV_MODE2; char FCV_TIMEOUTSETTING; short FCV_RESULT; char FCV_MODE3; //Defines: /**** Macro Substitutions **** 0 = Which ADC Channel 40 = Acquisition time 3 = Conversion Speed 0 = VRef+ Option 500 = VRef Voltage x 0.01V ******************************/ //ADC0: //Macro function declarations void FCD_ADC0_SampleADC(); char FCD_ADC0_ReadAsByte(); short FCD_ADC0_ReadAsInt(); float FCD_ADC0_ReadAsVoltage(); void FCD_ADC0_ReadAsString(char* FCR_RETVAL, char FCR_RETVAL_SIZE, char NumBytes); //Defines: /**** Macro Substitutions **** portb = D1 Port trisb = D1 Data Direction portb = D2 Port trisb = D2 Data Direction portb = D3 Port trisb = D3 Data Direction portb = D4 Port trisb = D4 Data Direction portb = RS Port trisb = RS Data Direction portb = E Port trisb = E Data Direction / = Data 1_Pin / = Data 2 Pin 4 = Data 3 Pin 5 = Data 4 Pin / = RS Pin / = Enable Pin LCD_2097944 = Unique Component Reference Number 2 = Row Count 16 = Column Count ******************************/ //component connections #define LCD_2097944_PORT0 portb #define LCD_2097944_TRIS0 trisb #define LCD_2097944_PORT1 portb #define LCD_2097944_TRIS1 trisb #define LCD_2097944_PORT2 portb #define LCD_2097944_TRIS2 trisb #define LCD_2097944_PORT3 portb #define LCD_2097944_TRIS3 trisb #define LCD_2097944_PORT4 portb #define LCD_2097944_TRIS4 trisb #define LCD_2097944_PORT5 portb #define LCD_2097944_TRIS5 trisb #define LCD_2097944_BIT0 / #define LCD_2097944_BIT1 / #define LCD_2097944_BIT2 4 #define LCD_2097944_BIT3 5 #define LCD_2097944_RS / #define LCD_2097944_E / #define LCD_2097944_ROWCNT 2 #define LCD_2097944_COLCNT 16 #ifdef _BOOSTC #define LCD_2097944_DELAY delay_10us(10) #endif #ifdef _C2C_ #define LCD_2097944_DELAY delay_us(100) #endif #ifndef LCD_2097944_DELAY #define LCD_2097944_DELAY delay_us(100) #endif //LCDDisplay0: //Macro function declarations void FCD_LCDDisplay0_RawSend(char in, char mask); void FCD_LCDDisplay0_Start(); void FCD_LCDDisplay0_Clear(); void FCD_LCDDisplay0_PrintASCII(char Character); void FCD_LCDDisplay0_Command(char in); void FCD_LCDDisplay0_Cursor(char x, char y); void FCD_LCDDisplay0_PrintNumber(short Number); void FCD_LCDDisplay0_PrintString(char* String, char MSZ_String); void FCD_LCDDisplay0_ScrollDisplay(char Direction, char Num_Positions); void FCD_LCDDisplay0_ClearLine(char Line); void FCD_LCDDisplay0_RAM_Write(char nIdx, char d0, char d1, char d2, char d3, char d4, char d5, char d6, char d7); //ADC0: //Macro implementations void FCD_ADC0_SampleADC() { /*******Supported Devices****************************************************************** // 16F616, 16F676, 16F677, 16F684, 16F685, 16F687, 16F688, 16F689, 16F690 ******************************************************************************************/ #define MX_ADC_CHANNEL 0 #define MX_ADC_SAMP_TIME 40 #define MX_ADC_CONV_SP 3 #define MX_ADC_VREF_OPT 0 //set up ADC conversion char old_tris, cnt; //assign conversion rate adcon1 = ((MX_ADC_CONV_SP & 0x07) << 4); //find appropriate bit #if (MX_ADC_CHANNEL == 0) #define MX_ADC_TRIS_REG trisa #define MX_ADC_TRIS_MSK 0x01 ansel = 0x01; #endif #if (MX_ADC_CHANNEL == 1) #define MX_ADC_TRIS_REG trisa #define MX_ADC_TRIS_MSK 0x02 ansel = 0x02; #if (MX_ADC_VREF_OPT == 1) #pragma error "Target device is currently using AN1 for VREF+" #endif #endif #if (MX_ADC_CHANNEL == 2) #define MX_ADC_TRIS_REG trisa #define MX_ADC_TRIS_MSK 0x04 ansel = 0x04; #endif #if (MX_ADC_CHANNEL == 3) #define MX_ADC_TRIS_REG trisa #define MX_ADC_TRIS_MSK 0x10 ansel = 0x08; #endif #if (MX_ADC_CHANNEL == 4) #define MX_ADC_TRIS_REG trisc #define MX_ADC_TRIS_MSK 0x01 ansel = 0x10; #endif #if (MX_ADC_CHANNEL == 5) #define MX_ADC_TRIS_REG trisc #define MX_ADC_TRIS_MSK 0x02 ansel = 0x20; #endif #if (MX_ADC_CHANNEL == 6) #define MX_ADC_TRIS_REG trisc #define MX_ADC_TRIS_MSK 0x04 ansel = 0x40; #endif #if (MX_ADC_CHANNEL == 7) #define MX_ADC_TRIS_REG trisc #define MX_ADC_TRIS_MSK 0x08 ansel = 0x80; #endif #if (MX_ADC_CHANNEL == 8) #define MX_ADC_TRIS_REG trisc #define MX_ADC_TRIS_MSK 0x40 anselh = 0x01; #endif #if (MX_ADC_CHANNEL == 9) #define MX_ADC_TRIS_REG trisc #define MX_ADC_TRIS_MSK 0x80 anselh = 0x02; #endif #if (MX_ADC_CHANNEL == 10) #define MX_ADC_TRIS_REG trisb #define MX_ADC_TRIS_MSK 0x10 anselh = 0x04; #endif #if (MX_ADC_CHANNEL == 11) #define MX_ADC_TRIS_REG trisb #define MX_ADC_TRIS_MSK 0x20 anselh = 0x08; #endif //sanity check #ifndef MX_ADC_TRIS_REG #pragma error "ADC Type 3 conversion code error - please contact technical support" #endif //store old tris value, and set the i/o pin as an input old_tris = MX_ADC_TRIS_REG; MX_ADC_TRIS_REG = MX_ADC_TRIS_REG | MX_ADC_TRIS_MSK; //turn ADC on adcon0 = 0x01 | (MX_ADC_CHANNEL << 2); //assign VREF functionality #if (MX_ADC_VREF_OPT == 1) set_bit(adcon0, VCFG); #endif //wait the acquisition time cnt = 0; while (cnt < MX_ADC_SAMP_TIME) cnt++; //begin conversion and wait until it has finished adcon0 = adcon0 | 0x02; while (adcon0 & 0x02); //restore old tris value, and reset adc registers MX_ADC_TRIS_REG = old_tris; ansel = 0x00; adcon0 = 0x00; #if(anselh) anselh = 0x00; #endif #undef MX_ADC_TRIS_REG #undef MX_ADC_TRIS_MSK #undef MX_ADC_SAMP_TIME #undef MX_ADC_CHANNEL #undef MX_ADC_CONV_SP #undef MX_ADC_VREF_OPT } char FCD_ADC0_ReadAsByte() { FCD_ADC0_SampleADC(); return adresh; } short FCD_ADC0_ReadAsInt() { short iRetVal; FCD_ADC0_SampleADC(); iRetVal = (adresh << 2); iRetVal = iRetVal | (adresl >> 6); return (iRetVal); } float FCD_ADC0_ReadAsVoltage() { int iSample; float fSample, fVoltage, fVperDiv; #define MX_ADC_VREF_V 500 iSample = FCD_ADC0_ReadAsInt(); //Read as 10-bit Integer fVoltage = float32_from_int32(MX_ADC_VREF_V); //Convert reference voltage count to floating point (0 - 500 x 10mV) fVoltage = float32_mul(fVoltage, 0.01); //Convert reference voltage count to actual voltage (0 - 5) fVperDiv = float32_mul(fVoltage, 0.000976); //Convert actual voltage to voltage per division (VRef / 1024) fSample = float32_from_int32(iSample); //Convert to floating point variable fVoltage = float32_mul(fSample, fVperDiv); //Calculate floating point voltage #undef MX_ADC_VREF_V return (fVoltage); } void FCD_ADC0_ReadAsString(char* FCR_RETVAL, char FCR_RETVAL_SIZE, char NumBytes) { float fVoltage; if (NumBytes > FCR_RETVAL_SIZE) NumBytes = FCR_RETVAL_SIZE; fVoltage = FCD_ADC0_ReadAsVoltage(); FCI_FLOAT_TO_STRING(fVoltage, 2, FCR_RETVAL, NumBytes); //Convert to String } //LCDDisplay0: //Macro implementations void FCD_LCDDisplay0_RawSend(char in, char mask) { unsigned char pt; clear_bit(LCD_2097944_PORT0, LCD_2097944_BIT0); clear_bit(LCD_2097944_PORT1, LCD_2097944_BIT1); clear_bit(LCD_2097944_PORT2, LCD_2097944_BIT2); clear_bit(LCD_2097944_PORT3, LCD_2097944_BIT3); clear_bit(LCD_2097944_PORT4, LCD_2097944_RS); clear_bit(LCD_2097944_PORT5, LCD_2097944_E); pt = ((in >> 4) & 0x0f); if (pt & 0x01) set_bit(LCD_2097944_PORT0, LCD_2097944_BIT0); if (pt & 0x02) set_bit(LCD_2097944_PORT1, LCD_2097944_BIT1); if (pt & 0x04) set_bit(LCD_2097944_PORT2, LCD_2097944_BIT2); if (pt & 0x08) set_bit(LCD_2097944_PORT3, LCD_2097944_BIT3); if (mask) set_bit(LCD_2097944_PORT4, LCD_2097944_RS); LCD_2097944_DELAY; set_bit (LCD_2097944_PORT5, LCD_2097944_E); LCD_2097944_DELAY; clear_bit (LCD_2097944_PORT5, LCD_2097944_E); pt = (in & 0x0f); LCD_2097944_DELAY; clear_bit(LCD_2097944_PORT0, LCD_2097944_BIT0); clear_bit(LCD_2097944_PORT1, LCD_2097944_BIT1); clear_bit(LCD_2097944_PORT2, LCD_2097944_BIT2); clear_bit(LCD_2097944_PORT3, LCD_2097944_BIT3); clear_bit(LCD_2097944_PORT4, LCD_2097944_RS); clear_bit(LCD_2097944_PORT5, LCD_2097944_E); if (pt & 0x01) set_bit(LCD_2097944_PORT0, LCD_2097944_BIT0); if (pt & 0x02) set_bit(LCD_2097944_PORT1, LCD_2097944_BIT1); if (pt & 0x04) set_bit(LCD_2097944_PORT2, LCD_2097944_BIT2); if (pt & 0x08) set_bit(LCD_2097944_PORT3, LCD_2097944_BIT3); if (mask) set_bit(LCD_2097944_PORT4, LCD_2097944_RS); LCD_2097944_DELAY; set_bit (LCD_2097944_PORT5, LCD_2097944_E); LCD_2097944_DELAY; clear_bit (LCD_2097944_PORT5, LCD_2097944_E); LCD_2097944_DELAY; } void FCD_LCDDisplay0_Start() { clear_bit(LCD_2097944_TRIS0, LCD_2097944_BIT0); clear_bit(LCD_2097944_TRIS1, LCD_2097944_BIT1); clear_bit(LCD_2097944_TRIS2, LCD_2097944_BIT2); clear_bit(LCD_2097944_TRIS3, LCD_2097944_BIT3); clear_bit(LCD_2097944_TRIS4, LCD_2097944_RS); clear_bit(LCD_2097944_TRIS5, LCD_2097944_E); Wdt_Delay_Ms(12); FCD_LCDDisplay0_RawSend(0x33, 0); Wdt_Delay_Ms(2); FCD_LCDDisplay0_RawSend(0x33, 0); Wdt_Delay_Ms(2); FCD_LCDDisplay0_RawSend(0x32, 0); Wdt_Delay_Ms(2); FCD_LCDDisplay0_RawSend(0x2c, 0); Wdt_Delay_Ms(2); FCD_LCDDisplay0_RawSend(0x06, 0); Wdt_Delay_Ms(2); FCD_LCDDisplay0_RawSend(0x0c, 0); Wdt_Delay_Ms(2); //clear the display FCD_LCDDisplay0_RawSend(0x01, 0); Wdt_Delay_Ms(2); FCD_LCDDisplay0_RawSend(0x02, 0); Wdt_Delay_Ms(2); } void FCD_LCDDisplay0_Clear() { FCD_LCDDisplay0_RawSend(0x01, 0); Wdt_Delay_Ms(2); FCD_LCDDisplay0_RawSend(0x02, 0); Wdt_Delay_Ms(2); } void FCD_LCDDisplay0_PrintASCII(char Character) { FCD_LCDDisplay0_RawSend(Character, 0x10); } void FCD_LCDDisplay0_Command(char in) { FCD_LCDDisplay0_RawSend(in, 0); Wdt_Delay_Ms(2); } void FCD_LCDDisplay0_Cursor(char x, char y) { #if (LCD_2097944_ROWCNT == 1) y=0x80; #endif #if (LCD_2097944_ROWCNT == 2) if (y==0) y=0x80; else y=0xc0; #endif #if (LCD_2097944_ROWCNT == 4) if (y==0) y=0x80; else if (y==1) y=0xc0; #if (LCD_2097944_COLCNT == 16) else if (y==2) y=0x90; else y=0xd0; #endif #if (LCD_2097944_COLCNT == 20) else if (y==2) y=0x94; else y=0xd4; #endif #endif FCD_LCDDisplay0_RawSend(y+x, 0); Wdt_Delay_Ms(2); } void FCD_LCDDisplay0_PrintNumber(short Number) { short tmp_int; char tmp_byte; if (Number < 0) { FCD_LCDDisplay0_RawSend('-', 0x10); Number = 0 - Number; } tmp_int = Number; if (Number >= 10000) { tmp_byte = tmp_int / 10000; FCD_LCDDisplay0_RawSend('0' + tmp_byte, 0x10); while (tmp_byte > 0) { tmp_int = tmp_int - 10000; tmp_byte--; } } if (Number >= 1000) { tmp_byte = tmp_int / 1000; FCD_LCDDisplay0_RawSend('0' + tmp_byte, 0x10); while (tmp_byte > 0) { tmp_int = tmp_int - 1000; tmp_byte--; } } if (Number >= 100) { tmp_byte = tmp_int / 100; FCD_LCDDisplay0_RawSend('0' + tmp_byte, 0x10); while (tmp_byte > 0) { tmp_int = tmp_int - 100; tmp_byte--; } } if (Number >= 10) { tmp_byte = tmp_int / 10; FCD_LCDDisplay0_RawSend('0' + tmp_byte, 0x10); while (tmp_byte > 0) { tmp_int = tmp_int - 10; tmp_byte--; } } FCD_LCDDisplay0_RawSend('0' + tmp_int, 0x10); } void FCD_LCDDisplay0_PrintString(char* String, char MSZ_String) { char idx; for (idx=0; idx 0? if (FCV_MODE3 > 0) { } else { //Decision //Decision: Mode2 > 0? if (FCV_MODE2 > 0) { //Calculation //Calculation: // Mode2 = Mode2 - 1 FCV_MODE2 = FCV_MODE2 - 1; } //Call Component Macro //Call Component Macro: LCDDisplay(0)::ClearLine(1) FCD_LCDDisplay0_ClearLine(1); //Call Component Macro //Call Component Macro: LCDDisplay(0)::PrintASCII("Refilling Cell") FCD_LCDDisplay0_PrintASCII('R'); FCD_LCDDisplay0_PrintASCII('e'); FCD_LCDDisplay0_PrintASCII('f'); FCD_LCDDisplay0_PrintASCII('i'); FCD_LCDDisplay0_PrintASCII('l'); FCD_LCDDisplay0_PrintASCII('l'); FCD_LCDDisplay0_PrintASCII('i'); FCD_LCDDisplay0_PrintASCII('n'); FCD_LCDDisplay0_PrintASCII('g'); FCD_LCDDisplay0_PrintASCII(' '); FCD_LCDDisplay0_PrintASCII('C'); FCD_LCDDisplay0_PrintASCII('e'); FCD_LCDDisplay0_PrintASCII('l'); FCD_LCDDisplay0_PrintASCII('l'); //Calculation //Calculation: // Mode3 = Mode3 + 1 FCV_MODE3 = FCV_MODE3 + 1; //Output //Output: 0x06 -> PORT B trisb = 0x00; portb = 0x06; } //Input //Input: A1 -> UpperSensor trisa = trisa | 0x02; FCV_UPPERSENSOR = ((porta & 0x02) == 0x02); if ((FCV_UPPERSENSOR <1) == 0) break; } //Calculation //Calculation: // Mode3 = Mode3 - 1 FCV_MODE3 = FCV_MODE3 - 1; //Output //Output: 0 -> PORT B trisb = 0x00; portb = 0; //Call Component Macro //Call Component Macro: LCDDisplay(0)::ClearLine(1) FCD_LCDDisplay0_ClearLine(1); //Call Component Macro //Call Component Macro: LCDDisplay(0)::PrintASCII("Refill Complete") FCD_LCDDisplay0_PrintASCII('R'); FCD_LCDDisplay0_PrintASCII('e'); FCD_LCDDisplay0_PrintASCII('f'); FCD_LCDDisplay0_PrintASCII('i'); FCD_LCDDisplay0_PrintASCII('l'); FCD_LCDDisplay0_PrintASCII('l'); FCD_LCDDisplay0_PrintASCII(' '); FCD_LCDDisplay0_PrintASCII('C'); FCD_LCDDisplay0_PrintASCII('o'); FCD_LCDDisplay0_PrintASCII('m'); FCD_LCDDisplay0_PrintASCII('p'); FCD_LCDDisplay0_PrintASCII('l'); FCD_LCDDisplay0_PrintASCII('e'); FCD_LCDDisplay0_PrintASCII('t'); FCD_LCDDisplay0_PrintASCII('e'); //Delay //Delay: Timeout s delay_s(FCV_TIMEOUT); //Output //Output: 0x01 -> PORT B trisb = 0x00; portb = 0x01; //Call Component Macro //Call Component Macro: LCDDisplay(0)::ClearLine(1) FCD_LCDDisplay0_ClearLine(1); } void main() { //Initialisation ansel = 0; anselh = 0; //Interrupt initialisation code option_reg = 0xC0; //Call Component Macro //Call Component Macro: LCDDisplay(0)::Start FCD_LCDDisplay0_Start(); //Delay //Delay: 25 ms delay_ms(25); //Call Component Macro //Call Component Macro: LCDDisplay(0)::Cursor(0, 0) FCD_LCDDisplay0_Cursor(0, 0); //Call Component Macro //Call Component Macro: LCDDisplay(0)::PrintASCII("System On") FCD_LCDDisplay0_PrintASCII('S'); FCD_LCDDisplay0_PrintASCII('y'); FCD_LCDDisplay0_PrintASCII('s'); FCD_LCDDisplay0_PrintASCII('t'); FCD_LCDDisplay0_PrintASCII('e'); FCD_LCDDisplay0_PrintASCII('m'); FCD_LCDDisplay0_PrintASCII(' '); FCD_LCDDisplay0_PrintASCII('O'); FCD_LCDDisplay0_PrintASCII('n'); //Call Component Macro //Call Component Macro: LCDDisplay(0)::Cursor(1, 1) FCD_LCDDisplay0_Cursor(1, 1); //Input //Input: A2 -> LowerSensor trisa = trisa | 0x04; FCV_LOWERSENSOR = ((porta & 0x04) == 0x04); //Decision //Decision: LowerSensor < 1? if (FCV_LOWERSENSOR < 1) { //Call Macro //Call Macro: Refill FCM_Refill(); } //Loop //Loop: While 1 while (1) { //Input //Input: A1 -> UpperSensor trisa = trisa | 0x02; FCV_UPPERSENSOR = ((porta & 0x02) == 0x02); //Decision //Decision: UpperSensor > 0? if (FCV_UPPERSENSOR > 0) { //Decision //Decision: Mode1>0? if (FCV_MODE1>0) { } else { //Call Component Macro //Call Component Macro: LCDDisplay(0)::ClearLine(1) FCD_LCDDisplay0_ClearLine(1); //Call Component Macro //Call Component Macro: LCDDisplay(0)::PrintASCII("Operational") FCD_LCDDisplay0_PrintASCII('O'); FCD_LCDDisplay0_PrintASCII('p'); FCD_LCDDisplay0_PrintASCII('e'); FCD_LCDDisplay0_PrintASCII('r'); FCD_LCDDisplay0_PrintASCII('a'); FCD_LCDDisplay0_PrintASCII('t'); FCD_LCDDisplay0_PrintASCII('i'); FCD_LCDDisplay0_PrintASCII('o'); FCD_LCDDisplay0_PrintASCII('n'); FCD_LCDDisplay0_PrintASCII('a'); FCD_LCDDisplay0_PrintASCII('l'); //Calculation //Calculation: // Mode1 = Mode1 + 1 FCV_MODE1 = FCV_MODE1 + 1; //Input //Input: A1 -> Outputs trisa = trisa | 0x02; FCV_OUTPUTS = ((porta & 0x02) == 0x02); //Decision //Decision: Outputs > 0? if (FCV_OUTPUTS > 0) { } } } else { //Loop //Loop: While LowerSensor > 0 while (1) { //Decision //Decision: Mode2 > 0? if (FCV_MODE2 > 0) { } else { //Calculation //Calculation: // Mode1 = Mode1 - 1 FCV_MODE1 = FCV_MODE1 - 1; //Call Component Macro //Call Component Macro: LCDDisplay(0)::ClearLine(1) FCD_LCDDisplay0_ClearLine(1); //Call Component Macro //Call Component Macro: LCDDisplay(0)::PrintASCII("Low Electrolyte") FCD_LCDDisplay0_PrintASCII('L'); FCD_LCDDisplay0_PrintASCII('o'); FCD_LCDDisplay0_PrintASCII('w'); FCD_LCDDisplay0_PrintASCII(' '); FCD_LCDDisplay0_PrintASCII('E'); FCD_LCDDisplay0_PrintASCII('l'); FCD_LCDDisplay0_PrintASCII('e'); FCD_LCDDisplay0_PrintASCII('c'); FCD_LCDDisplay0_PrintASCII('t'); FCD_LCDDisplay0_PrintASCII('r'); FCD_LCDDisplay0_PrintASCII('o'); FCD_LCDDisplay0_PrintASCII('l'); FCD_LCDDisplay0_PrintASCII('y'); FCD_LCDDisplay0_PrintASCII('t'); FCD_LCDDisplay0_PrintASCII('e'); //Calculation //Calculation: // Mode2 = Mode2 + 1 FCV_MODE2 = FCV_MODE2 + 1; } //Input //Input: A2 -> LowerSensor trisa = trisa | 0x04; FCV_LOWERSENSOR = ((porta & 0x04) == 0x04); if ((FCV_LOWERSENSOR > 0) == 0) break; } //Decision //Decision: LowerSensor < 1? if (FCV_LOWERSENSOR < 1) { //Call Macro //Call Macro: Refill FCM_Refill(); } } } mainendloop: goto mainendloop; } void interrupt(void) { }