From 8f1c69ddf0882d885a6ee9af5b94ad7e54ac476d Mon Sep 17 00:00:00 2001 From: Jan Michel Date: Fri, 27 Jan 2017 17:57:52 +0100 Subject: [PATCH] Add tested code version of Power Switch 48 --- atmega32u4/power48/main.c | 170 +++++++++++++++++++++++++++----------- 1 file changed, 122 insertions(+), 48 deletions(-) diff --git a/atmega32u4/power48/main.c b/atmega32u4/power48/main.c index c17970e..89ccd40 100644 --- a/atmega32u4/power48/main.c +++ b/atmega32u4/power48/main.c @@ -33,21 +33,29 @@ #define ISMYADDR() (rxbuf[1] == '0' && (rxbuf[2] == '0' || rxbuf[2] == '1' || rxbuf[2] == '2' || rxbuf[2] == '3') ) +#define LED2_ON() PORTB |= (1<= -1) {settings_changed |= 16;} - if((output_enable & chan) && !(output_error & chan)) { + if((output_enable & (1<< chan))) { // && !(output_error & (1<< chan)) switch (chan) { case 0 : PORTD |= (1<<4); break; case 1 : PORTB |= (1<<6); break; @@ -147,22 +160,43 @@ void switchoutput(uint8_t chan, int8_t to) { } void correct_adc(uint8_t channel) { - if(adc_enable == 1) return; - if(adc_enable == 2) { - adc[channel] = adc[channel]*2 - (adc[channel]>>3); + if (calibphase) { + //LED2_ON(); + adc_offset[channel] = adc[channel]; + if (channel == 3) { + calibphase = 0; + switchoutput(0,-3); + switchoutput(1,-3); + switchoutput(2,-3); + switchoutput(3,-3); + } + } + if (adc[channel] > 0x300) + adc[channel] = 0; + if(adc_offset[channel] > adc[channel] ) { + adc[channel] = adc_offset[channel] - adc[channel]; + adc[channel] *= 25; + } + else { + adc[channel] = 0; } } + + + //Buttons 0 1 2 3: PD1, PD0, PB7, PB3 ISR(TIMER0_OVF_vect) { static uint8_t dwncnt[4] = {0,0,0,0}; - if(!(PIND & 0x02)) {dwncnt[0]++;} else {dwncnt[0] = 0;} - if(!(PIND & 0x01)) {dwncnt[1]++;} else {dwncnt[1] = 0;} - if(!(PINB & 0x80)) {dwncnt[2]++;} else {dwncnt[2] = 0;} - if(!(PINB & 0x08)) {dwncnt[3]++;} else {dwncnt[3] = 0;} + if(!(PIND & 0x02)) {if(dwncnt[0]<51) dwncnt[0]++;} else {dwncnt[0] = 0;} + if(!(PIND & 0x01)) {if(dwncnt[1]<51) dwncnt[1]++;} else {dwncnt[1] = 0;} + if(!(PINB & 0x80)) {if(dwncnt[2]<51) dwncnt[2]++;} else {dwncnt[2] = 0;} + if(!(PINB & 0x08)) {if(dwncnt[3]<51) dwncnt[3]++;} else {dwncnt[3] = 0;} time++; for(uint8_t i=0; i<=3;i++) { - if(dwncnt[i] == 50) {switchoutput(i,-1);} + if(dwncnt[i] == 50) { + switchoutput(i,-1); + } if(countdown[i] != 0) { if(countdown[i] == 1) { switchoutput(i,-1); @@ -173,6 +207,7 @@ ISR(TIMER0_OVF_vect) { if(adc_enable) {ADCSRA |= (1< 7 || txbuf[txpoint] == 0) { + txpoint = 0; + UCSR1B &= ~(1<< UDRIE1); + } + } + __attribute__((naked)) int main(void) { @@ -340,19 +399,20 @@ __attribute__((naked)) int main(void) { //Select: PD5 // Configure ports + + MCUCR |= (1<= 0) { +// LED2_ON(); + isMaster = 1; + SELECT_MASTER(); getdata(n); } - if(settings_changed != 0 && (lasttime & 0xff) == 255 && (time & 0xff) == 0) { + if(settings_changed != 0 && (lasttime & 0x3ff) == 0x3ff && (time & 0x3ff) == 0) { update_eeprom(); } lasttime = time; -- 2.43.0