|  |  |  | @ -17,6 +17,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>. | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | #include <avr/io.h> | 
			
		
	
		
			
				
					|  |  |  |  | #include <avr/interrupt.h> | 
			
		
	
		
			
				
					|  |  |  |  | #include <util/atomic.h> | 
			
		
	
		
			
				
					|  |  |  |  | #include <stdint.h> | 
			
		
	
		
			
				
					|  |  |  |  | #include "timer_avr.h" | 
			
		
	
		
			
				
					|  |  |  |  | #include "timer.h" | 
			
		
	
	
		
			
				
					|  |  |  | @ -24,7 +25,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>. | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | // counter resolution 1ms
 | 
			
		
	
		
			
				
					|  |  |  |  | // NOTE: union { uint32_t timer32; struct { uint16_t dummy; uint16_t timer16; }}
 | 
			
		
	
		
			
				
					|  |  |  |  | volatile uint32_t timer_count = 0; | 
			
		
	
		
			
				
					|  |  |  |  | volatile uint32_t timer_count; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | void timer_init(void) | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
	
		
			
				
					|  |  |  | @ -52,10 +53,9 @@ void timer_init(void) | 
			
		
	
		
			
				
					|  |  |  |  | inline | 
			
		
	
		
			
				
					|  |  |  |  | void timer_clear(void) | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |     uint8_t sreg = SREG; | 
			
		
	
		
			
				
					|  |  |  |  |     cli(); | 
			
		
	
		
			
				
					|  |  |  |  |   ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { | 
			
		
	
		
			
				
					|  |  |  |  |     timer_count = 0; | 
			
		
	
		
			
				
					|  |  |  |  |     SREG = sreg; | 
			
		
	
		
			
				
					|  |  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | inline | 
			
		
	
	
		
			
				
					|  |  |  | @ -63,10 +63,9 @@ uint16_t timer_read(void) | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |     uint32_t t; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     uint8_t sreg = SREG; | 
			
		
	
		
			
				
					|  |  |  |  |     cli(); | 
			
		
	
		
			
				
					|  |  |  |  |     t = timer_count; | 
			
		
	
		
			
				
					|  |  |  |  |     SREG = sreg; | 
			
		
	
		
			
				
					|  |  |  |  |     ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { | 
			
		
	
		
			
				
					|  |  |  |  |       t = timer_count; | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     return (t & 0xFFFF); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
	
		
			
				
					|  |  |  | @ -76,10 +75,9 @@ uint32_t timer_read32(void) | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |     uint32_t t; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     uint8_t sreg = SREG; | 
			
		
	
		
			
				
					|  |  |  |  |     cli(); | 
			
		
	
		
			
				
					|  |  |  |  |     t = timer_count; | 
			
		
	
		
			
				
					|  |  |  |  |     SREG = sreg; | 
			
		
	
		
			
				
					|  |  |  |  |     ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { | 
			
		
	
		
			
				
					|  |  |  |  |       t = timer_count; | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     return t; | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
	
		
			
				
					|  |  |  | @ -89,10 +87,9 @@ uint16_t timer_elapsed(uint16_t last) | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |     uint32_t t; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     uint8_t sreg = SREG; | 
			
		
	
		
			
				
					|  |  |  |  |     cli(); | 
			
		
	
		
			
				
					|  |  |  |  |     t = timer_count; | 
			
		
	
		
			
				
					|  |  |  |  |     SREG = sreg; | 
			
		
	
		
			
				
					|  |  |  |  |     ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { | 
			
		
	
		
			
				
					|  |  |  |  |       t = timer_count; | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     return TIMER_DIFF_16((t & 0xFFFF), last); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
	
		
			
				
					|  |  |  | @ -102,10 +99,9 @@ uint32_t timer_elapsed32(uint32_t last) | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |     uint32_t t; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     uint8_t sreg = SREG; | 
			
		
	
		
			
				
					|  |  |  |  |     cli(); | 
			
		
	
		
			
				
					|  |  |  |  |     t = timer_count; | 
			
		
	
		
			
				
					|  |  |  |  |     SREG = sreg; | 
			
		
	
		
			
				
					|  |  |  |  |     ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { | 
			
		
	
		
			
				
					|  |  |  |  |       t = timer_count; | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     return TIMER_DIFF_32(t, last); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
	
		
			
				
					|  |  |  | 
 |