#include <avr/interrupt.h>
#include <avr/io.h>
#include <avr/sleep.h>
#include <util/delay.h>
#include <stddef.h>
#include <stdint.h>
static volatile uint8_t count = 0xffu;
static volatile size_t overflows = 0;
enum {
PRESCALER = 256u,
TCNT1_START = 65536lu - F_CPU / PRESCALER,
TCNT1_MAX = 65536lu - TCNT1_START,
CLOCKS_PER_SECOND = F_CPU / PRESCALER / TCNT1_MAX
};
ISR(INT0_vect) {
PORTB = --count;
}
ISR(INT1_vect) {
TCCR1B ^= _BV(CS12);
TCNT1H = TCNT1_START >> 8u;
TCNT1L = TCNT1_START << 8u;
}
ISR(TIMER1_OVF_vect) {
if (++overflows >= CLOCKS_PER_SECOND) {
PORTB = --count;
overflows = 0;
}
TCNT1H = TCNT1_START >> 8u;
TCNT1L = TCNT1_START << 8u;
}
int main(void) {
DDRB = 0xffu;
PORTB = 0xffu;
GICR |= _BV(INT0) | _BV(INT1);
MCUCR |= _BV(ISC00) | _BV(ISC01) | _BV(ISC10) | _BV(ISC11);
TIMSK |= _BV(TOIE1);
TCCR1B |= _BV(CS12);
TCNT1H = TCNT1_START >> 8u;
TCNT1L = TCNT1_START << 8u;
sei();
set_sleep_mode(SLEEP_MODE_IDLE);
for (;;) {
sleep_mode();
}
}
I2luY2x1ZGUgPGF2ci9pbnRlcnJ1cHQuaD4KI2luY2x1ZGUgPGF2ci9pby5oPgojaW5jbHVkZSA8YXZyL3NsZWVwLmg+CiNpbmNsdWRlIDx1dGlsL2RlbGF5Lmg+CgojaW5jbHVkZSA8c3RkZGVmLmg+CiNpbmNsdWRlIDxzdGRpbnQuaD4KCnN0YXRpYyB2b2xhdGlsZSB1aW50OF90IGNvdW50ID0gMHhmZnU7CnN0YXRpYyB2b2xhdGlsZSBzaXplX3Qgb3ZlcmZsb3dzID0gMDsKCmVudW0gewogIFBSRVNDQUxFUiA9IDI1NnUsCiAgVENOVDFfU1RBUlQgPSA2NTUzNmx1IC0gRl9DUFUgLyBQUkVTQ0FMRVIsCiAgVENOVDFfTUFYID0gNjU1MzZsdSAtIFRDTlQxX1NUQVJULAogIENMT0NLU19QRVJfU0VDT05EID0gRl9DUFUgLyBQUkVTQ0FMRVIgLyBUQ05UMV9NQVgKfTsKCklTUihJTlQwX3ZlY3QpIHsKICBQT1JUQiA9IC0tY291bnQ7Cn0KCklTUihJTlQxX3ZlY3QpIHsKICBUQ0NSMUIgXj0gX0JWKENTMTIpOwogIFRDTlQxSCA9IFRDTlQxX1NUQVJUID4+IDh1OwogIFRDTlQxTCA9IFRDTlQxX1NUQVJUIDw8IDh1Owp9CgpJU1IoVElNRVIxX09WRl92ZWN0KSB7CiAgaWYgKCsrb3ZlcmZsb3dzID49IENMT0NLU19QRVJfU0VDT05EKSB7CiAgICBQT1JUQiA9IC0tY291bnQ7CiAgICBvdmVyZmxvd3MgPSAwOwogIH0KICBUQ05UMUggPSBUQ05UMV9TVEFSVCA+PiA4dTsKICBUQ05UMUwgPSBUQ05UMV9TVEFSVCA8PCA4dTsKfQoKaW50IG1haW4odm9pZCkgewogIEREUkIgPSAweGZmdTsKICBQT1JUQiA9IDB4ZmZ1OwogIEdJQ1IgfD0gX0JWKElOVDApIHwgX0JWKElOVDEpOwogIE1DVUNSIHw9IF9CVihJU0MwMCkgfCBfQlYoSVNDMDEpIHwgX0JWKElTQzEwKSB8IF9CVihJU0MxMSk7CiAgVElNU0sgfD0gX0JWKFRPSUUxKTsKICBUQ0NSMUIgfD0gX0JWKENTMTIpOwogIFRDTlQxSCA9IFRDTlQxX1NUQVJUID4+IDh1OwogIFRDTlQxTCA9IFRDTlQxX1NUQVJUIDw8IDh1OwogIHNlaSgpOwogIHNldF9zbGVlcF9tb2RlKFNMRUVQX01PREVfSURMRSk7CiAgZm9yICg7OykgewogICAgc2xlZXBfbW9kZSgpOwogIH0KfQo=