Arduino UNO и Timer0
- Войдите на сайт для отправки комментариев
Втр, 24/01/2017 - 15:06
IDE Arduino 1.6.13
Плата UNO (Atmega328)
Пишу простенький пример, а работать он нежелает.
void setup() { TCCR0A = (1<<COM0A0)|(1<<WGM01); TCCR0B = (0<<CS02)|(0<<CS01)|(1<<CS00); OCR0A = 63; DDRD |= (1<<PD6); } void loop() { while(1) }
По идее на выводе PD6 (OC0A) должен быть меандр 125 КГц но его нет.
Помогите кто знает, пролейте немного света.
Откуда ж ему взяться, если Ваш пример даже не компилируется?
Откуда ж ему взяться, если Ваш пример даже не компилируется?
Поторопился и у while(1) не поставил ;
Сконфигурите таймер полностью. Все регистры. Например, там IDE при инициализации прерывание по переполнению ему разрешает и много чего ещё делает. Сконфигурите всё, не оставляя ничего на "по умолчанию" при этом на время конфигурации запретите прерывания.
Также. не думаю, что это важно, но я бы перенёс конфигурацию пина в самый верх.
Timer0 же используется для millis(), IDE конфигурирует его по-своему.
Так IDE все таймеры конфигурирует. Этот для millis, остальные для analogWrite. Если ТС его полностью под себя переконфигурирует, то должно всё у него работать.
Не используйте в ардуинах таймер 0, проблемы будут с большинством примеров измерения временных интервалов. Для своих целей, лучше юзать таймер 1 и то с оговорками.
я для себя набросал класс простенького списка таймеров, так как таймер зачастую нужен не один. В мой класс можно добавлять до 16 таймеров с разными временными интервалами (от 1 миллисекунды до 24-х суток). Запускать их выборочно, останавливать, удалять. Срабатывают асинхронно, т.е не зависят ни друг от друга, ни от программы (если прерывания разрешены). При срабатывании вызывают фунцию, заданную в качестве параметра функции добавления. Все скопом висят на Timer1. Мешают ШИМу на каких-то там выводах, не помню. Для Меги2560 можно на Timer3 перевесить, вообще никому мешать не будут.
Если вдруг кому понадобится, могу выложить.
P.S Удобно делать функцию мигания курсором на ЖК мониторах (раз в полсекунды). Или опрашивать разные датчики с разными интервалами.
Не используйте в ардуинах таймер 0, проблемы будут с большинством примеров измерения временных интервалов. Для своих целей, лучше юзать таймер 1 и то с оговорками.
Нужен именно таймер0, примеры сторонние не использую. Пишу свой проект под свои нужды.
Так и не получилось заставить его работать как надо.
Для примера взял и в протеусе собрал схема на меге328, откомпилил прошивку, работает.
Заливаю эту-же прошивку в ардуину уно (таже мега 328) неработает.
По статьям в нете народ пишет что милес вроде как мешать не должен.
На всякий случай проверил, поставил CodeBlocks и написал код в нем, но на чистом си без наворотов ардуиновских.
На меге робит на ардуине нет, хотя все остальное вроде работает (моргает, читает, связь по сом).
Незнаю куда еще копать.
но на чистом си без наворотов ардуиновских.
ну, всё - капец. Онкель своего внука на форум притащил.
Незнаю куда еще копать.
Остается только RTFM и копать в сторону ассемблера.
Странно. Вы пробовали полностью конфигурировать таймер (все регистры) как я советовал? Если пробовали, давайте скетч сюда. Я тогда сегодня запущу его у себя, посмотрю. Правда у меня нет uno, есть только nano на 328 контроллере.
SoftIce, ваш пример в шапке топика абсолютно рабочий. И в реальной меге328 не работать не может. Вариант1 -вы протупили и что-то неправильно подключили или неправильно измерили. Вариант2 -вы спалили 6 пин.