/***********************************************************************/ /* */ /* Heptagon */ /* */ /* Gwenael Delaval, LIG/INRIA, UJF */ /* Leonard Gerard, Parkas, ENS */ /* Adrien Guatto, Parkas, ENS */ /* Cedric Pasteur, Parkas, ENS */ /* Marc Pouzet, Parkas, ENS */ /* */ /* Copyright 2012 ENS, INRIA, UJF */ /* */ /* This file is part of the Heptagon compiler. */ /* */ /* Heptagon is free software: you can redistribute it and/or modify it */ /* under the terms of the GNU General Public License as published by */ /* the Free Software Foundation, either version 3 of the License, or */ /* (at your option) any later version. */ /* */ /* Heptagon is distributed in the hope that it will be useful, */ /* but WITHOUT ANY WARRANTY; without even the implied warranty of */ /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ /* GNU General Public License for more details. */ /* */ /* You should have received a copy of the GNU General Public License */ /* along with Heptagon. If not, see */ /* */ /***********************************************************************/ #include #include #include #include #include "avr.h" ISR(TIMER1_COMPA_vect) { run_timers(); } static inline void set_ocr1a(uint16_t value) { OCR1AH = value >> 8; OCR1AL = value; } /* Source: https://adnbr.co.uk/articles/counting-milliseconds */ void init_timer1(unsigned int ms) { assert(ms < 1000); TCCR1B |= _BV(WGM12) | _BV(CS11); set_ocr1a(((ms * F_CPU) / 1000) / 8); TIMSK1 |= _BV(OCIE1A); sei(); } void atomic_memcpy(void *dest, const void *src, size_t size) { ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { memcpy(dest, src, size); } }