Перейти к содержанию
    

aTTINY861 таймер 1 проблема с выходом

Добрый день

Не получается на тине 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)
      {
      }
}
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

OCR1B  должно быть равно тому, когда вы хотите переключать таймер.

Нет смысла писать нули каждый раз, когда регистр и так равен нулю. Не используйте магические числа! Пишите нормально биты, какие вы пишете через сдвиг или _BV. Мало кто будет ваши магические числа считать, какие биты выставляются.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

#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 уже непосредствено значение, на котором выходной пин будет меняться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты


#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 тоже не работает 

Битов то считай не ставлю - обычный режим же должен заводиться при установке частоты как я понял.

 

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Он заводится. Если в цикл while (1) добавить что-то вроде if (TCNT1 >= 0x10) PORTB  ^= 1 << PB0; то пин софтово будет моргать. Также если в TCCR1A выставить бит PWM1B, то выводы по таймеру будут меняться как положено, я в протеусе проверил. Но вот именно в обычном режиме таймера не меняется. Я думаю это бага протеуса всё-таки.

В TCCR1C писать не обязательно, это копирующий теневой регистр.

Изменено пользователем NStorm

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

не заработало и в железе. Нет частоты на выходе.

TCCR1A=0x11;
так, добавил бит PWM1B заработало, но мигает и инверсным сигналом.

А TCCR1C какую пользу несет , если надо тремя каналами рулить A B и D разом?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 какое-нибудь.

Изменено пользователем NStorm

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

спасибо за помощь

Видимо не очень "недукоментированная " бага, раз протеус о ней знает

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну как бы странно, да. В errata нет ничего, по ДШ должно работать, в сети единственная ссылка о проблеме нашлась.

PS: Также обратите внимание на момент, что я TCCR1B меняю в конце. Это не спроста. Настройками предделителя тут запускается таймер. Лучше все настройки делать до запуска.

Изменено пользователем NStorm

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...