/* FUSES: Low Fuse: 0x62 Default 0xC0 External Oscillator, BOD (write lfuse 0 0xC0) 0xF7 Full Swing Crystal Oscillator (write lfuse 0 0xF7) 0xFF Low Power Crystal Oscillator (untested) High Fuse 0xDF Default 0xDC BOD enabled (4.3V) 0xCF watchdog enabled 0xCC BOD enabled (4.3V) and watchdog enabled Extended Fuse 0x01 Default avrdude -c stk500 -P /dev/ttyS0 -p atmega88 -U flash:w:upper-tank-sensor.srec avrdude -c usbasp -p atmega168p -U flash:w:upper-tank-sensor.srec avrdude -c stk500 -P /dev/ttyS0 -p atmega88 -t avrdude -c usbasp -p atmega168p -t dump lfuse 0 1 write lfuse 0 PINS: AVR Conn Functions Usage 1 P10-3 PD3 OC2B 2 P4-13 PD4 3 GND 4 VCC 5 GND 6 VCC 7 PB6 XTAL1 crystal 8 PB7 XTAL2 crystal 9 P8-3 PD5 OC0B 10 P6-3 PD6 OC0A 11 P4-14 PD7 AIN1 12 P2-6 PB0 ICP1 13 P2-4 PB1 OC1A 14 P2-5 PB2 OC1B 15 P1-4 PB3 MOSI/OC2A ISP 16 P1-1 PB4 MISO ISP 17 P1-3 PB5 SCK ISP 18 AVCC 19 P4-4 ADC6 20 P4-5 AREF 21 GND 22 P4-6 ADC7 23 P4-7 PC0 ADC0 lower sensor 24 P4-8 PC1 ADC1 higher sensor 25 P4-9 PC2 ADC2 overflow sensor 26 P4-10 PC3 ADC3 27 P4-11 PC4 ADC4 28 P4-12 PC5 ADC5 29 P1-5 PC6 /RESET ISP 30 PD0 RXD RS485 RX 31 PD1 TXD RS485 TX 32 PD2 RS485 driver enable */ #define F_CPU 18432000 #include #include #include #include #include #define SENSOR_VALUE_COUNT 8 #define DELAY 125 #define BAUD_RATE 9600 typedef struct { uint8_t sensor_state; uint8_t sensor_value_latest; uint8_t sensor_values[SENSOR_VALUE_COUNT]; } data_t; static data_t data; static void initialize() { int8_t i; data.sensor_state = 0; data.sensor_value_latest = 0; for( i=SENSOR_VALUE_COUNT-1; i>=0; i-- ) { data.sensor_values[i] = 0; } // timer 2: Fast PWM, Top=OCR2A, clock/1024, overflow @ 125Hz TCCR2A = (1<=0; i-- ) { sensors_on &= ~data.sensor_values[i]; sensors_off &= data.sensor_values[i]; } data.sensor_values[data.sensor_value_latest] = sensors; data.sensor_value_latest++; if( data.sensor_value_latest >= SENSOR_VALUE_COUNT ) { data.sensor_value_latest = 0; } data.sensor_state = (data.sensor_state & ~sensors_off) | sensors_on; return 1; } static void send_data( uint8_t counter) { uint16_t checksum; xorshift16_init( XORSHIFT16_INIT_DEFAULT ); xorshift16_next(); xorshift16_add( counter ); usart_add_byte( counter ); usart_add_byte( ~counter ); xorshift16_next(); xorshift16_add( data.sensor_state ); usart_add_byte( data.sensor_state ); usart_add_byte( ~data.sensor_state ); xorshift16_next(); checksum = xorshift16_get_state(); usart_add_byte( checksum ); usart_add_byte( checksum>>8 ); } int main() { uint8_t delay = DELAY; uint8_t counter = 0; initialize(); while( 1 ) { if( timing() ) { delay--; if( delay == 0 ) { delay = DELAY; send_data( counter++ ); } } usart_send(); } }