| Форум РадиоКот https://radiokot.ru/forum/ |
|
| Attiny 1-й серии как работать с регистрами напрямую? https://radiokot.ru/forum/viewtopic.php?f=57&t=196134 |
Страница 1 из 3 |
| Автор: | dds7sdd [ Ср дек 25, 2024 19:23:22 ] |
| Заголовок сообщения: | Attiny 1-й серии как работать с регистрами напрямую? |
Хоспода! Вопрос: как обращаться напрямую к регистрам микроконтроллеров 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;} } } |
|
| Автор: | BOB51 [ Ср дек 25, 2024 20:19:27 ] |
| Заголовок сообщения: | Re: Attiny 1-й серии как работать с регистрами напрямую? |
Для тех МК в ардуино IDE отдельная "платформа" (из категории "внесены")... Причем весьма навороченная (обычно там и отличия от стандартных в комплекте загружаются). Была б ардуино IDE - дал бы ссылку на установку... Как в VSCode and PlatformIO устанавливается - сего не ведаю...
|
|
| Автор: | dds7sdd [ Ср дек 25, 2024 20:36:20 ] |
| Заголовок сообщения: | Re: Attiny 1-й серии как работать с регистрами напрямую? |
Да Arduino тут не причем, полагаю это Microchip решили понятный AVR переделать под свои PIC говноконструкции... |
|
| Автор: | Adrift [ Ср дек 25, 2024 20:43:50 ] |
| Заголовок сообщения: | Re: Attiny 1-й серии как работать с регистрами напрямую? |
Для конфигурации таймера TCA0 в режим прерывания по переполнению, в заголовочном файле iotn212.h, прописаны битовые маски совершенно упорантского вида аля STM-кие. То есть я должен написать: TCA0.SINGLE.INTCTRL= TCA_SINGLE_OVF_bm; Все познается в сравнении... На Pico, например, определения могут быть такими, потому что отличии от STM32 они даже не сдвинуты ) Код: CLOCKS_CLK_SYS_CTRL_AUXSRC_VALUE_CLKSRC_PLL_USB << CLOCKS_CLK_SYS_CTRL_AUXSRC_LSB И это без маски еще... Код: PORTA.OUT&=~PIN1_bm|~PIN2_bm|~PIN3_bm;//подтяжка к GND Тут справа всегда 0xFF будет. |
|
| Автор: | dds7sdd [ Ср дек 25, 2024 20:53:45 ] |
| Заголовок сообщения: | Re: Attiny 1-й серии как работать с регистрами напрямую? |
Ну и нафига так делать и усложнять?? В AVR 0-siries было все понятно и просто. Да и здесь в даташите названия регистров в прежнем формате, только вот не могу понять как к ним обращаться без говномасок микрочиповских... Добавлено after 4 minutes 22 seconds: Тут справа всегда 0xFF будет. Да это я уже намутил)) Пытался сократить эти говноконструкции... Писать надо типа так: Код: PORTA.DIR=PORTA.DIR& ~PIN1_bm|PORTA.DIR& ~PIN2_bm|PORTA.DIR& ~PIN3_bm; это просто забей.... |
|
| Автор: | Adrift [ Ср дек 25, 2024 20:57:29 ] |
| Заголовок сообщения: | Re: Attiny 1-й серии как работать с регистрами напрямую? |
Да это я уже намутил)) Пытался сократить эти говноконструкции... Писать надо типа так: Код: PORTA.OUT=PORTA.OUT& ~PIN1_bm|PORTA.OUT& ~PIN2_bm|PORTA.OUT& ~PIN3_bm; Писать нужно: Код: PORTA.OUT &= ~(PIN1_bm | PIN2_bm | PIN3_bm);
|
|
| Автор: | BOB51 [ Ср дек 25, 2024 20:59:05 ] |
| Заголовок сообщения: | Re: Attiny 1-й серии как работать с регистрами напрямую? |
Обычно раньше в документации все выкладывалось. Но после "перехода в микрощип" соответственно и подход к документации изменился "в стиле микрощипа" - т.е. помимо даташита на конкретную микросхему есть еще несколько документов на всю группу и на прошивку... Честно - не лез пока в те "дебри" с новинками настолько глубоко - пока и "стандартных" вполне хватает. А с учетом "ссакций" еще неизвестно, чего дальше удобным и доступным будет...
|
|
| Автор: | Adrift [ Ср дек 25, 2024 21:07:32 ] |
| Заголовок сообщения: | Re: Attiny 1-й серии как работать с регистрами напрямую? |
Чем сложнее мк, тем больше регистров и полей, тем больше вероятность пересечения названий, потому ничего удивительного в добавлении названия регистра не вижу, так и должно быть. А SINGLE добавляется потому что у таймера есть режимы Normal и Split. |
|
| Автор: | dds7sdd [ Ср дек 25, 2024 21:12:12 ] |
| Заголовок сообщения: | Re: Attiny 1-й серии как работать с регистрами напрямую? |
Писать нужно: Код: PORTA.OUT &= ~(PIN1_bm | PIN2_bm | PIN3_bm); Ну так в датшите написано: PORTn.DIR = PORTn.DIR & ~PINx_bm; А чем будет отличаться вариант побитового НЕ для каждого бита от НЕ для группы битов в скобках?? BOB51
|
|
| Автор: | Adrift [ Ср дек 25, 2024 21:16:10 ] |
| Заголовок сообщения: | Re: Attiny 1-й серии как работать с регистрами напрямую? |
А чем будет отличаться вариант побитового НЕ для каждого бита от НЕ для группы битов в скобках?? ~1 | ~2 = 0xFE | 0xFD = 0xFF ~(1 | 2) = ~3 = 0xFC |
|
| Автор: | dds7sdd [ Ср дек 25, 2024 21:32:30 ] |
| Заголовок сообщения: | Re: Attiny 1-й серии как работать с регистрами напрямую? |
Чем сложнее мк, тем больше регистров и полей, тем больше вероятность пересечения названий, потому ничего удивительного в добавлении названия регистра не вижу, так и должно быть. А SINGLE добавляется потому что у таймера есть режимы Normal и Split. Чем 8 бит МК Attiny212 сложнее 8 бит Attiny85?? Более того, у них и формат регистров в даташите одинаков! Но нет же, Микрочипу нужно выипнуться и сделать совершенно противоположный подход с масками и усложнить максимально переход от классических AVR... Зачем? Да те же IO чего стоят... В классическом AVR: DDRA=1<<PB1; PORTA=1<<PB1; И всё! Порт настроен как выход с подтяжкой к VCC... Что мы видим на аналогичном МК 8-бит новой генерации?? Вот: PORTA.DIR=PIN1_bm; PORTA.OUT=PIN1_bm; PORTA.PIN1CTRL = PORT_PULLUPEN_bm; И там еще всякие: PORTA.SET PORTA.CLR и тд. и т.п.... Вопрос: нахиба? Если все решается так же просто побитово как и в аттини 85.... Добавлено after 7 minutes 20 seconds: Чем сложнее мк, тем больше регистров и полей, тем больше вероятность пересечения названий, потому ничего удивительного в добавлении названия регистра не вижу, так и должно быть. А SINGLE добавляется потому что у таймера есть режимы Normal и Split. Режимы таймера аля NORMAL, CTC и т. д. в AVR всегда выставлялись отдельными битами и это никак не связано с названиями регистров и что они как то могут пересекаться. Например режим CTC mode в Attiny85: TCCR1 = 1<<CTC1; Что мешало сделать в Attiny212 так же?? Религия? Тем более регистры и биты ведь такие же... ![]() Добавлено after 3 minutes 51 second: Это мне напоминает версии Windows, где задачей разработчиков есть сделать так, что бы интерфейс взаимодействия с пользователем был максимально противоположен тому что был в предыдущей версии... |
|
| Автор: | Adrift [ Ср дек 25, 2024 21:38:35 ] |
| Заголовок сообщения: | Re: Attiny 1-й серии как работать с регистрами напрямую? |
И там еще всякие: PORTA.SET PORTA.CLR и тд. и т.п.... Вопрос: нахиба? Если все решается так же просто побитово как и в аттини 85.... На tiny85 если хочешь просто помигать светодиодом в главном цикле, то нужно или на время записи в порт выключать прерывания или гарантировать отсутствие записи в другие биты этого порта из прерывания, а эти регистры SET/CLR/TOGGLE позволяют такое делать не выключая прерывания. Их аналоги есть в большинстве современных мк, на STM32 для этого используют регистр BSRR. Фактически PORTA.OUT только на стадии инициализации стоит использовать, во время работы писать при помощи него в порт стоит только если записать нужно все 8 бит. |
|
| Автор: | dds7sdd [ Ср дек 25, 2024 21:46:22 ] |
| Заголовок сообщения: | Re: Attiny 1-й серии как работать с регистрами напрямую? |
Честно - не лез пока в те "дебри" с новинками настолько глубоко - пока и "стандартных" вполне хватает. Я еще повелся на новый протокол прошивки без программатора по одному кабелю UPDI, аппаратные SPI, I2C, UART на борту, 16 битный таймер с возможностью разбивки на два 8-битных, RTC, IRDA да и много фич по работе с питанием... И стоит это всё те же 1$ как и Attiny13, но разница на лицо! |
|
| Автор: | BOB51 [ Ср дек 25, 2024 21:48:07 ] |
| Заголовок сообщения: | Re: Attiny 1-й серии как работать с регистрами напрямую? |
Adrift Никогда не встречал, чтоб прерывания не позволяли выполнять запись данных в порт вывода... Ежли только не изворачиваться с прерыванием и работой с одним и тем же битом порта (теоретически). Может имелся ввиду какой иной изврат?
|
|
| Автор: | dds7sdd [ Ср дек 25, 2024 21:55:32 ] |
| Заголовок сообщения: | Re: Attiny 1-й серии как работать с регистрами напрямую? |
регистры SET/CLR/TOGGLE позволяют такое делать не выключая прерывания. Их аналоги есть в большинстве современных мк, на STM32 для этого используют регистр BSRR. Типа двойная буфферизация? Ну я еще не дочитал даташит... подгорело в самом начале... Добавлено after 3 minutes 16 seconds: То что я прочитал про SET/CLR/TGL - это биты на запись только, а вот в сравнении с OUT - запись\чтение. Вроде это и вся разница |
|
| Автор: | veso74 [ Ср дек 25, 2024 21:59:22 ] |
| Заголовок сообщения: | Re: Attiny 1-й серии как работать с регистрами напрямую? |
Есть всевозможные варианты. Написать свой драйвер? Но почему? Привыкайте к этому. На второй месяц все будет нормальным. Сужу само собой за STM32. Напр. о GPIOC->BRR = BSRR_VAL; было странно, запутанно, и отвратительно. Но к очень быстро привыкаешь. Теперь стало более предпочтительным. (частично использоваю переводчика) |
|
| Автор: | dds7sdd [ Ср дек 25, 2024 22:02:30 ] |
| Заголовок сообщения: | Re: Attiny 1-й серии как работать с регистрами напрямую? |
Угу, привыкаешь, а потом нужно вернуться к старым проектам и оху..ваешь... Да уже и думал написать на макросах привычные названия, но память ... как всегда в этой серии очень мало памяти. Мне пока отвратительно это: if (~PORTA.IN & PIN7_bm) {PORTA.OUTSET=PIN2_bm;} else {PORTA.OUTCLR=PIN2_bm;} А привык я к: if ((PINA&(1<<PB7)==1) {PORTA|=1<<PB2;} else {PORTA&=~(1<<PB2);} |
|
| Автор: | BOB51 [ Ср дек 25, 2024 22:06:45 ] |
| Заголовок сообщения: | Re: Attiny 1-й серии как работать с регистрами напрямую? |
Расширенное управление добавляется для дополнительных удобств. Но основ не меняет - так что возврат к старым проектам только добавляет возможных вариантов для решения задачи. |
|
| Автор: | Adrift [ Ср дек 25, 2024 22:19:28 ] |
| Заголовок сообщения: | Re: Attiny 1-й серии как работать с регистрами напрямую? |
Никогда не встречал, чтоб прерывания не позволяли выполнять запись данных в порт вывода... Ежли только не изворачиваться с прерыванием и работой с одним и тем же битом порта (теоретически). Допустим в PORTA у нас 0x35 и мы хотим в основном цикле записать новое значение в младшие 4 бита порта, например, 7. Не важно 1 бит или 4, придется сначала прочитать значение из PORTA, очистить 4 младших бита, наложить новое значение и записать обратно: 0x35 & 0xF0 | 0x07 = 0x37 Однако после чтения из порта, но до записи нового значения обратно, вызывается прерывание которое меняет 4 старших бита PORTA на 0xF: 0x35 & 0x0F | 0xF0 = 0xF5 Вернувшись из прерывания прерванная операция завершается записью в порт 0x37, а должно быть 0xF7. Теперь то же самое с PORTA.TGL: Код: PORTA.TGL = PORTA.OUT ^ 0x07 & 0x0F; Это работает поскольку при записи Toggle фактически выполняет функцию XOR, то есть получается следующее: PORTA.OUT ^ (PORTA.OUT ^ 0x07 & 0x0F) = PORTA.OUT ^ 0x02 = 0x37 При этом для старших 4 бит выполняется "value XOR 0" и значение не меняется, какое бы оно в тот момент ни было. |
|
| Автор: | dds7sdd [ Ср дек 25, 2024 22:28:23 ] |
| Заголовок сообщения: | Re: Attiny 1-й серии как работать с регистрами напрямую? |
Ну Ок, почему тогда не записать по старинке: PORTA^=1<<PB2; И чем это будет отличаться от PORTA_DIRTGL=PIN2_bm; Новыми названиями и масками?? |
|
| Страница 1 из 3 | Часовой пояс: UTC + 3 часа |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|


