This commit is contained in:
Олег Бородин
2024-08-20 20:06:40 +02:00
parent daac0e8e1f
commit ec164d205a
2 changed files with 226 additions and 115 deletions

339
contr.c
View File

@@ -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;

2
main.c
View File

@@ -22,8 +22,6 @@ int main(void) {
i2c_init();
uartio_init();
disp_init();
disp_clear();
timer_init();
contr_init();
contr_setup();
sei();