Arduino UNO и Timer0

SoftIce
Offline
Зарегистрирован: 24.01.2017

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 КГц но его нет.

Помогите кто знает, пролейте немного света.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Откуда ж ему взяться, если Ваш пример даже не компилируется?

SoftIce
Offline
Зарегистрирован: 24.01.2017

ЕвгенийП пишет:

Откуда ж ему взяться, если Ваш пример даже не компилируется?

Поторопился и у while(1) не поставил ;

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Сконфигурите таймер полностью. Все регистры. Например, там IDE при инициализации прерывание по переполнению ему разрешает и много чего ещё делает. Сконфигурите всё, не оставляя ничего на "по умолчанию" при этом на время конфигурации запретите прерывания.

Также. не думаю, что это важно, но я бы перенёс конфигурацию пина в самый верх.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Timer0 же используется для millis(), IDE конфигурирует его по-своему.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Так IDE все таймеры конфигурирует. Этот для millis, остальные для analogWrite. Если ТС его полностью под себя переконфигурирует, то должно всё у него работать.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Не используйте в ардуинах таймер 0, проблемы будут с большинством примеров измерения временных интервалов.  Для своих целей, лучше юзать таймер 1 и то с оговорками. 

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

я для себя набросал класс простенького списка таймеров, так как таймер зачастую нужен не один.  В мой класс можно добавлять до 16 таймеров с разными временными интервалами (от 1 миллисекунды до 24-х суток). Запускать их выборочно, останавливать, удалять.  Срабатывают асинхронно, т.е не зависят ни друг от друга, ни от программы (если прерывания разрешены).  При срабатывании вызывают фунцию, заданную в качестве параметра функции добавления.  Все скопом висят на Timer1. Мешают ШИМу на каких-то там выводах, не помню.  Для Меги2560 можно на Timer3 перевесить, вообще никому мешать не будут.  

Если вдруг кому понадобится, могу выложить.  

P.S  Удобно делать функцию мигания курсором на ЖК мониторах (раз в полсекунды).  Или опрашивать разные датчики с разными интервалами. 

SoftIce
Offline
Зарегистрирован: 24.01.2017

DetSimen пишет:

Не используйте в ардуинах таймер 0, проблемы будут с большинством примеров измерения временных интервалов.  Для своих целей, лучше юзать таймер 1 и то с оговорками. 

Нужен именно таймер0, примеры сторонние не использую. Пишу свой проект под свои нужды.

Так и не получилось заставить его работать как надо.

Для примера взял и в протеусе собрал схема на меге328, откомпилил прошивку, работает.

Заливаю эту-же прошивку в ардуину уно (таже мега 328) неработает.

По статьям в нете народ пишет что милес вроде как мешать не должен.

На всякий случай проверил, поставил CodeBlocks и написал код в нем, но на чистом си без наворотов ардуиновских.

На меге робит на ардуине нет, хотя все остальное вроде работает (моргает, читает, связь по сом).

Незнаю куда еще копать.

Клапауций 823
Клапауций 823 аватар
Offline
Зарегистрирован: 13.01.2017

SoftIce пишет:

но на чистом си без наворотов ардуиновских.

ну, всё - капец. Онкель своего внука на форум притащил.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

SoftIce пишет:

Незнаю куда еще копать.

Остается только RTFM и копать в сторону ассемблера. 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Странно. Вы пробовали полностью конфигурировать таймер (все регистры) как я советовал? Если пробовали, давайте скетч сюда. Я тогда сегодня запущу его у себя, посмотрю. Правда у меня нет uno, есть только nano на 328 контроллере.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

SoftIce, ваш пример в шапке топика абсолютно рабочий. И в реальной меге328 не работать не может.  Вариант1  -вы протупили и что-то неправильно подключили или неправильно измерили.   Вариант2 -вы спалили 6 пин.