diff --git a/contr.c b/contr.c index 3bacd00..6ed44c6 100644 --- a/contr.c +++ b/contr.c @@ -26,22 +26,25 @@ #define CONTR_BAND_40M 0x04 #define CONTR_BAND_80M 0x05 -#define VCCS_SIZE 12 +#define VCC_SIZE 6 +#define FWD_SIZE 64 +#define REV_SIZE 64 typedef struct { - uint16_t fwd_power; - uint16_t ref_power; - uint16_t temp; - uint16_t freq; - uint16_t vcc; + float temp; uint8_t band; bool key_was_pressed; uint16_t key_time_counter; uint16_t key_time_untap; uint16_t key_tap_counter; bool key_strokes_ended; - uint16_t vccs[VCCS_SIZE]; - size_t vccs_pos; + + uint16_t vcc[VCC_SIZE]; + size_t vcc_pos; + uint16_t fwd[FWD_SIZE]; + size_t fwd_pos; + uint16_t rev[REV_SIZE]; + size_t rev_pos; } contr_t; contr_t contr; @@ -91,7 +94,15 @@ void contr_att_off(void); void contr_timer_init(void); void contr_adc_init(void); -float contr_vcc_read(void); + +void contr_vcc_measure(void); +float contr_vcc_calc(void); + +void contr_fwd_measure(void); +float contr_fwd_calc(void); + +void contr_rev_measure(void); +float contr_rev_calc(void); void contr_write_band(void); void contr_read_band(void); @@ -111,14 +122,16 @@ void contr_timer_init(void) { REG_SETUP_BIT(TCCR0B, CS00); /* Enable timer interrupt */ REG_SETUP_BIT(TIMSK0, TOIE0); - REG_SETUP(TCNT0, TIMER_INITVAL); + //REG_SETUP(TCNT0, TIMER_INITVAL); } ISR(TIMER0_OVF_vect) { contr_key_handle(); + contr_fwd_measure(); + contr_rev_measure(); + contr_vcc_measure(); volatile uint8_t xchar; - while ((xchar = fifo_getc(&uart_outbuf)) > 0) { while (!REG_BIT_ISUP(UCSR0A, UDRE0)); UDR0 = xchar; @@ -126,41 +139,23 @@ ISR(TIMER0_OVF_vect) { REG_SETUP(TCNT0, TIMER_INITVAL); } - /* - * D0 - PD0 RX - * D1 - PD1 TX - * D2 - PD2 IN PTT IN - * D3 - PD3 IN KEY - * D4 - PD4 OUT RELAY5 TX SWITCH - * D5 - PD5 IN FREQ OSC MC74HC4060A - * D6 - PD6 OUT 10M - * D7 - PD7 OUT 20M - * D8 - PB0 OUT 40M - * D9 - PB1 OUT 80M - * D10 - PB2 OUT BUZZER - * D11 - PB3 IN TEMP DS18B20 - * D12 - PB4 OUT FAN - * D13 - PB5 OUT PA ATT SWITCH - * - * A0 PC0 - V.REV - * A1 PC1 - V.FWD - * A2 PC2 - ICOM - * A3 PC3 - V.VCC - */ void contr_init(void) { - contr.fwd_power = 0; - contr.ref_power = 0; - contr.temp = 0; - contr.freq = 0; - contr.vcc = 0; + contr.temp = 0.0F; contr.band = CONTR_BAND_OFF; - contr.vccs_pos = 0; - for (size_t i = 0; i < VCCS_SIZE; i++) { - contr.vccs[i] = 0.0F; + contr.vcc_pos = 0; + for (size_t i = 0; i < VCC_SIZE; i++) { + contr.vcc[i] = 0; + } + contr.fwd_pos = 0; + for (size_t i = 0; i < FWD_SIZE; i++) { + contr.fwd[i] = 0; + } + contr.rev_pos = 0; + for (size_t i = 0; i < REV_SIZE; i++) { + contr.rev[i] = 0; } - contr.key_was_pressed = false; contr.key_time_counter = 0; contr.key_tap_counter = 0; @@ -232,77 +227,82 @@ void contr_switch_band(void) { _delay_ms(100); } - -void contr_logo(void) { - char dispstr[10] = { '\0' }; - - sprintf(dispstr, "R2DFX"); - disp_string(2, 3, dispstr); +char* contr_get_bandname(uint8_t band) { + char* bandstr = NULL; + switch (contr.band) { + case CONTR_BAND_10M: + bandstr = "10m"; + break; + case CONTR_BAND_20M: + bandstr = "20m"; + break; + case CONTR_BAND_40M: + bandstr = "40m"; + break; + case CONTR_BAND_80M: + bandstr = "80m"; + break; + case CONTR_BAND_OFF: + bandstr = "OFF"; + break; + } + return bandstr; +} + +#define CONTR_KEY_SWBAND 2 +#define CONTR_KEY_BUZZER 4 +#define CONTR_KEY_FUN 5 + +void contr_key_eval(void) { + if (contr.key_strokes_ended) { + switch (contr.key_tap_counter) { + case CONTR_KEY_SWBAND: + contr_key_reset(); + contr_switch_band(); + break; + case CONTR_KEY_BUZZER: + contr_key_reset(); + contr_buzzer_onoff(); + break; + case CONTR_KEY_FUN: + contr_key_reset(); + contr_fan_onoff(); + break; + default: + contr_key_reset(); + break; + } + } +} + + +void contr_show_logo(void) { + char* dispstr = "Made by R2FDX"; + disp_string(1, 1, dispstr); +} + +void contr_temp_measure(void) { + contr.temp = ds18b20_get_temp(); +} + +float contr_temp_calc(void) { + return contr.temp; } -/*******************************************************/ void contr_main(void) { uint16_t counter = 0; - char dispstr[10] = { '\0' }; + char dispstr[17] = { '\0' }; char* bandstr = NULL; - sprintf(dispstr, "Made by R2FDX"); - disp_string(1, 1, dispstr); - _delay_ms(1000); + disp_clear(); + contr_show_logo(); + _delay_ms(500); disp_clear(); printf("READY>\n\r# "); while (true) { - _delay_ms(100); - if (contr.key_strokes_ended) { - switch (contr.key_tap_counter) { - case 1: - contr_key_reset(); - contr_switch_band(); - break; - case 2: - contr_key_reset(); - //contr_txrelay_onoff(); - break; - case 3: - contr_key_reset(); - contr_buzzer_onoff(); - break; - case 5: - contr_key_reset(); - contr_fan_onoff(); - break; - default: - contr_key_reset(); - break; - } - } - switch (contr.band) { - case CONTR_BAND_10M: - bandstr = "10m"; - break; - case CONTR_BAND_20M: - bandstr = "20m"; - break; - case CONTR_BAND_40M: - bandstr = "40m"; - break; - case CONTR_BAND_80M: - bandstr = "80m"; - break; - case CONTR_BAND_OFF: - bandstr = "OFF"; - break; - - } - disp_string(0, 12, bandstr); - - sprintf(dispstr, "%3.2fV", contr_vcc_read()); - disp_string(0, 0, dispstr); - - sprintf(dispstr, "%3.2fC", ds18b20_get_temp()); - disp_string(3, 0, dispstr); + contr_key_eval(); if (contr.key_tap_counter) { sprintf(dispstr, "%2d", contr.key_tap_counter); @@ -311,11 +311,33 @@ void contr_main(void) { sprintf(dispstr, " "); disp_string(3, 12, dispstr); } + + + if ((counter % 64) == 1) { + contr_temp_measure(); + } + + if ((counter % 4) == 1) { + + disp_string(0, 12, contr_get_bandname(contr.band)); + + sprintf(dispstr, "%3.2fV", contr_vcc_calc()); + disp_string(0, 0, dispstr); + + sprintf(dispstr, "%3.2f ", contr_fwd_calc()); + disp_string(1, 2, dispstr); + + sprintf(dispstr, "%3.2f ", contr_rev_calc()); + disp_string(2, 2, dispstr); + + sprintf(dispstr, "%3.2fC", contr_temp_calc()); + disp_string(3, 0, dispstr); + } counter++; + _delay_ms(100); } } - /* D4 PD4: Set input relay 5 output */ void contr_txrelay_init(void) { REG_SETUP_BIT(DDRD, PD4); @@ -451,7 +473,7 @@ void contr_adc_init() { REG_SETUP_BIT(ADCSRA, ADEN); } -float contr_vcc_read(void) { +void contr_vcc_measure(void) { REG_SETUP_BIT(ADMUX, MUX0); REG_SETUP_BIT(ADMUX, MUX1); REG_SETDOWN_BIT(ADMUX, MUX2); @@ -464,19 +486,104 @@ float contr_vcc_read(void) { hval = (hval << 8) & 0xFF00; lval = lval & 0x00FF; - if (++contr.vccs_pos > VCCS_SIZE) contr.vccs_pos = 0; - contr.vccs[contr.vccs_pos] = (hval | lval); + if (++contr.vcc_pos > VCC_SIZE) { + contr.vcc_pos = 0; + } + contr.vcc[contr.vcc_pos] = (hval | lval); +} + +#define CONTR_VCC_SCALE 2673.0F + +float contr_vcc_calc(void) { uint32_t vcc = 0; uint8_t n = 0; - for (size_t i = 0; i < VCCS_SIZE; i++) { - if (contr.vccs[i]) { + for (size_t i = 0; i < VCC_SIZE; i++) { + if (contr.vcc[i]) { n++; - vcc += contr.vccs[i]; + vcc += contr.vcc[i]; } } - return (float)vcc / (float)n / 2673.0F; + float xvcc = 0.0F; + if (n) { + vcc /= n; + xvcc = (float)vcc / CONTR_VCC_SCALE; + } + return xvcc; } +void contr_fwd_measure(void) { + REG_SETDOWN_BIT(ADMUX, MUX0); + REG_SETDOWN_BIT(ADMUX, MUX1); + REG_SETDOWN_BIT(ADMUX, MUX2); + REG_SETDOWN_BIT(ADMUX, MUX3); + + REG_SETUP_BIT(ADCSRA, ADSC); + while (ADCSRA & BIT(ADSC)); + uint16_t lval = (uint16_t)ADCL; + uint16_t hval = (uint16_t)ADCH; + hval = (hval << 8) & 0xFF00; + lval = lval & 0x00FF; + + if (++contr.fwd_pos > FWD_SIZE) { + contr.fwd_pos = 0; + } + contr.fwd[contr.fwd_pos] = (hval | lval); +} + +float contr_fwd_calc(void) { + uint32_t fwd = 0; + uint8_t n = 0; + for (size_t i = 0; i < FWD_SIZE; i++) { + if (contr.fwd[i]) { + n++; + fwd += contr.fwd[i]; + } + } + float xfwd = 0.0F; + if (n) { + fwd /= n; + xfwd = (float)fwd / 10.0F; + } + return xfwd; +} + +void contr_rev_measure(void) { + REG_SETUP_BIT(ADMUX, MUX0); + REG_SETDOWN_BIT(ADMUX, MUX1); + REG_SETDOWN_BIT(ADMUX, MUX2); + REG_SETDOWN_BIT(ADMUX, MUX3); + + REG_SETUP_BIT(ADCSRA, ADSC); + while (ADCSRA & BIT(ADSC)); + uint16_t lval = (uint16_t)ADCL; + uint16_t hval = (uint16_t)ADCH; + hval = (hval << 8) & 0xFF00; + lval = lval & 0x00FF; + + if (++contr.rev_pos > REV_SIZE) { + contr.rev_pos = 0; + } + contr.rev[contr.rev_pos] = (hval | lval); +} + +float contr_rev_calc(void) { + uint32_t rev = 0; + uint8_t n = 0; + for (size_t i = 0; i < REV_SIZE; i++) { + if (contr.rev[i]) { + n++; + rev += contr.rev[i]; + } + } + float xrev = 0.0F; + if (n) { + rev /= n; + xrev = (float)rev / 10.0F; + } + return xrev; +} + + void contr_write_band(void) { eeprom_write_bytes(0x00, &contr.band, sizeof(contr.band)); } @@ -498,13 +605,19 @@ bool contr_key_is_pressed(void) { return false; } +#define CONTR_KEY_CNTINPRESS 100 +#define CONTR_KEY_CNTRELEASE 100 +#define CONTR_KEY_CNTUNTAP_READY 1200 +#define CONTR_KEY_CNTUNTAP_CLEAN 4000 + + void contr_key_handle(void) { if (!contr.key_was_pressed) { if (contr_key_is_pressed()) { contr.key_time_counter++; contr.key_time_untap++; } - if (contr.key_time_counter > 100) { + if (contr.key_time_counter > CONTR_KEY_CNTINPRESS) { contr.key_time_counter = 0; contr.key_was_pressed = true; } @@ -512,7 +625,7 @@ void contr_key_handle(void) { if (!contr_key_is_pressed()) { contr.key_time_counter++; } - if (contr.key_time_counter > 100) { + if (contr.key_time_counter > CONTR_KEY_CNTRELEASE) { contr.key_time_counter = 0; contr.key_was_pressed = false; contr.key_tap_counter++; @@ -521,10 +634,10 @@ void contr_key_handle(void) { } if (contr.key_tap_counter > 0) { contr.key_time_untap++; - if (contr.key_time_untap > 2000) { + if (contr.key_time_untap > CONTR_KEY_CNTUNTAP_READY) { contr.key_strokes_ended = true; } - if (contr.key_time_untap > 5000) { + if (contr.key_time_untap > CONTR_KEY_CNTUNTAP_CLEAN) { contr.key_was_pressed = false; contr.key_tap_counter = 0; contr.key_time_untap = 0; diff --git a/main.c b/main.c index c5f3216..eb537b1 100644 --- a/main.c +++ b/main.c @@ -22,8 +22,6 @@ int main(void) { i2c_init(); uartio_init(); disp_init(); - disp_clear(); - timer_init(); contr_init(); contr_setup(); sei();