main(void) { serial_baud_9600(); serial_mode_8e1(); serial_transmitter_enable(); sleep_mode_idle(); /* setup timer2 to trigger interrupt a * once every millisecond * 128 * (124 + 1) / 16MHz = 1ms */ timer2_mode_ctc(); timer2_clock_d128(); timer2_compare_a_set(124); timer2_interrupt_a_enable(); adc_reference_internal_5v(); adc_pin_select(5); adc_clock_d128(); adc_trigger_freerunning(); adc_trigger_enable(); adc_interrupt_enable(); adc_enable(); sei(); while (1) { char *p; p = sprint_uint16_b10(buf, value); *p++ = '\n'; *p = '\0'; serial_puts(buf); } }
main() { pin13_mode_output(); serial_baud_9600(); serial_mode_8e1(); serial_transmitter_enable(); sleep_mode_idle(); /* setup timer2 to trigger interrupt a * once every millisecond */ timer2_mode_ctc(); timer2_compare_a_set(124); timer2_clock_d128(); timer2_interrupt_a_enable(); sei(); while (1) { uint16_t now = time; if (now >= 6000) { char *p; timer2_clock_reset(); time = 0; p = sprint_uint16_b10(buf, now); *p++ = '\n'; *p = '\0'; serial_puts(buf); } sleep_enable(); sleep_cpu(); sleep_disable(); } }
int door_main(void) { serial_init(9600, 8e2); pin_mode_output(PIN_RFID_ENABLE); pin_mode_input(PIN_CLK); /* clk */ pin_mode_input(PIN_DATA); /* data */ pin_mode_output(PIN_GREEN_LED); /* green led lock */ pin_mode_output(PIN_YELLOW_LED); /* yellow led lock */ pin_mode_output(PIN_OPEN_LOCK); /* open */ pin_mode_output(PIN_DAYMODE); /* stay open */ pin_mode_output(PIN_STATUS_LED); /* yellow status */ pin_high(PIN_OPEN_LOCK); pin_high(PIN_DAYMODE); pin_high(PIN_GREEN_LED); pin_high(PIN_YELLOW_LED); /* trigger pin2 interrupt when the clock * signal goes high */ pin2_interrupt_mode_rising(); pin2_interrupt_enable(); data_reset(); /* setup timer1 to trigger interrupt a 4 times a second */ timer1_mode_ctc(); timer1_compare_a_set(62499); timer1_clock_d64(); timer1_interrupt_a_enable(); softserial_init(); pin_mode_output(PIN_RFID_ENABLE); pin_low(PIN_RFID_ENABLE); init_mfrc522(); sleep_mode_idle(); while (1) { /* * sleep if no new events need to be handled * while avoiding race conditions. see * http://www.nongnu.org/avr-libc/user-manual/group__avr__sleep.html */ cli(); if (events == EV_NONE && !ev_softserial) { sleep_enable(); sei(); sleep_cpu(); sleep_disable(); continue; } sei(); if (events & EV_SERIAL) { handle_serial_input(); continue; } if (ev_softserial) { handle_rfid_input(); } events &= ~EV_DATA; if (cnt > 0 && data[cnt - 1] == 0xB4) { if (cnt >= 10) { struct sha1_context ctx; char digest[SHA1_DIGEST_LENGTH]; sha1_init(&ctx); sha1_update(&ctx, (char *)data, 256); sha1_final(&ctx, digest); serial_print("HASH+"); serial_hexdump(digest, SHA1_DIGEST_LENGTH); serial_print("\n"); } data_reset(); continue; } if (events & EV_TIME) { char buf[20]; uint8_t len; len = check_mfrc522(buf, sizeof(buf)); handle_mfr_input(buf, len); } events &= ~EV_TIME; /* This code can be used during development, to simulate the press of the '#' button 8 seconds after every idle timeout: if (second == 32 && cnt < 255) { data[cnt] = 0xB4; cnt++; events |= EV_DATA; } */ if (second > 10*4) { serial_print("ALIVE\n"); second = 0; data_reset(); continue; } } }
main() { uint8_t state = 0; serial_baud_9600(); serial_mode_8e1(); serial_transmitter_enable(); sleep_mode_idle(); pin13_mode_output(); pin13_low(); /* setup timer2 to trigger interrupt a * once every millisecond * 128 * (124 + 1) / 16MHz = 1ms */ timer2_mode_ctc(); timer2_clock_d128(); timer2_compare_a_set(124); timer2_interrupt_a_enable(); adc_reference_internal_5v(); adc_pin_select(5); adc_clock_d128(); adc_trigger_freerunning(); adc_trigger_enable(); adc_interrupt_enable(); adc_enable(); sei(); while (1) { uint16_t value; cli(); if (!new_value) { sleep_enable(); sei(); sleep_cpu(); sleep_disable(); continue; } sei(); value = adc_data(); new_value = 0; if (state && value < BOUND_LOW) { uint16_t now = time; char *p; timer2_clock_reset(); time = 0; pin13_low(); p = sprint_uint16_b10(buf, now); *p++ = '\n'; *p = '\0'; serial_puts(buf); state = 0; continue; } if (value > BOUND_HIGH) { pin13_high(); state = 1; } } }