Вопрос: как обращаться напрямую к регистрам микроконтроллеров 1-й серии Attiny (в моем случае Attiny212)? В даташите указаны привычные названия регистров и названия их битов. Но я не могу по этим названиям к ним обратиться. Вместо этого используются нелепые конструкции с битовыми масками и какими то Microchip-кими загонами.
Среда разработки:
IDE - VSCode and PlatformIO.
Win-AVR-GCC
Язык: C
Даташит.
Техническое описание по работе с таймером TCA.
Например:
Для конфигурации таймера TCA0 в режим прерывания по переполнению, в заголовочном файле iotn212.h, прописаны битовые маски совершенно упорантского вида аля STM-кие.
То есть я должен написать: TCA0.SINGLE.INTCTRL= TCA_SINGLE_OVF_bm;
Для сравнения такой же код для ATiny13 счетчика: TIMSK0=1<<TOIE0;
То есть как написано в даташите так и пишем и это удобно. Всегда можно открыть даташит и вспомнить.
В случае же с Attiny212 в даташите так же указаны такие же регистры, но без битовых масок я не могу обратиться к ним на прямую.
Вот например регистр конфигурации прерываний INTCTRL
Его маска выглядит так:
Логично, для конфигурации таймера по переполнению я должен написать: INTCTRL= 1<<OVF;
Но в место этого: TCA0.SINGLE.INTCTRL= TCA_SINGLE_OVF_bm;
Причем в бинарном варианте можно написать: TCA0.SINGLE.INTCTRL=0b00000001;
Но по названию регистра INTCTRL=0b00000001; нельзя....
Возможно проблема в фреймворке Arduino под которым работает PlatformIO с этим контроллером, но пишу то я на C со стандартными функциями Win-AVR-GCC...
Пример кода:
Код: Выделить всё
#include <avr\io.h>
#include <stdio.h>
#include <avr\interrupt.h>
int main (void) {
PORTA.DIR=PIN1_bm|PIN2_bm|PIN3_bm;//пины сконфигурированы как "выход"
PORTA.DIR&=~PIN7_bm|~PIN6_bm;//пины сконфигурированы как "вход"
PORTA.OUT&=~PIN1_bm|~PIN2_bm|~PIN3_bm;//подтяжка к GND
PORTA.OUT=PIN0_bm|PIN6_bm|PIN7_bm;//подтяжка к VCC
TCA0.SINGLE.INTCTRL= TCA_SINGLE_OVF_bm;//прерывания по переполнению таймера TCA0
INTCTRL= 1<<OVF; // НЕ РАБОТАЕТ
INTCTRL= 0b00000001; // НЕ РАБОТАЕТ
TCA0.SINGLE.INTCTRL=0b00000001;// РАБОТАЕТ
sei();
while (1) {
if (~PORTA.IN & PIN7_bm) {PORTA.OUTSET=PIN2_bm;} else {PORTA.OUTCLR=PIN2_bm;}
}
}


