123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337 |
- #ifndef _HAL_AVR_H_
- #define _HAL_AVR_H_
- #include "fastio.h"
- #include <stdint.h>
- #include <Arduino.h>
- #include <util/delay.h>
- #include <avr/eeprom.h>
- #include <avr/pgmspace.h>
- #include <avr/interrupt.h>
- #include <avr/io.h>
- #ifndef CRITICAL_SECTION_START
- #define CRITICAL_SECTION_START unsigned char _sreg = SREG; cli()
- #define CRITICAL_SECTION_END SREG = _sreg
- #endif
- #define ISRS_ENABLED() TEST(SREG, SREG_I)
- #define ENABLE_ISRS() sei()
- #define DISABLE_ISRS() cli()
- typedef uint16_t hal_timer_t;
- #define HAL_TIMER_TYPE_MAX 0xFFFF
- typedef int8_t pin_t;
- #define HAL_SERVO_LIB Servo
- inline void HAL_clear_reset_source(void) { MCUSR = 0; }
- inline uint8_t HAL_get_reset_source(void) { return MCUSR; }
- #define HAL_TIMER_RATE ((F_CPU) / 8) // i.e., 2MHz or 2.5MHz
- #define STEP_TIMER_NUM 1
- #define TEMP_TIMER_NUM 0
- #define PULSE_TIMER_NUM STEP_TIMER_NUM
- #define TEMP_TIMER_FREQUENCY ((F_CPU) / 64.0 / 256.0)
- #define STEPPER_TIMER_RATE HAL_TIMER_RATE
- #define STEPPER_TIMER_PRESCALE 8
- #define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // Cannot be of type double
- #define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer
- #define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
- #define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US
- #define ENABLE_STEPPER_DRIVER_INTERRUPT() SBI(TIMSK1, OCIE1A)
- #define DISABLE_STEPPER_DRIVER_INTERRUPT() CBI(TIMSK1, OCIE1A)
- #define STEPPER_ISR_ENABLED() TEST(TIMSK1, OCIE1A)
- #define ENABLE_TEMPERATURE_INTERRUPT() SBI(TIMSK0, OCIE0B)
- #define DISABLE_TEMPERATURE_INTERRUPT() CBI(TIMSK0, OCIE0B)
- #define TEMPERATURE_ISR_ENABLED() TEST(TIMSK0, OCIE0B)
- FORCE_INLINE void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) {
- UNUSED(frequency);
- switch (timer_num) {
- case STEP_TIMER_NUM:
-
- SET_WGM(1, CTC_OCRnA);
-
- SET_COMA(1, NORMAL);
-
-
-
-
-
- SET_CS(1, PRESCALER_8);
-
-
- OCR1A = 0x4000;
- TCNT1 = 0;
- break;
- case TEMP_TIMER_NUM:
-
-
- OCR0B = 128;
- break;
- }
- }
- #define TIMER_OCR_1 OCR1A
- #define TIMER_COUNTER_1 TCNT1
- #define TIMER_OCR_0 OCR0A
- #define TIMER_COUNTER_0 TCNT0
- #define _CAT(a, ...) a ## __VA_ARGS__
- #define HAL_timer_set_compare(timer, compare) (_CAT(TIMER_OCR_, timer) = compare)
- #define HAL_timer_get_compare(timer) _CAT(TIMER_OCR_, timer)
- #define HAL_timer_get_count(timer) _CAT(TIMER_COUNTER_, timer)
- #define HAL_timer_isr_prologue(TIMER_NUM)
- #define HAL_timer_isr_epilogue(TIMER_NUM)
- #define HAL_STEP_TIMER_ISR \
- extern "C" void TIMER1_COMPA_vect (void) __attribute__ ((signal, naked, used, externally_visible)); \
- extern "C" void TIMER1_COMPA_vect_bottom (void) asm ("TIMER1_COMPA_vect_bottom") __attribute__ ((used, externally_visible, noinline)); \
- void TIMER1_COMPA_vect (void) { \
- __asm__ __volatile__ ( \
- A("push r16") \
- A("in r16, __SREG__") \
- A("push r16") \
- A("lds r16, %[timsk0]") \
- A("push r16") \
- A("andi r16,~%[msk0]") \
- A("sts %[timsk0], r16") \
- A("lds r16, %[timsk1]") \
- A("andi r16,~%[msk1]") \
- A("sts %[timsk1], r16") \
- A("push r16") \
- A("in r16, 0x3B") \
- A("push r16") \
- A("in r16, 0x3C") \
- A("push r0") \
- A("push r1") \
- A("push r18") \
- A("push r19") \
- A("push r20") \
- A("push r21") \
- A("push r22") \
- A("push r23") \
- A("push r24") \
- A("push r25") \
- A("push r26") \
- A("push r27") \
- A("push r30") \
- A("push r31") \
- A("clr r1") \
- A("call TIMER1_COMPA_vect_bottom") \
- A("pop r31") \
- A("pop r30") \
- A("pop r27") \
- A("pop r26") \
- A("pop r25") \
- A("pop r24") \
- A("pop r23") \
- A("pop r22") \
- A("pop r21") \
- A("pop r20") \
- A("pop r19") \
- A("pop r18") \
- A("pop r1") \
- A("pop r0") \
- A("out 0x3C, r16") \
- A("pop r16") \
- A("out 0x3B, r16") \
- A("pop r16") \
- A("ori r16,%[msk1]") \
- A("cli") \
- A("sts %[timsk1], r16") \
- A("pop r16") \
- A("sts %[timsk0], r16") \
- A("pop r16") \
- A("out __SREG__, r16") \
- A("pop r16") \
- A("reti") \
- : \
- : [timsk0] "i" ((uint16_t)&TIMSK0), \
- [timsk1] "i" ((uint16_t)&TIMSK1), \
- [msk0] "M" ((uint8_t)(1<<OCIE0B)),\
- [msk1] "M" ((uint8_t)(1<<OCIE1A)) \
- : \
- ); \
- } \
- void TIMER1_COMPA_vect_bottom(void)
- #define HAL_TEMP_TIMER_ISR \
- extern "C" void TIMER0_COMPB_vect (void) __attribute__ ((signal, naked, used, externally_visible)); \
- extern "C" void TIMER0_COMPB_vect_bottom(void) asm ("TIMER0_COMPB_vect_bottom") __attribute__ ((used, externally_visible, noinline)); \
- void TIMER0_COMPB_vect (void) { \
- __asm__ __volatile__ ( \
- A("push r16") \
- A("in r16, __SREG__") \
- A("push r16") \
- A("lds r16, %[timsk0]") \
- A("andi r16,~%[msk0]") \
- A("sts %[timsk0], r16") \
- A("sei") \
- A("push r16") \
- A("in r16, 0x3B") \
- A("push r16") \
- A("in r16, 0x3C") \
- A("push r0") \
- A("push r1") \
- A("push r18") \
- A("push r19") \
- A("push r20") \
- A("push r21") \
- A("push r22") \
- A("push r23") \
- A("push r24") \
- A("push r25") \
- A("push r26") \
- A("push r27") \
- A("push r30") \
- A("push r31") \
- A("clr r1") \
- A("call TIMER0_COMPB_vect_bottom") \
- A("pop r31") \
- A("pop r30") \
- A("pop r27") \
- A("pop r26") \
- A("pop r25") \
- A("pop r24") \
- A("pop r23") \
- A("pop r22") \
- A("pop r21") \
- A("pop r20") \
- A("pop r19") \
- A("pop r18") \
- A("pop r1") \
- A("pop r0") \
- A("out 0x3C, r16") \
- A("pop r16") \
- A("out 0x3B, r16") \
- A("pop r16") \
- A("ori r16,%[msk0]") \
- A("cli") \
- A("sts %[timsk0], r16") \
- A("pop r16") \
- A("out __SREG__, r16") \
- A("pop r16") \
- A("reti") \
- : \
- : [timsk0] "i"((uint16_t)&TIMSK0), \
- [msk0] "M" ((uint8_t)(1<<OCIE0B)) \
- : \
- ); \
- } \
- void TIMER0_COMPB_vect_bottom(void)
- #ifdef DIDR2
- #define HAL_ANALOG_SELECT(pin) do{ if (pin < 8) SBI(DIDR0, pin); else SBI(DIDR2, pin & 0x07); }while(0)
- #else
- #define HAL_ANALOG_SELECT(pin) do{ SBI(DIDR0, pin); }while(0)
- #endif
- inline void HAL_adc_init(void) {
- ADCSRA = _BV(ADEN) | _BV(ADSC) | _BV(ADIF) | 0x07;
- DIDR0 = 0;
- #ifdef DIDR2
- DIDR2 = 0;
- #endif
- }
- #define SET_ADMUX_ADCSRA(pin) ADMUX = _BV(REFS0) | (pin & 0x07); SBI(ADCSRA, ADSC)
- #ifdef MUX5
- #define HAL_START_ADC(pin) if (pin > 7) ADCSRB = _BV(MUX5); else ADCSRB = 0; SET_ADMUX_ADCSRA(pin)
- #else
- #define HAL_START_ADC(pin) ADCSRB = 0; SET_ADMUX_ADCSRA(pin)
- #endif
- #define HAL_READ_ADC() ADC
- #define HAL_ADC_READY() !TEST(ADCSRA, ADSC)
- #define GET_PIN_MAP_PIN(index) index
- #define GET_PIN_MAP_INDEX(pin) pin
- #define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval)
- #define HAL_SENSITIVE_PINS 0, 1
- #endif // _HAL_AVR_H_
|