diff --git a/firmware/hcs12ss59t b/firmware/hcs12ss59t index 7828be2..ed32a6d 160000 --- a/firmware/hcs12ss59t +++ b/firmware/hcs12ss59t @@ -1 +1 @@ -Subproject commit 7828be22aa5a97c31f8d8286b50336f9193224a1 +Subproject commit ed32a6d2fd0c2544ef753aa9e827660e56ff7d59 diff --git a/firmware/main.c b/firmware/main.c index 3d72a0a..dc90d1d 100755 --- a/firmware/main.c +++ b/firmware/main.c @@ -25,6 +25,8 @@ #include "uart.h" #include "hcs12ss59t/hcs12ss59t.h" +void vu_meter(); + enum { SEND_ENCAPSULATED_COMMAND = 0, GET_ENCAPSULATED_RESPONSE, @@ -292,6 +294,7 @@ void waitboot() int main(void) { waitboot(); + vu_meter(); // For debugging only wdt_enable(WDTO_1S); odDebugInit(); hardwareInit(); @@ -342,3 +345,95 @@ int main(void) return 0; } +#define ADC_NOISE 15 // ADC RAW value +#define BAR_SPEED 22 // In application cycles +#define PK_SPEED 40 // In application cycles +#define PK_DELAY 36 // In PKBAR cycles + +void vu_meter() +{ + uint16_t vu_new; + uint8_t vu[2] = {0, 0}; + uint8_t pk[2] = {0, 0}; + uint8_t pk_del[2] = {0, 0}; + uint16_t adc_val[2]; + int cnt = 0; + uint16_t adc_max = 175; + int i; + + cli(); + + /* Config ADC */ + ADCSRA = (1 << ADEN) | (1 << ADPS1); + + hcs12ss59t_init(); + DDRD |= (1 << PD0); + FILAMENT_EN; + hcs12ss59t_set_brightness(8); + hcs12ss59t_set_text(" HCS12SS59T "); + hcs12ss59t_en_progress(); + + /* main event loop */ + for(;;){ + if (!(PIND & (1 << PD7))) { + cli(); + hcs12ss59t_set_text("-BOOTLOADER-"); + FILAMENT_DIS; + wdt_enable(WDTO_15MS); + while (1); // WD Timeout -> CPU reset + } + + /* Acquire data */ + ADMUX = (4) | (1 << REFS0) | (1 << REFS1) | (1 << REFS1); + ADCSRA |= (1 << ADSC); + while (!(ADCSRA & (1 << ADIF))); + ADCSRA |= (1 << ADIF); + ADMUX = (5) | (1 << REFS0) | (1 << REFS1) | (1 << REFS1); + ADCSRA |= (1 << ADSC); + adc_val[0] = ADC; + while (!(ADCSRA & (1 << ADIF))); + ADCSRA |= (1 << ADIF); + adc_val[1] = ADC; + + + for (i = 0; i < 2; ++i) { + if (adc_val[i] < ADC_NOISE) + adc_val[i] = 0; + else + adc_val[i] -= ADC_NOISE; + vu_new = adc_val[i] * 60 / adc_max; + if (vu_new >= vu[i]) { + vu[i] = vu_new; + } else { + if ((cnt % BAR_SPEED) == 0) { + if (vu[i] > 0) { + vu[i] -= 1; + } + } + } + if (vu_new > pk[i]) { + pk[i] = vu_new; + pk_del[i] = PK_DELAY; + } else { + if (pk_del[i] == 0) { + if ((cnt % PK_SPEED) == 0) { + if (pk[i] > 0) { + pk[i]--; + } + } + } else { + if ((cnt % PK_SPEED) == 0) { + pk_del[i]--; + } + } + } + } + + hcs12ss59t_set_progress_peak(vu[0], vu[1], pk[0], pk[1]); + + if (cnt == 209) + cnt = 0; + else + cnt++; + } +}