mitya1698 17 4 апреля, 2020 Опубликовано 4 апреля, 2020 · Жалоба Добрый день Не получается на тине 861(в протеусе) включить обычный режим таймера, чтобы ножкой дергал Вроде как все по даташиту нормал режим вывод OC1B должен дергаться , а он в нуле. Что я делаю не так? Таймер сильно навороченный может что-то не понимаю #include <tiny861.h> void main(void) { PORTB=0x00; DDRB=0xff; PLLCSR=0x00; TCCR1A=0x30; TCCR1B=0x07; TCCR1C=0x30; TCCR1D=0x00; TCCR1E=0x00; TC1H=0x00; TCNT1=0x00; TC1H=0x00; OCR1A=0x00; TC1H=0x00; OCR1B=0x00; TC1H=0x00; OCR1C=0x10; TC1H=0x00; OCR1D=0x00; DT1=0x00; while (1) { } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NStorm 0 5 апреля, 2020 Опубликовано 5 апреля, 2020 · Жалоба OCR1B должно быть равно тому, когда вы хотите переключать таймер. Нет смысла писать нули каждый раз, когда регистр и так равен нулю. Не используйте магические числа! Пишите нормально биты, какие вы пишете через сдвиг или _BV. Мало кто будет ваши магические числа считать, какие биты выставляются. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NStorm 0 5 апреля, 2020 Опубликовано 5 апреля, 2020 · Жалоба #include <avr/io.h> int main(void) { DDRB = 0xff; TCCR1A = 1 << COM1B0; OCR1C = 0x20; OCR1B = 0x10; TCCR1B = (1 << CS10) | (1 << CS11) | (1 << CS12); while (1) {} } Как-то так надо. Только в протеусе у меня тоже не заработало. Но всё показывает на то, что это скорее бага протеуса, который не знает, что в этой тиньке Compare Output работает и в Normal Mode. Надо в железе пробовать. OCR1C задает максимальное значение таймера, после которого он сбрасывается в 0 (CTC). А OCR1B уже непосредствено значение, на котором выходной пин будет меняться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mitya1698 17 5 апреля, 2020 Опубликовано 5 апреля, 2020 · Жалоба #include <tiny861.h> void main(void) { DDRB=0xff; TCCR1A=0x10; // COM1B0 = 1 01 Toggle on Compare Match. TCCR1B=0x07; // CK/64 TCCR1C=0x10; // COM1B0S = 1 OCR1B=0x05; OCR1C=0x10; while (1) { } } Я предполагал что на 0 будет переключать. поставил 5 тоже не работает Битов то считай не ставлю - обычный режим же должен заводиться при установке частоты как я понял. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NStorm 0 5 апреля, 2020 Опубликовано 5 апреля, 2020 (изменено) · Жалоба Он заводится. Если в цикл while (1) добавить что-то вроде if (TCNT1 >= 0x10) PORTB ^= 1 << PB0; то пин софтово будет моргать. Также если в TCCR1A выставить бит PWM1B, то выводы по таймеру будут меняться как положено, я в протеусе проверил. Но вот именно в обычном режиме таймера не меняется. Я думаю это бага протеуса всё-таки. В TCCR1C писать не обязательно, это копирующий теневой регистр. Изменено 5 апреля, 2020 пользователем NStorm Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mitya1698 17 5 апреля, 2020 Опубликовано 5 апреля, 2020 · Жалоба не заработало и в железе. Нет частоты на выходе. TCCR1A=0x11; так, добавил бит PWM1B заработало, но мигает и инверсным сигналом. А TCCR1C какую пользу несет , если надо тремя каналами рулить A B и D разом? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NStorm 0 5 апреля, 2020 Опубликовано 5 апреля, 2020 (изменено) · Жалоба 50 минут назад, mitya1698 сказал: А TCCR1C какую пользу несет , если надо тремя каналами рулить A B и D разом? Ну видимо да, в свободные биты добавили теневые биты, чтобы если задействован канал D, то можно было через 1 регистр управлять и A,B тоже. Цитата так, добавил бит PWM1B заработало, но мигает и инверсным сигналом. См. табл. 12-14. Compare Output Mode, Fast PWM Mode. Инверсный выход легко отключить. Вот так работает в протеусе как вам надо: void main(void) { DDRB = 0xff; TCCR1A = (1 << COM1B1) | (1 << PWM1B); OCR1C = 0x60; OCR1B = 0x30; TCCR1B = (1 << CS10) | (1 << CS11) | (1 << CS12); while (1) { } } Тайминги только свои сделайте вместо моих 0x60, 0x30. Цитата не заработало и в железе. Нет частоты на выходе. Забавно. Похоже это недокументированная бага этого МК. Вот в сети нашел тоже самое и решения как такового нет, чел просто тоже в режим ШИМ переключил таймер: https://www.avrfreaks.net/forum/timers-attiny861 PS: Научитесь всё-таки писать с именами битов, а не магические числа. Так гораздо проще и быстрее читать, когда написаны названия битов, а не 0x11 какое-нибудь. Изменено 5 апреля, 2020 пользователем NStorm Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mitya1698 17 5 апреля, 2020 Опубликовано 5 апреля, 2020 · Жалоба спасибо за помощь Видимо не очень "недукоментированная " бага, раз протеус о ней знает Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NStorm 0 5 апреля, 2020 Опубликовано 5 апреля, 2020 (изменено) · Жалоба Ну как бы странно, да. В errata нет ничего, по ДШ должно работать, в сети единственная ссылка о проблеме нашлась. PS: Также обратите внимание на момент, что я TCCR1B меняю в конце. Это не спроста. Настройками предделителя тут запускается таймер. Лучше все настройки делать до запуска. Изменено 5 апреля, 2020 пользователем NStorm Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться