-#define F_CPU 11059200ul
+#define F_CPU 16000000L
#include <avr/io.h>
#include <util/delay.h>
#define USART_BAUDRATE 9600
#define UBRR_VALUE (((F_CPU/(USART_BAUDRATE*16UL)))-1)
+// this will output only changes on serial
+#define SERIAL_CHANGES 0
+
void serial_init(){
// initialize USART (must call this before using it)
UBRR0=UBRR_VALUE; // set baud rate
void serial_break(){
serial_send(10); // new line
- serial_send(13); // carriage return
+// serial_send(13); // carriage return
}
void serial_comma(){
serial_send(','); // comma
volatile uint8_t regD;
// these values will hold the current/voltage value
-volatile char current[4];
-volatile char voltage[4];
+volatile char current[4] = "XXXX";
+volatile char voltage[4] = "XXXX";
+
+volatile int display_sum = 0;
+volatile int last_display_sum = 0;
void read_capture(){
// start by creating a "letter" variable which defines pin states
uint8_t letter=0;
- if(regD&(1<<PD0)){letter|=(1<<7);} // letter 1 (voltage MSB)
- if(regD&(1<<PD2)){letter|=(1<<6);} // letter 2
- if(regD&(1<<PD3)){letter|=(1<<5);} // letter 3
- if(regD&(1<<PD4)){letter|=(1<<4);} // letter 4
- if(regD&(1<<PD5)){letter|=(1<<3);} // letter 5 (current MSB)
- if(regD&(1<<PD6)){letter|=(1<<2);} // letter 6
- if(regD&(1<<PD7)){letter|=(1<<1);} // letter 7
- if(regB&(1<<PB0)){letter|=(1<<0);} // letter 8
+ if(regC&(1<<PC0)){letter|=(1<<7);} // letter 1 (voltage MSB)
+ if(regC&(1<<PC3)){letter|=(1<<6);} // letter 2
+ if(regC&(1<<PC4)){letter|=(1<<5);} // letter 3
+ if(regD&(1<<PD2)){letter|=(1<<4);} // letter 4
+ if(regB&(1<<PB3)){letter|=(1<<3);} // letter 5 (current MSB)
+ if(regD&(1<<PD4)){letter|=(1<<2);} // letter 6
+ if(regD&(1<<PD3)){letter|=(1<<1);} // letter 7
+ if(regD&(1<<PD5)){letter|=(1<<0);} // letter 8
// try to match expected pin states
if (letter==0b10000000) {return '1';}
// returned value will be in ASCII
// returns 0 if no letter is selected, or if it's confusing
int segments=0;
- if(regC&(1<<PC5)){segments|=(1<<7);} // A (MSB)
- if(regC&(1<<PC4)){segments|=(1<<6);} // B
- if(regC&(1<<PC3)){segments|=(1<<5);} // C
- if(regC&(1<<PC2)){segments|=(1<<4);} // D
- if(regC&(1<<PC1)){segments|=(1<<3);} // E
- if(regC&(1<<PC0)){segments|=(1<<2);} // F
- if(regB&(1<<PB2)){segments|=(1<<1);} // G (LSB)
- //if(regB&(1<<PB1)){}//H
+ if(regC&(1<<PC1)){segments|=(1<<7);} // A (MSB)
+ if(regC&(1<<PC5)){segments|=(1<<6);} // B
+ if(regD&(1<<PD7)){segments|=(1<<5);} // C
+ if(regB&(1<<PB1)){segments|=(1<<4);} // D
+ if(regB&(1<<PB2)){segments|=(1<<3);} // E
+ if(regC&(1<<PC2)){segments|=(1<<2);} // F
+ if(regD&(1<<PD6)){segments|=(1<<1);} // G (LSB)
+ //if(regB&(1<<PB0)){}//H
if(segments==0b00001000) {return '9';}
if(segments==0b00000000) {return '8';}
if (capture_letter('1'+i)) {break;}
}
}
-
+
+#if SERIAL_CHANGES
+ // don't send same values over serial
+ for(i=0;i<4;i++) {
+ display_sum = voltage[i] + current[i];
+ }
+ if ( display_sum == last_display_sum ) {
+ return;
+ } else {
+ last_display_sum = display_sum;
+ }
+#endif
+
for(i=0;i<4;i++) {
serial_send(voltage[i]);
if (i==1){serial_send('.');}
}
- serial_send(',');
+ serial_send(' ');
for(i=0;i<4;i++) {
serial_send(current[i]);
if (i==2){serial_send('.');}