/* Partial source listing for Linear Actuator Elevation Control and Display Jim White, WD0E. February, 2001 */ bit last_pulse_state = 0; //save of last pulse high or low state int up = 0; //moving up = 1 or down = 0 char outdata[16]; //buffer for output to LDC eeprom int zero_ele; //counts of pulses at zero elevation. eeprom int ninty_ele; //counts at 90 elevation eeprom int posit; //position in pulse transitions. int degrees = 0; //degrees of elevation char c; //input character from UART eeprom float mult; //counts per degree after calibration char tmpstring[5]; //diagnostic for testing void do_math(void) //calculate the counts, then the degrees and display { if (up) posit++; else posit--; degrees = ((float)posit-(float)zero_ele) / mult; sprintf(outdata,"C=%4d Deg=%d ",posit,degrees); lcd_gotoxy(0,1); lcd_puts(outdata); ftoa(mult,10,tmpstring); printf("DIAG: posit = %d, mult = %s, degrees %d\n\r",posit,tmpstring,degrees); } void main(void) { printf("\n\rElevation Control starting\n\r"); while (1) { //Loop till power comes on up or down while(PINA.1 == 0 && PINA.2 == 0) { //No power lcd_gotoxy(0,0); lcd_putsf("ELEVATION OFF "); //last position sprintf(outdata,"C=%4d Deg=%2d",posit,degrees); lcd_gotoxy(0,1); lcd_puts(outdata); //if a char in the serial buffer then user wants if (rx_counter > 0) { c = getchar(); // to start calibration switch (c) { case '0' : posit = 100; zero_ele = posit; printf("\n\rZero location saved."); printf("\n\rMove elevation to ninty degrees and hit 9 "); break; case '9' : ninty_ele = posit; mult = ((float)ninty_ele - (float)zero_ele)/90; ftoa(mult,10,tmpstring); printf("\n\rmult = %s",tmpstring); printf("\n\r90 degree elevation saved."); printf("\n\rCalibration complete"); break; default : printf("\n\rStarting calibration."); printf("\n\rMove elevation to zero degrees and hit 0 "); break; } //switch } //if character in buffer } //while no power applied //Power is applied lcd_gotoxy(0,0); //See if we are going up or down if(PINA.1) { lcd_putsf("ELEVATION UP "); //And show it printf("Elevation up posit = %d\n\r",posit); up = 1; } else { lcd_putsf("ELEVATION DOWN"); printf("Elevation down posit = %d\n\r", posit); up = 0; } //Now count pulses while(PINA.0 == last_pulse_state) {}; //loop till pulse state changes last_pulse_state = PINA.0; //save this as last state printf("pulse\n\r"); do_math(); //go calc the degrees and display } //while 1 } //main