Скрытый Timer2 в Леонардо/микро
- Войдите на сайт для отправки комментариев
Пт, 14/10/2016 - 10:45
После того, как наш коллега kisoft как бы мимоходом сказал что в леонардо/микро на чипе mega32u4 есть скрытый таймер2, не упомянутый ни словом в даташите - меня, как любителя таймеров охватил интерес :) Сходу в инете ничего не нашёл, а тут вчера смотрел даташит родственного чипа 32U6, а в нём таймер2 прописан. Взял все его данные с надеждой, а вдруг подойдёт , накатал проверочный код -и опа, всё работает :) Итого в леонардо/микро аж 5 таймеров на любой вкус и разрядность (2x8bit, 1x10bit, 2x16bit)
В данном скетче таймер 2 строчит в два своих аппаратных выхода частотами 8 и 4 МГц.
#define ASSR (*(uint8_t*)0xB6) #define OCR2B (*(uint8_t*)0xB4) #define OCR2A (*(uint8_t*)0xB3) #define TCNT2 (*(uint8_t*)0xB2) #define TCCR2B (*(uint8_t*)0xB1) #define TCCR2A (*(uint8_t*)0xB0) #define TIFR2 (*(uint8_t*)0x37) //#define TIMSK2 (*(uint8_t*)0x70) void setup() { pinMode(2,OUTPUT); //PD1 (OC2B) pinMode(8,OUTPUT); //PB4 (OC2A) TCCR2A=B01110011; TCCR2B=B00001001; OCR2A=1; OCR2B=0; } void loop() { }
Фига-се, шуточки у Atmel'а! Нарвутся когда-нибудь на хороший судебный иск.
И действительно. ох... удивительно, адреса задекларированы как /* Reserved [0x9E..0xB7] */
Надо полагать, делали-делали и чего-то недоделали, или ляп какой сотворили. А в 32ю6 пофиксили и перевели резёрв в эксплуатацию.
Ночь на дворе, завтра полезу пошарю.
А TIMSK2 чего замаркили, не включается? адрес то его тож, /* Reserved [0x70] */
MagicianT, а TIMSK2 оказался продефайненым в самой arduino IDE (1.6.8), видимо случайно забыли убрать:)
Я ещё попутно обнаружил, что некоторые регистры из числа RESERVED (например принадлежащие портам, которых физически нет) вполне рабочие, и их можно использовать как свои переменные :) В СИ конечно не особо актуально, а вот если кодить на ассемблере, то это полезный ресурс..
Надо полагать, делали-делали и чего-то недоделали, или ляп какой сотворили. А в 32ю6 пофиксили и перевели резёрв в эксплуатацию.
Не, дело не в этом. Похожая ситуация с STM объясняется так. У Атмела, скорее всего, тоже самое.
Краткая выдержка: "Для каждой линейки для каждого корпуса МК при производстве используют одну маску, заряженную по максимуму, т.к. не выгодно иметь для каждой серии свою маску". "Так же пояснили по поводу наличия «несуществующей периферии» — так как маска одна, то и периферия должна быть тоже максимальная. В некоторых случаях ее такой и оставляют (она просто не проходит тесты и никто гарантии на ее работоспособность не дает), а в некоторых случаях при производстве пережигают перемычку и отключают ее (например Crypto/hash processor)". "Ну да они так и сказали, что они не первые, многие так делают".
MagicianT, а TIMSK2 оказался продефайненым в самой arduino IDE (1.6.8), видимо случайно забыли убрать:)
Я ещё попутно обнаружил, что некоторые регистры из числа RESERVED (например принадлежащие портам, которых физически нет) вполне рабочие, и их можно использовать как свои переменные :) В СИ конечно не особо актуально, а вот если кодить на ассемблере, то это полезный ресурс..
Хотел почитать дата-шит на энту 32ю6, посмотреть чего там ещё про-апгрейдили. А нету. Атмел официально на своём веб-ресурсе никогда про 32Ю6 и не слыхивал. Не продаётся ни где. Для вояк чтоль чего-то мутили, или дела у них перед тем как микрочипу продаться совсем плохо шли, и не до новых апгрейдов было, остаётся только догадываться.
Фига-се, шуточки у Atmel'а! Нарвутся когда-нибудь на хороший судебный иск.
И в чём они будут виноваты? На незадокументированную периферию производитель гарантии не давал. Всё, что в даташите - можно использовать. И, в случае чего, предъявлять претензии к производителю. А вот незадокументированные возможности используются исключительно на свой страх и риск. Производитель за это ответственности не несёт.
Я этот таймер видел в одной из версий ДШ. Сказал одному товарищу, а он уже это проверил и сказал, что всё пашет. Можно посмотреть информацию здесь. Возможно там еще что нибудь найдется, впрочем кто знает. Дополнительный таймер, дополнительные выходы ШИМ.
И в чём они будут виноваты? На незадокументированную периферию производитель гарантии не давал.
Ни в чём, до тех пор пока не используют такую возможность сами или её не использует кто-то из их партнёров (ну типа официальных партнёров - у каждого производителя такие есть) в любой разработке. А вот как только используют, они попадают под крайне суровый в Америке закон о защите конкуренции, т.к. недокументированные возможности, которые ты используешь сам или твои партнёры, - это способ получить незаконное конкурентное преимущество.
Я не теоретизирую, а знаю это точно, т.к. в своё время выступал экпертом в суде (кажется суд штата Мичиган, но могу ошибиться, почти 20 лет назад дело было) где именно по такому обвинению наехали на Microsoft. Они тогда "забыли" документировать MDI (когда он только появился), а сами активно использовали его в своём MS Office.
MagicianT, атмел с даташитами страшно мутит, по моему не ходовые МК потихоньку пропадают из его каталогов.. Были всякие меги 161,162,163, -тоже куда то пропали. Хорошо что инет всё хранит, иначе вообще не понятно что делать если редкий МК попался. Ещё и ошибки постоянно в даташитах, наколотся можно запросто. Вот в частности вчера заметил в шите от 32U4 регистр OCR44C :)
Этот 4й таймер вообще весь индусский. Режим СТС не документирован никак, но он есть. А вот ещё коммент к тому-же регистру OCR4C чуть ниже: "Note that, if a smaller value than three is written to the Output Compare Register C, the value is automatically replaced by three as it is a minimum value allowed to be written to this register" Пиши в него что хошь, но меньше 3х он никогда не будет. То есть высокие частоты -прощайте. Учитывая что этот таймер может тактироваться от внутреннего PLL 96Мгц это довольно досадная потеря..
kisoft, сходил по ссылке -товарищ Ванямба конечно мощную библу забабахал, всю периферию AVR в неё втянул. Без поллитры как грится не разберёшься, -структура на структуре сидит и структурой погоняет :)
kisoft, сходил по ссылке -товарищ Ванямба конечно мощную библу забабахал, всю периферию AVR в неё втянул. Без поллитры как грится не разберёшься, -структура на структуре сидит и структурой погоняет :)
Это да, я тогда как раз его либы юзал немного, но сразу наткнулся на отсутствие поддержки Леонардо. Написал, он сделал, потом и про таймер разговор зашел. :) В либах если только хидеры смотреть и то они навороченные у него, есть такое.
А в pins_arduino.h для Leonardo всё аккуратно раздефайнено:
А запиливать поддержку в ArduinoIDE как то ломает, придет новая версия и всё сначала ковырять, ну его нафиг :) Хотя, возможно, достаточно pins_arduino.h расковырять.
В общем да восславится гугль-мугль и пророк его -яндекс. Пять минут поиска, и вуаля -даташит mega32u4 с полностью описанным таймером2 :)
Спасибо.
А вот как только используют, они попадают под крайне суровый в Америке закон о защите конкуренции, т.к. недокументированные возможности, которые ты используешь сам или твои партнёры, - это способ получить незаконное конкурентное преимущество.
Спасибо, не знал об этом.
Кажется ошибку у мастера заметил, надо #define TIFR2 (*(uint8_t*)0x17)
Надоумили меня такие дефайны на прямое обращение по адресу, проверил и работает.
А то с этими таймерами вечно проблема, пока настроишь как надо все биты, раз 20 перезаливать приходилось. Теперь на лету можно, формат комманд "ab0" - установить значит на TCCR2A, "r" - прочитать, "w10101010" или "w11" не значащие нули не обязательны - записать. И вперёд с осцилоскопом на ноге, пока не получится желаемый результат-);
Да, и кажется что ISR для этого таймера ардуино не понимает, ставишь TIMSK2 по любому из 3-х - сразу виснет. ISR-ы я добавил, надо ещё посмотреть в ардуино ИДЕ.
MagicianT, в даташите 0x17 (0x37) Где 0x17 -это отремапленный прямой адресс 0x37 . В AVR же два типа адресации памяти, большинство инструкций ассемблера работают с только с регистрами с адресацией до 0x20. А в этой зоне сидят только рабочие регистры R0..R32. Что бы можно было веселее работать и с остальными адресами (вернее только с частью, осчастливили ещё 32 адреса) сделали двойную адресацию. Поэтому в сводной таблице все "прямые" адреса начинаются с 0x20, а все "кривые" с ноля. Но данный тип адресации в дефайнах подразумевает именно прямую, так что должно работать только с 0x37, а с 0x17 данные наползут в один из рабочих регистров Rxx и может глюкануть.
А вот работу с прерываниями этого таймера не тестировал, вполне логично что может быть какой-то баг, из-за которого собссно и "запретили" таймер 2 :-)
А страницу, на которой прописано 0х37 для TIFR2? Я в дата шите для ДУЕ видел -везде все адреса расписаны, а в атмегах ни разу. Тот адрес 0х17 я из iom32u6.h тупо скопировал.
Логично, что адресса резервированы ?
Так при наличии даташита зачем теперь по дебрям ползать? ) По сути: - В дуне в каком-то другом файле делается оффсет +0x20, и всё встаёт на свои места :-)
Брешут они часто в даташитах, я уже сталкивалсяне не раз, когда вместо R/W биты обьявлены как R. Посмотрите к примеру главу 25.9.4 на странице 330. Регистр ADCSRB, бит ADTS3. Даташит любезно предоставленный вами в последнем линке из #11 поста.
Так вот бит там R - read only, а таблица пониже табле 25.6 утверждает что его можно и нужно писать если ацп драйвить от таймера 4.
Компилеровские файлы тоже не баг-фри, но последнее слово за ними. Поэтому, советую всем, потрошите где у вас там avr-gcc инсталирован , и смотрите iomxxxx.h, про 328 атмегу там тоже есть все данные (iom328p.h).
Update:
Полез ещё раз в iom32u4.h и сразу нашёл почему прерывания не срабатывают, этих строк не хватает:
Т.е. в скетче надо верху прилепить также как и для других B0-B6 и иже с ними.
Update-2: прилепил, полный скетч в котором прерывания по оверфлоу, аутпут компере А и Б работают:
Здравствуйте! Я начинающий, почитал этот пост но так и не понял как сделать прерывание по таймеру в Pro micro. Как переделать мой код чтобы по прерыванию выполнялась функция. Или эту библиотеку нельзя будет использовать а работать только с регистрами? Заранее благодарен!
Нашел библиотеку FlexiTimer2. Похожа на MsTimer2 но работает и на Ардуино про микро.