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+ страниц дабы сделать тоже самое. Зачем? Производитель тот же, среда разработки та же, железо и архитектура прежние... Но нет... надо все переделать.
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения