From: Jan Michel Date: Fri, 30 May 2014 15:48:48 +0000 (+0200) Subject: latest firmware version X-Git-Url: https://jspc29.x-matter.uni-frankfurt.de/git/?a=commitdiff_plain;h=d19a046410d315915c41e02b042ab80b7832d664;p=electronics.git latest firmware version --- diff --git a/Power/firmware/PowerSwitch.c b/Power/firmware/PowerSwitch.c index 6a67b21..99a5db1 100755 --- a/Power/firmware/PowerSwitch.c +++ b/Power/firmware/PowerSwitch.c @@ -34,10 +34,11 @@ #define STARTTX(i) txcnt = (i);UCSR1B |= (1<< UDRIE1) #define ISMYADDR() (rxbuf[1] == '0' && (rxbuf[2] == '0' || rxbuf[2] == '1')) - -uint8_t output_enable = 0; +volatile uint8_t settings_changed = 0; +uint8_t output_enable = 0x3; uint8_t output_error = 0; uint16_t adc[2]; +uint16_t avgadc[2] = {0,0}; uint8_t rxcnt = 0, txcnt = 0, txpoint = 0; uint8_t rxbuf[7]; @@ -91,17 +92,20 @@ void send_answer_chars(uint8_t a, uint8_t b, uint8_t c) { void switchoutput(uint8_t chan, int8_t to) { if(to == -1) output_enable ^= (1<= -1) {settings_changed = 3;} + + uint8_t en1 = ((output_enable & 1) && !(output_error & 1))?0:1; + uint8_t en2 = ((output_enable & 2) && !(output_error & 2))?0:1; + PORTA = (PORTA & ~(3<<2)) | ((en1&1)<<3) | ((en2&1)<<2); + } ISR(TIMER0_OVF_vect) { @@ -109,10 +113,11 @@ ISR(TIMER0_OVF_vect) { if(!(PINA & 0x40)) {dwncnt[0]++;} else {dwncnt[0] = 0;} if(!(PINB & 0x04)) {dwncnt[1]++;} else {dwncnt[1] = 0;} - if(dwncnt[0] == 100) {switchoutput(0,-1);} - if(dwncnt[1] == 100) {switchoutput(1,-1);} + if(dwncnt[0] == 50) {switchoutput(0,-1);} + if(dwncnt[1] == 50) {switchoutput(1,-1);} ADCSRA |= (1< 7) { txpoint = 0; + txcnt = 0; UCSR1B &= ~(1<< UDRIE1); } } ISR(USART1_RX_vect) { uint8_t buf = UDR1; - if (rxcnt != 0 || (buf == 'S' || buf == 'A' || buf == 'L' || buf == 'C')) { + if (rxcnt != 0 || (buf == 'S' || buf == 'A' || buf == 'L' || buf == 'C' || buf == 'D')) { rxbuf[rxcnt++] = buf; } //Forward any incoming 4 letter answer @@ -159,8 +170,8 @@ ISR(USART1_RX_vect) { // } if(rxcnt == 5) { if (rxbuf[0] == 'A') { - memcpy ((uint8_t*)txbuf,(uint8_t*)rxbuf,4); - STARTTX(4); + memcpy ((uint8_t*)txbuf,(uint8_t*)rxbuf,5); + STARTTX(5); } //Four letter 'switch' command if (rxbuf[0] == 'S') { @@ -186,6 +197,16 @@ ISR(USART1_RX_vect) { forward_msg(5); } } + //Read average current command + if (rxbuf[0] == 'D') { + if (ISMYADDR()) { + if (rxbuf[3] == '?') + send_answer_hex(avgadc[rxbuf[2]-'0']/8); + } + else { + forward_msg(5); + } + } //Read current limit if (rxbuf[0] == 'L' && rxbuf[3] == '?') { if (ISMYADDR()) { @@ -204,7 +225,8 @@ ISR(USART1_RX_vect) { uint16_t lim = hex_to_int(rxbuf[3])*256 + hex_to_int(rxbuf[4])*16 + hex_to_int(rxbuf[5]); limit[rxbuf[2]] = lim; } - send_answer_hex(limit[rxbuf[2]]); + send_answer_hex(limit[rxbuf[2]]); + settings_changed = rxbuf[2]+1; } else { forward_msg(7); @@ -216,18 +238,44 @@ ISR(USART1_RX_vect) { } +void eeprom_write(uint8_t addr, uint8_t data){ + while(EECR & (1< 6M/256*256 = 91.5 Hz TIMSK0 = (1 << TOIE0); //Overflow interrupt` - ADMUXA = 1; //(1 (Out2),7 (Out1)) + ADMUXA = 7; //(1 (Out2),7 (Out1)) ADMUXB = (6 << REFS0); //2.2V reference, with capacitor - ADCSRA = (1 << ADEN) | (1 << ADSC) | (1 << ADIE) | (7 << ADPS0); //enable, start, irq, /128 + ADCSRA = (1 << ADEN) | (1 << ADSC) | (1 << ADIE) | (6 << ADPS0); //enable, start, irq, /128 ADCSRB = 0; DIDR0 = (1<>8)&0xFF); + } + if (settings_changed == 2) { + settings_changed = 0; + eeprom_write(0x12,limit[1]&0xFF); + eeprom_write(0x13,(limit[1]>>8)&0xFF); + } + if (settings_changed == 3) { + settings_changed = 0; + eeprom_write(0x14,output_enable); + } } } \ No newline at end of file