/* INCLUSION OF FILES */ #include #include /* for _nop_ */ /* GENERAL CONSTANTS */ #define FALSE 0x00 #define TRUE 0x01 #define TRIPPED 0x01 #define OPERATE 0x00 #define PTT_TX 0x00 #define IQ_LOW 0x01 #define IQ_HIGH 0x00 #define DRIVER_ON 0x00 #define DRIVER_OFF 0x01 #define HSP_ON 0x00 #define HSP_OFF 0x01 #define BLOWER_LOW 0x01 #define BLOWER_HIGH 0x00 #define LED_WARMUP_ON 0x00 #define LED_WARMUP_OFF 0x01 #define LED_ERROR_ON 0x00 #define LED_ERROR_OFF 0x01 #define COAX_RX 0x01 #define COAX_TX 0x00 #define WD_RESET 0x01 #define WD_RUN 0x00 #define cw_delay_time 0x02 enum states {INIT, STANDBY, WARMUP, OPERATE_RX,OPERATE_TX, ERROR} next_state, prev_state; enum cw_msgs {IAmsg, IKmsg, UAmsg, UFmsg, AIRmsg} cw_msg ; /* bits used for inputs */ sbit uf_trip = P3^0; sbit ua_trip = P3^1; sbit ia_trip = P3^2; sbit ik_trip = P3^3; sbit tempair_trip = P3^4; sbit ptt_input = P3^5; sbit standby_input = P3^7; /* bits used for outputs */ sbit coax_rel = P1^0; sbit iq = P1^1; sbit driver = P1^2; sbit hsp = P1^3; sbit blower = P1^4; sbit led_warmup = P1^5; sbit led_error = P1^6; sbit watchdog = P1^7; /* Global variable declarations */ bit tripped_uf, tripped_ua, tripped_ia, tripped_ik, tripped_tempair; void delay_1ms (int nr) { unsigned char s; int r; for (r = 0; r < nr; r++) { for (s = 0; s < 254; s++) { _nop_(); _nop_(); _nop_(); } } } unsigned char check_tripped() /*tripped != 0 when Ia/Ik too high, Uf/Ua too low, Air low/too hot) */ { unsigned char trip_stat; trip_stat = 0; tripped_uf = FALSE; tripped_ua = FALSE; tripped_ia = FALSE; tripped_ik = FALSE; tripped_tempair = FALSE; if (uf_trip == TRIPPED) { trip_stat++ ; tripped_uf = TRUE; } if (ua_trip == TRIPPED) { trip_stat++; tripped_ua = TRUE; } if (ia_trip == TRIPPED) { trip_stat++; tripped_ia = TRUE; } if (ik_trip == TRIPPED) { trip_stat++; tripped_ik = TRUE; } if (tempair_trip == TRIPPED) { trip_stat++; tripped_tempair = TRUE; } return(trip_stat); } void cw_bit_delay(unsigned char bit_delay) /*bitdelay 1 = dot time, bit_delay 3 = dash time */ { unsigned char i; for (i=1; i<=bit_delay; i++) delay_1ms(cw_delay_time); /* calibrate with 1 ms timer dot time */ } void send_cw_char(unsigned int cw_char, unsigned char char_length) { unsigned int window; unsigned char teller; window = 0x8000; led_error = LED_ERROR_OFF; for (teller=1; teller <= char_length;teller++) { if (window & cw_char) led_error = LED_ERROR_ON; else led_error = LED_ERROR_OFF; cw_bit_delay(1); window = window >> 1; } led_error = LED_ERROR_OFF; } void error_cw () { switch (cw_msg) { case IAmsg: { send_cw_char(0xA000,3); /*i*/ cw_bit_delay(3); send_cw_char(0xB800,5); /*a*/ break; } case IKmsg: { send_cw_char(0xA000,3); /*i*/ cw_bit_delay(3); send_cw_char(0xEB80,9); /*k*/ break; } case UAmsg: { send_cw_char(0xAE00,7); /*u*/ cw_bit_delay(3); send_cw_char(0xB800,5); /*a*/ break; } case UFmsg: { send_cw_char(0xAE00,7); /*u*/ cw_bit_delay(3); send_cw_char(0xAE80,9); /*f*/ break; } case AIRmsg: { send_cw_char(0xB800,5); /*a*/ cw_bit_delay(3); send_cw_char(0xA000,3); /*i*/ cw_bit_delay(3); send_cw_char(0xBA00,7); /*r*/ break; } } } bit warmup_timer_elapsed() { return(0); } void warmup_timer_start() { } void blower_timer_start() { } bit blower_timer_elapsed() { return(0); } unsigned char check_ptt_input (unsigned char true_val) /* used to eliminate contact bounce */ { unsigned char one_counter, zero_counter,i; one_counter = 0; zero_counter = 0; for (i = 1; i<10 ; i++) { delay_1ms(5); if (ptt_input == 1) one_counter++ ; else zero_counter++; } if (zero_counter > one_counter) return(0 == true_val); else return(1 == true_val); } unsigned char check_standby_input (unsigned char true_val) /* used to eliminate contact bounce */ { unsigned char one_counter, zero_counter,i; one_counter = 0; zero_counter = 0; for (i = 1; i<10 ; i++) { delay_1ms(5); if (standby_input == 1) one_counter++ ; else zero_counter++; } if (zero_counter > one_counter) return(0 == true_val); else return(1 == true_val); } void Init (void) { coax_rel = COAX_RX; iq = IQ_LOW; driver = DRIVER_OFF; hsp = HSP_OFF; blower = BLOWER_LOW; led_warmup = LED_WARMUP_OFF; led_error = LED_ERROR_OFF; watchdog = WD_RESET; /*later WD_RUN !!*/ next_state = STANDBY; prev_state = INIT; /* init interupts !*/ } void standby_state () { if (check_tripped()) /*check if inputs are tripped, entering error state */ { next_state = ERROR; prev_state = STANDBY; return; } switch (prev_state) { case INIT : case STANDBY : /*entering standby from init state or stay in standby */ { if (check_standby_input(OPERATE)==TRUE) /* check if OPERATE switch active, YES->WARMUP, NO->STANDBY */ next_state = WARMUP; else next_state = STANDBY; watchdog = WD_RESET; /*later WD_RUN !!*/ break; } case WARMUP: /* entering standby from warmup state */ { led_warmup = LED_WARMUP_OFF; watchdog = WD_RESET; /*later WD_RUN !!*/ next_state = STANDBY; break; } case OPERATE_RX: { hsp = HSP_OFF; next_state = STANDBY; break; } case OPERATE_TX: { driver = DRIVER_OFF; delay_1ms(10); iq = IQ_LOW; delay_1ms(100); coax_rel = COAX_RX; hsp = HSP_OFF; next_state = STANDBY; break; } case ERROR: { led_error = LED_ERROR_OFF; next_state = STANDBY; break; } } if (blower_timer_elapsed()==TRUE) blower = BLOWER_LOW; else blower = BLOWER_HIGH; prev_state = STANDBY; } void warmup_state () { if (check_tripped()) /*check if inputs are tripped, entering error state */ { next_state = ERROR; prev_state = WARMUP; return; } switch (prev_state) { case STANDBY: /* from standby to operate, entering first warmup state */ { led_warmup = LED_WARMUP_ON; watchdog = WD_RESET; /*later WD_RUN !!*/ warmup_timer_start(); next_state = WARMUP; break; } case WARMUP: /* already in warmup state, waiting until warmup timer expires*/ { watchdog = WD_RESET; /*later WD_RUN !!*/ if (warmup_timer_elapsed()) { next_state = OPERATE_RX; /* warmup timer has expired,next state is operate_rx */ break; } if (check_standby_input(OPERATE)!=TRUE) /* check if OPERATE switch to standby, YES->standby, NO->warmup */ { next_state = STANDBY; break; } else { next_state = WARMUP; break; } } } prev_state = WARMUP; } void operate_tx_state () { if (check_tripped()) /*check if inputs are tripped, entering error state */ { next_state = ERROR; prev_state = OPERATE_TX; return; } switch (prev_state) { case OPERATE_TX: /* already in operate_tx state, check PTT line and operate/standby switch*/ { if (check_standby_input(OPERATE)!=TRUE) /* check operate switch, active: NO->standby */ { next_state = STANDBY; break; } else { if (check_ptt_input(PTT_TX)==TRUE) /* check PTT line, active: YES->operate_tx, NO->operate_rx */ { next_state = OPERATE_TX; break; } else { next_state = OPERATE_RX; break; } } } case OPERATE_RX: /* from operate_rx to operate_tx */ { blower = BLOWER_HIGH; coax_rel = COAX_TX; delay_1ms(100); iq = IQ_HIGH; delay_1ms(10); driver = DRIVER_ON; next_state = OPERATE_TX; } } blower_timer_start(); prev_state = OPERATE_TX; watchdog = WD_RESET; /*later WD_RUN !!*/ } void operate_rx_state () { if (check_tripped()) /*check if inputs are tripped, entering error state */ { next_state = ERROR; prev_state = OPERATE_RX; return; } switch (prev_state) { case WARMUP: /* from warmup to operate_rx */ { led_warmup = LED_WARMUP_OFF; hsp = HSP_ON; watchdog = WD_RESET; /*later WD_RUN !!*/ next_state = OPERATE_RX; break; } case OPERATE_RX: /* already in operate_rx state, waiting until PTT activated */ { if (check_standby_input(OPERATE)!=TRUE) /* check operate switch, active: NO->standby */ { next_state = STANDBY; break; } else { if (check_ptt_input(PTT_TX)!=TRUE) /* check PTT line, active: YES->operate_tx, NO->operate_rx */ { next_state = OPERATE_RX; break; } else { next_state = OPERATE_TX; break; } } } case OPERATE_TX: /* from operate_tx to operate_rx */ { driver = DRIVER_OFF; delay_1ms(10); iq = IQ_LOW; delay_1ms(100); coax_rel = COAX_RX; next_state = OPERATE_RX; } } prev_state = OPERATE_RX; if (blower_timer_elapsed()==TRUE) blower = BLOWER_LOW; else blower = BLOWER_HIGH; watchdog = WD_RESET; /*later WD_RUN !!*/ } void error_state () { driver = DRIVER_OFF; delay_1ms(10); iq = IQ_LOW; hsp = HSP_OFF; delay_1ms(100); coax_rel = COAX_RX; led_error = LED_ERROR_OFF; /*activated later by cw error output */ led_warmup = LED_WARMUP_OFF; if (blower_timer_elapsed()==TRUE) blower = BLOWER_LOW; else blower = BLOWER_HIGH; watchdog = WD_RESET; /*later WD_RUN !!*/ if (tripped_uf==TRUE) { cw_msg = UFmsg; error_cw(); delay_1ms(500); } if (tripped_ua==TRUE) { cw_msg = UAmsg; error_cw(); delay_1ms(500); } if (tripped_ia==TRUE) { cw_msg = IAmsg; error_cw(); delay_1ms(500); } if (tripped_ik==TRUE) { cw_msg = IKmsg; error_cw(); delay_1ms(500); } if (tripped_tempair==TRUE) { cw_msg = AIRmsg; error_cw(); delay_1ms(500); } if (check_standby_input(OPERATE)==TRUE) /* check if OPERATE switch active, STAY IN->ERROR, NO -> GOTO STANDBY */ next_state = ERROR; else next_state = STANDBY; watchdog = WD_RESET; /*later WD_RUN !!*/ prev_state = ERROR; } void Main (void) { Init (); while (TRUE) { switch (next_state) { case STANDBY: { standby_state(); break; } case WARMUP: { warmup_state(); break; } case OPERATE_RX: { operate_rx_state(); break; } case OPERATE_TX: { operate_tx_state(); break; } case ERROR: { error_state(); break; } } } }