PORTA^=1<<PB2 - это чтение PORTA, модификация значения и запись обратно, а раз так, то, как я уже говорил, в середине может вклиниться прерывание. PORTA.TGL = PORTA.OUT ^ 0x07 & 0x0F; -> PORTA.TGL = 0x02; - это одна атомарная операция, ей ничего помешать не может. Она меняет свои 4 бита не затрагивая остальные.
Продолжая изучение... Вот скажите мне! По какой накурке можно было такое написать в даташите???
Здесь в пункте 2 приведен пример кода дабы перевести таймер TCA0 в режим "Normal mode". Код этот выглядит так: TCA0.SINGLE.CTRLB = TCA_SINGLE_WGMODE_NORMAL_gc; Сук.. как это вообще ассоциируется с регистром CTRLB, названия битов которого приведены там же??? Как, Карл?? Как, читая даташит я должен понять и написать код??
Видя название регистра CTRLB и название его битов WGMODE [0:2], а так же ниже таблицу соответствия состояния этих битов режимам таймера - то я, следуя логике и предыдущим стандартам AVR, должен написать:
CTRLB&=~ (1<<WGMODE0|1<<WGMODE1|1<<WGMODE2); А точнее - вообще ничего не писать в эти биты, ибо для режима "Normal mode" все биты WGMODE должны быть в "0".
Но следуя даташиту я должен написать: TCA0.SINGLE.CTRLB = TCA_SINGLE_WGMODE_NORMAL_gc;
PORTA^=1<<PB2 - это чтение PORTA, модификация значения и запись обратно, а раз так, то, как я уже говорил, в середине может вклиниться прерывание. PORTA.TGL = PORTA.OUT ^ 0x07 & 0x0F; -> PORTA.TGL = 0x02; - это одна атомарная операция, ей ничего помешать не может. Она меняет свои 4 бита не затрагивая остальные.
И для этого нужно убрать регистр DDR? Переименоваить остальные все регистры и наделать кучу масок??
Добавлено after 3 minutes 10 seconds: Сукк.а... пойду застрелюсь в туалете!
Добавлено after 1 hour 5 minutes 7 seconds: Акуеть... а еще нужно сбрасывать ПРОГРАММНО флаг прерывания в обработчике прерываний....
ISR(TCA0_OVF_vect){
PORTA.OUTTGL = PIN0_bm;
TCA0.SINGLE.INTFLAGS = TCA_SINGLE_OVF_bm;
}
То есть вместо:
ISR(TCA0_OVF_vect) {
PORTA^= 1<<PB0;
}
....... Фсё... ну нах. Думал быстренько новый МК попробую, мол это вам не STM-ы всякие и ESP заново учить после AVR... Ан нет! Учи считай новый даташит, методы, векторы, регистры, вызовы... Кончилось время бородатых дядек и ассемблера... Чувствуется веяние современных пиздюков без оглядки на прошлое, совместимость, оптимизацию.... Нынче в тренде тучи мусорного кода на мощном железе чем оптимизированные решения... Arduino-мир победил... Дайте яда!
Режимы таймера аля NORMAL, CTC и т. д. в AVR всегда выставлялись отдельными битами и это никак не связано с названиями регистров и что они как то могут пересекаться. Например режим CTC mode в Attiny85:
TCCR1 = 1<<CTC1;
Что мешало сделать в Attiny212 так же?? Религия? Тем более регистры и биты ведь такие же...
Это не те режимы... Normal и Split влияют как на количество используемых регистров, так и на их поля. Например, в режиме Normal младшие 3 бита CTRLB - это WGMODE, а в режиме Slit там уже 3 отдельных бита LCMP0EN/LCMP1EN/LCMP2EN.
И пока там свистал ветер - решил хоть как то, на этом чудном говнокамне, попробовать накидать простую прошивку на пару ШИМ каналов... И естественно уперся в тактирование!
По сложившейся уже говно-Mscrochip-ской традиции, ПОУМОЛЧАНИЮ, в тактировании основной шины стоит делитель на 6!! Ну да ладно, можно ж выставить фьюзы, какие проблемы подумал я?... Угу... Поправить фьюзы через AVRDude_v8, поправить так и не вышло.. Адекватные технические инструкции так и не нашел... Фьюзы прочитал, в даташите описано одно, а читаетсо - другое!! Ну это, я так понял уже норм для этой конторы...
В итоге решил в юзеровском ПО поправить CLK_CPU PLL... угу...
За прескаллер отвечает регистр MCLKCTRLB ))))) 9 букв, Карл!))) И естественно. как же без маски то! Что бы обратится к нему нужно написать CLKCTRL_MCLKCTRLB ......сукккааа!!
Но и это еще не всё! Чтобы отключить делитель - нужно выставить бит "PEN" в "0" в этом регистре. Есссеественно с помощью говномаски: CLKCTRL_MCLKCTRLB&=~CLKCTRL_PEN_bm;
Иии... И нихрена!
А почему?? Да потому, что говно-Microchip решил придумать систему защиты записи в критически важные (по их мнению) регистры "CCP"! И теперь, что бы убрать делитель частоты (который цуко по умолчанию на 6) нужно еще записать соответствующий ключ, ссцука, в регистр CPP.......
В итоге, что бы отключить делитель чатоты пришлось курить 20 листов даташита и написать вот ЭТО:
По сложившейся уже говно-Mscrochip-ской традиции, ПОУМОЛЧАНИЮ, в тактировании основной шины стоит делитель на 6!!
Ну как бы по дефолту делитель на 8 много где стоит и стоял, ещё до микрочипа..
dds7sdd писал(а):
Поправить фьюзы через AVRDude_v8, поправить так и не вышло.. Адекватные технические инструкции так и не нашел...
Это проблема исключительно AvrDude))
dds7sdd писал(а):
В итоге, что бы отключить делитель чатоты пришлось курить 20 листов даташита
Могу только что-нибудь позабористее предложить.. Например китайского курнуть))
А так.. неочевидная подача информации сплошь и рядом так же как и ошибки в даташитах.. Это уже норма и не стОит эмоций))
Добавлено after 16 minutes 16 seconds: PS: Просто немногим раньше изучать было проще. Ассортимент чипов был меньше, а энтузиастов, размещающих статьи в интернете, больше. Поэтому в ДШ заглядывали не часто. Сейчас уже не те мотивации для энтузиазма))
А никто и не обещал старый AVR. Потому и нет уже давно Atmel-а, что пытался масштабировать старые нравы в новые времена.
Ммм, как бы тебе объяснить? Вот представь если бы с выходом нового стандарта USB 3.0 (например) небыло бы обратной поддержки USB 2.0. И тебе пришлось бы менять все устройства, провода, программы, драйвера и т. д. Представил? Точно такое и происходит с ATmel после поглощения Microchip-ом! То что я годами учил в ходе разработки, накопил наработки в собственных проектах и могу при необходимости быстро набросать прошивку на пару килобайт за час-полтора... Теперь выходит нужно всё забыть нахрен и учить даташиты заново, раздупляться как инициализировать, тактировать, читать, работать с векторами, таймерами и т. д. и т. п. Но даже если и углубляться то из-за таких длинючих и запутанных битовых говномасок в головеи ничего не остается - ты банально не можешь это запомнить... И ты постоянно должен лезть в даташит... но и это не помогает ибо в даташите описаны названия регистров и битов, но напрямую ты к ним обратиться не можешь - только через говномаски битовые, для которы не описаны в даташите, а разбросаны по техническим примерам использования той или иной переферии в виде отдельных технических описаний.... плять как такое гг можно было придумать??
Представил? Точно такое и происходит с ATmel после поглощения Microchip-ом! То что я годами учил в ходе разработки, накопил наработки в собственных проектах и могу при необходимости быстро набросать прошивку на пару килобайт за час-полтора... Теперь выходит нужно всё забыть нахрен и учить даташиты заново
Да именно так. Даташиты правда учить не нужно. Ими нужно просто пользоваться. А так, да, сейчас Микрочип в товарных количествах ограниченно доступен настолько, что все приходится переписывать на ARM в лице Artery. И там все по другому. Другая периферия, другие маски, другие правила работы с ядром. В этом и состоит работа эмбеддера. В отличии от USB, контроллеры не являются стандартными изделиями. И в новых поколениях, прежде всего, изменяется периферия. Если у тебя это вызывает такой баттхерт, значит ты что то делаешь не так.
Та без проблем, можно заниматься херней годами по кругу переписывая переписанное чисто для переписывания... У меня же подгорело не из-за технической сложнасти, а из-за того что сделали через жопу! Какой жаль... Ну значит будем посмотреть в другую сторону.
Либо делаете, либо нет. Выберите путь, по которому идти. Старые типы AVR существуют и производятся. Программы для прогр. кода к ним не перестали работать.
А в остальном по цене ATtiny13A (оригинал, от официальных представителей) получаете в 2 раза больше Flash и SRAM, DAC, 3 + 1 16/12 bit таймера, VREF, 2 аппаратных I2c и т.д. функциях.
Всех что-то возмущает (в сфере МК). Но рано или поздно (или никогда) к этому привыкаешь. Потом при 10-100-1000 ... программах/устройства/теста становится легко. И с улыбкой вспоминаете "простых МК и их окружение".
Та причем тут AVR путь? Есть же здравый смысл! Если у тебя в даташите описан ADC регистр ADCSRA с битами ADEN, ADIF и т. д. то это значит что ты можешь обратиться к нему так как он описан в даташите ADCSRA= 1<<DEN|1<<ADIF;
Здесь же, например, ты видишь в даташите название регистра конфигурации таймера CTRLB и названия его битов WGMODE [0:2]. Но ты не можешь написать CTRLB&=~ (1<<WGMODE0|1<<WGMODE1|1<<WGMODE2); НЕТ! Ты должен написать: TCA0.SINGLE.CTRLB = TCA_SINGLE_WGMODE_NORMAL_gc; И это не описано в даташите! Это нужно нарыть в заголовочном io файле и отдельных примерах по использованию переферии... Именно из-за этого у меня бомбит!
Да, удалил строка о ADC как оффтоп. И код чужой. Попробуйте изучить документацию современного МК. Напр. 1258 страниц . Если им можно пользоваться годами - то да. Но часто на 3-30-100-й день его меняешь. Даташит: вначале, затем: при необходимости.
Последний раз редактировалось veso74 Пн дек 30, 2024 13:21:13, всего редактировалось 1 раз.
Ты должен написать: TCA0.SINGLE.CTRLB = TCA_SINGLE_WGMODE_NORMAL_gc; И это не описано в даташите! Это нужно нарыть в заголовочном io файле и отдельных примерах по использованию переферии... Именно из-за этого у меня бомбит!
Таймер у которого два режима работы с разными наборами регистров - это исключение. В большинстве случаев будет:
Код:
TCA0.CTRLB = TCA_WGMODE_NORMAL_gc;
И чтобы такое написать достаточно знать как регистр и поле называется. Или у тебя IDE даже автодополнение не умеет?
Нужно проще смотреть на эти вопросы. Есть базовое ядро МК - судя по системе команд оно не изменилось. Есть набор аппаратной периферии - эта часть может в любое время "взбрыкнуть" - особо ежли объявлено новое семейство. Тут уж без проработки даташитов и еррат не обойтись. АВРки не 51е, где стандартный минимум ядра прописан (хотя и там "поползновения" на ядро были даже у атмела - да эволюционно отмерли) ... При подходе к МК как к микропроцессора с набором периферии всё на свои места станет - как пример есть сам микропроцессор, схема тактироавния и интерфейс с памятью программ/данных - основное ядро. Оно постоянно (редко в тактирование могут изменения вносить) А есть периферия - таймеры, порты ввода/вывода, контроллеры доступа к внешним запоминающимся устройствам и прочие приятности. Это в МК они по большей части уже внутри, но раньше на каждый такой кристалл своя документация была (и весьма не маленькая). Плюс изменения/модификации там много чаще происходили. Для многих уже те времена равны археологическим раскопкам.
Да, удалил строка о ADC как оффтоп. И код чужой. Попробуйте изучить документацию современного МК. Напр. 1258 страниц . Если им можно пользоваться годами - то да. Но часто на 3-30-100-й день его меняешь. Даташит: вначале, затем: при необходимости.
Так я и не говорю здесь про 32-64 бит МК. Речь идет о мелкой 8 битной блохе за 1 дол., для которой нужно за час написать прошивку, залить и закинуть в какю нить железку и на МК 0-серии так и было. Но вот в новой 1-серии нужно прочитать мануал на 500+ страниц дабы сделать тоже самое. Зачем? Производитель тот же, среда разработки та же, железо и архитектура прежние... Но нет... надо все переделать.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения