diff options
author | Fabio Utzig <utzig@utzig.org> | 2016-04-09 13:57:38 +0000 |
---|---|---|
committer | Fabio Utzig <utzig@utzig.org> | 2016-04-09 13:57:38 +0000 |
commit | d873e4ed7bc231daa6cb378b3a300b457ff0e0cf (patch) | |
tree | 3c5e1cc07e5de902c7adcb55e8837f49e961d881 | |
parent | aa91fa657699d253a915fc392e4e8af9e54c6c93 (diff) | |
download | ChibiOS-d873e4ed7bc231daa6cb378b3a300b457ff0e0cf.tar.gz ChibiOS-d873e4ed7bc231daa6cb378b3a300b457ff0e0cf.tar.bz2 ChibiOS-d873e4ed7bc231daa6cb378b3a300b457ff0e0cf.zip |
[AVR] Fix timer usage for ATmega128
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@9263 35acf78f-673a-0410-8e92-d51de3d6d3f4
-rw-r--r-- | os/hal/ports/AVR/hal_st_lld.c | 51 | ||||
-rw-r--r-- | os/hal/ports/AVR/hal_st_lld.h | 18 |
2 files changed, 52 insertions, 17 deletions
diff --git a/os/hal/ports/AVR/hal_st_lld.c b/os/hal/ports/AVR/hal_st_lld.c index 4d5b545e8..0a33f16ab 100644 --- a/os/hal/ports/AVR/hal_st_lld.c +++ b/os/hal/ports/AVR/hal_st_lld.c @@ -62,20 +62,45 @@ /* Find the most suitable prescaler setting for the desired OSAL_ST_FREQUENCY */
#if ((F_CPU / OSAL_ST_FREQUENCY) <= AVR_TIMER_COUNTER_MAX)
+
#define AVR_TIMER_PRESCALER 1
- #define AVR_TIMER_PRESCALER_BITS (0<<CS02)|(0<<CS01)|(1<<CS00); /* CLK */
+ #define AVR_TIMER_PRESCALER_BITS ((0<<CS02)|(0<<CS01)|(1<<CS00)) /* CLK */
+
#elif ((F_CPU / OSAL_ST_FREQUENCY / 8) <= AVR_TIMER_COUNTER_MAX)
+
#define AVR_TIMER_PRESCALER 8
- #define AVR_TIMER_PRESCALER_BITS (0<<CS02)|(1<<CS01)|(0<<CS00); /* CLK/8 */
+ #define AVR_TIMER_PRESCALER_BITS ((0<<CS02)|(1<<CS01)|(0<<CS00)) /* CLK/8 */
+
#elif ((F_CPU / OSAL_ST_FREQUENCY / 64) <= AVR_TIMER_COUNTER_MAX)
+
#define AVR_TIMER_PRESCALER 64
- #define AVR_TIMER_PRESCALER_BITS (0<<CS02)|(1<<CS01)|(1<<CS00); /* CLK/64 */
+
+ #ifdef __AVR_ATmega128__
+ #define AVR_TIMER_PRESCALER_BITS ((1<<CS02)|(0<<CS01)|(0<<CS00)) /* CLK/64 */
+ #else
+ #define AVR_TIMER_PRESCALER_BITS ((0<<CS02)|(1<<CS01)|(1<<CS00)) /* CLK/64 */
+ #endif
+
#elif ((F_CPU / OSAL_ST_FREQUENCY / 256) <= AVR_TIMER_COUNTER_MAX)
+
#define AVR_TIMER_PRESCALER 256
- #define AVR_TIMER_PRESCALER_BITS (1<<CS02)|(0<<CS01)|(0<<CS00); /* CLK/256 */
+
+ #ifdef __AVR_ATmega128__
+ #define AVR_TIMER_PRESCALER_BITS ((1<<CS02)|(1<<CS01)|(0<<CS00)) /* CLK/256 */
+ #else
+ #define AVR_TIMER_PRESCALER_BITS ((1<<CS02)|(0<<CS01)|(0<<CS00)) /* CLK/256 */
+ #endif
+
#elif ((F_CPU / OSAL_ST_FREQUENCY / 1024) <= AVR_TIMER_COUNTER_MAX)
+
#define AVR_TIMER_PRESCALER 1024
- #define AVR_TIMER_PRESCALER_BITS (1<<CS02)|(0<<CS01)|(1<<CS00); /* CLK/1024 */
+
+ #ifdef __AVR_ATmega128__
+ #define AVR_TIMER_PRESCALER_BITS (1<<CS02)|(1<<CS01)|(1<<CS00); /* CLK/1024 */
+ #else
+ #define AVR_TIMER_PRESCALER_BITS (1<<CS02)|(0<<CS01)|(1<<CS00); /* CLK/1024 */
+ #endif
+
#else
#error "Frequency too low for timer, please set OSAL_ST_FREQUENCY to a higher value"
#endif
@@ -165,16 +190,16 @@ void st_lld_init(void) { */
/* CTC mode, no clock source */
- TCCR1A = 0;
- TCCR1B = _BV(WGM12);
+ TCCR1A = 0;
+ TCCR1B = _BV(WGM12);
/* start disabled */
- TCCR1C = 0;
- OCR1A = 0;
- TCNT1 = 0;
- TIFR1 = _BV(OCF1A); /* Reset pending. */
- TIMSK1 = 0;
- TCCR1B = PRESCALER;
+ TCCR1C = 0;
+ OCR1A = 0;
+ TCNT1 = 0;
+ TIFR_REG = _BV(OCF1A); /* Reset pending. */
+ TIMSK_REG = 0;
+ TCCR1B = PRESCALER;
#endif /* OSAL_ST_MODE == OSAL_ST_MODE_FREERUNNING */
diff --git a/os/hal/ports/AVR/hal_st_lld.h b/os/hal/ports/AVR/hal_st_lld.h index 96b0169e3..223a6ed37 100644 --- a/os/hal/ports/AVR/hal_st_lld.h +++ b/os/hal/ports/AVR/hal_st_lld.h @@ -27,6 +27,8 @@ #ifndef _ST_LLD_H_
#define _ST_LLD_H_
+#include <avr/io.h>
+
/*===========================================================================*/
/* Driver constants. */
/*===========================================================================*/
@@ -68,6 +70,14 @@ extern "C" { }
#endif
+#ifdef __AVR_ATmega128__
+#define TIFR_REG TIFR
+#define TIMSK_REG TIMSK
+#else
+#define TIFR_REG TIFR1
+#define TIMSK_REG TIMSK1
+#endif
+
/*===========================================================================*/
/* Driver inline functions. */
/*===========================================================================*/
@@ -98,10 +108,10 @@ static inline void st_lld_start_alarm(systime_t time) { OCR1A = (uint16_t) time;
/* Reset pending. */
- TIFR1 = _BV(OCF1A);
+ TIFR_REG = _BV(OCF1A);
/* enable interrupt */
- TIMSK1 = _BV(OCIE1A);
+ TIMSK_REG = _BV(OCIE1A);
}
/**
@@ -111,7 +121,7 @@ static inline void st_lld_start_alarm(systime_t time) { */
static inline void st_lld_stop_alarm(void) {
- TIMSK1 = 0;
+ TIMSK_REG = 0;
}
/**
@@ -149,7 +159,7 @@ static inline systime_t st_lld_get_alarm(void) { */
static inline bool st_lld_is_alarm_active(void) {
- return (bool) ((TIMSK1 & _BV(OCIE1A)) != 0);
+ return (bool) ((TIMSK_REG & _BV(OCIE1A)) != 0);
}
#endif /* _ST_LLD_H_ */
|