Например TDA7294

Форум РадиоКот • Просмотр темы - Таймер ATtiny13A каждый такт на частоте 9.6 МГц
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Ср июн 25, 2025 20:15:40

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Таймер ATtiny13A каждый такт на частоте 9.6 МГц
СообщениеДобавлено: Пн июн 05, 2023 11:36:03 
Родился

Зарегистрирован: Пн июн 05, 2023 10:21:32
Сообщений: 3
Рейтинг сообщения: 0
Всем доброго времени суток!

Есть микроконтроллер ATtiny13A PU. Знаю, что по умолчанию он работает на частоте 1.2 МГц. Поэтому поменял бит CKDIV8 (4 бит) в младшем фьюз-байте на 1. Через avrdude и программатор usbasp прошил. Сейчас такие биты:

Low Fuse: 0b01111010
High Fuse: 0b11111111

Далее, пишу код на MPLAB X IDE. На всякий случай объявил:

Код:
#define F_CPU 9600000UL

Главная функция:

Код:
int main(void)
{
   cli();
   
   DDRB|=_BV(PB0);
   outputHigh();
   
   TCNT0=0;
   TCCR0A=0x02;
   TCCR0B=0x01;
   OCR0A=0x01;
   TIMSK0|=1<<OCIE0A;
   
   sei();
   
   while(1)
   {
   }
}

В общем, я тут запрещаю прерывания. Назначаю ножку PB0 (5-ая ножка) на выход. Сразу же и выдаю сигнал высокого уровня на эту ножку. Далее устанавливаю значение для счётчика таймера. Устанавливаю режим работы таймера CTC (Clear Timer on Compare). Устанавливаю чтобы счётчик таймера увеличивался каждый такт. Устанавливаю что сравнивать нужно со значением 0x01. Разрешаю прерывание по совпадению для A. И разрешаю прерывания.

И функция обработки прерывания:

Код:
ISR(TIM0_COMPA_vect)
{
   if(isHigh==1)
   {
      isHigh=0;
      outputLow();
   }
   else
   {
      isHigh=1;
      outputHigh();
   }
}

Ну и вспомогательные вещи:

Код:
typedef unsigned int                                             bool;

bool isHigh=1;

inline void outputHigh(void)
{
   PORTB|=_BV(PB0);
}

inline void outputLow(void)
{
   PORTB&=~_BV(PB0);
}


Ожидал я, что чередоваться сигналы будут каждые, примерно, 104.16(6) наносекунд (1 секунда / 9.6 МГц). Для проверки использовал осциллограф Hantek DSO2D15.

В результате, осциллограф показывает не то что я ожидал. Осциллограф показывает чередование каждые, примерно, 4 микросекунды. При этом, как-то, изображение сигнала на левой половине экрана то показывается, то пропадает. А изредка и вообще показывает какой-то другой сигнал (низкий уровень по длинной прямой и где-то может что-то поднялось на короткий промежуток времени).

Конечно, может быть дело в самом осциллографе. Но в нём есть встроенный генератор, где я выставил его на сигналы прямоугольной формы с частотой 9.6 МГц и подключил щуп. Он всё это улавливал. Да, там форма сигнала вызывала вопросы (далеко не прямоугольной формы он их отображал), но в остальном всё работало и временные интервалы меня более чем устраивали. И весь экран был забит сигналом (а не только правая часть). И он был устойчив, ничего не пропадало.

Ну и стоит ещё сказать, что питаю я микроконтроллер от 5 вольт. В начале я пробовал не трогать ножку сброса. Но так же и пробовал подключать её к плюсу питания через резистор на 1 кОм. Разницы никакой. С другой стороны, какая может быть разница, если микроконтроллер должен сбрасываться от сигнала низкого уровня на этой ножке.

В общем, вопрос вот в чём, может у меня что-то в коде не так?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймер ATtiny13A каждый такт на частоте 9.6 МГц
СообщениеДобавлено: Вт июн 06, 2023 05:06:08 
Друг Кота

Карма: 64
Рейтинг сообщений: 1013
Зарегистрирован: Пт мар 07, 2008 06:54:43
Сообщений: 4326
Откуда: Ижевск
Рейтинг сообщения: 0
Каждый такт не получится. Попробуйте хекс на основе кода на асме. Каждые 4 такта, т.е. 0,42мкс должен формироваться период.
Код:
.INCLUDE "tn13Adef.inc"

.CSEG
   SBI   DDRB,0

   LDI   R22,1
   OUT   OCR0A,R22
   LDI   R22,1<<COM0A0|1<<WGM01
   OUT   TCCR0A,R22
   LDI   R22,1<<CS00
   OUT   TCCR0B,R22
   RJMP   PC
.EXIT


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймер ATtiny13A каждый такт на частоте 9.6 МГц
СообщениеДобавлено: Вт июн 06, 2023 08:14:49 
Это не хвост, это антенна

Карма: 4
Рейтинг сообщений: 139
Зарегистрирован: Ср июн 25, 2008 15:19:44
Сообщений: 1477
Рейтинг сообщения: 0
Пусть частота кварца 10 МГц. Длительность одного такта 100 наносекунд. Даже если в лоб написать на асме, чтобы наверняка прибить гвоздями оптимизацию, что получим?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймер ATtiny13A каждый такт на частоте 9.6 МГц
СообщениеДобавлено: Ср июн 07, 2023 14:40:41 
Родился

Зарегистрирован: Пн июн 05, 2023 10:21:32
Сообщений: 3
Рейтинг сообщения: 0
Каждый такт не получится. Попробуйте хекс на основе кода на асме. Каждые 4 такта, т.е. 0,42мкс должен формироваться период.
Код:
.INCLUDE "tn13Adef.inc"

.CSEG
   SBI   DDRB,0

   LDI   R22,1
   OUT   OCR0A,R22
   LDI   R22,1<<COM0A0|1<<WGM01
   OUT   TCCR0A,R22
   LDI   R22,1<<CS00
   OUT   TCCR0B,R22
   RJMP   PC
.EXIT

Скачал Ваш hex-файл, прошил. Действительно работает. Сигнал меняется, вроде каждые около 200 нс. Но, если я не ошибаюсь, то тут используется PWM режим. А мне же, вообще, нужно чтобы у меня сигнал был разного интервала (нужно для отправки битов на микросхему WS2818B).

Что вот интересно. Я убрал делитель на 8. И, используя avr-as, написал такой код:

Код:

.equ DDRB,0x17
.equ PORTB,0x18

.data

.section .text
.org 0x0000

vectors:
   rjmp main
   rjmp vectors
   rjmp vectors
   rjmp vectors
   rjmp vectors
   rjmp vectors
   rjmp vectors
   rjmp vectors
   rjmp vectors
   rjmp vectors

main:
   cli
   
   in R16,DDRB
   in R17,PORTB
   
   sbr R16,0x01
   cbr R17,0x01
   
   out DDRB,R16
   out PORTB,R17
   
   ldi R18,0x01

loop:
   eor R17,R18                                                   ; 1 cycle
   out PORTB,R17                                                ; 1 cycle
   
   rjmp loop                                                   ; 2 cycles


По сути, я максимально (на сколько я придумал) быстро меняю местами сигналы LOW/HIGH на пине PB0 (ножка 5). Вот только результат странный. Мало того, что я получаю временные интервалы какие-то запредельные, так ещё и сам сигнал выглядит вот такой формы (только тут я инвентировал полярность, а то иначе сайт не отображает, на самом деле + почти всё время, а - изредка пробегает):

Цитата:
___________--___________--___________--___________

А ожидал я более менее равномерную:

Цитата:
__--__--__--__--__--__--__--__--__--__--__--__--__--__--

А далее я включил снова делитель на 8. И, решил вместо пина PB0 (ножка 5) использовать PB1 (ножка 6). В программе меняю константы 0x01 на 0x02. Ведь было 0b00000001, а станет 0b00000010. В результате подключаю осциллограф к пину PB1 (ножка 6) и там нет сигнала вообще. А подключаю его к пину PB0 (ножка 5) и там есть сигнал и как раз равномерный (хоть и временные интервалы не те что я ожидал). Вот я и не пойму, а почему сигнал идёт на пине PB0 (ножка 5), если я в регистр ввода/вывода PORTB выдаю каждые 4 тика то 0b00000000, то 0b00000010. В чём моя ошибка?


Вернуться наверх
 
В продаже новые LED-драйверы XLC компании MEAN WELL с диммингом нового поколения

Компания MEAN WELL пополнила ассортимент своей широкой линейки светодиодных драйверов новым семейством XLC для внутреннего освещения. Главное отличие – поддержка широкого спектра проводных и беспроводных технологий диммирования. Новинки представлены в MEANWELL.market моделями с мощностями 25 Вт, 40 Вт и 60 Вт. В линейке есть модели, работающие как в режиме стабилизации тока (СС), так и в режиме стабилизации напряжения (CV) значением 12, 24 и 48 В.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Таймер ATtiny13A каждый такт на частоте 9.6 МГц
СообщениеДобавлено: Ср июн 07, 2023 16:35:12 
Модератор
Аватар пользователя

Карма: 153
Рейтинг сообщений: 2908
Зарегистрирован: Сб авг 14, 2010 15:05:51
Сообщений: 18720
Откуда: г. Озерск, Челябинская обл.
Рейтинг сообщения: 0
Медали: 1
Лучший человек Форума 2017 (1)
dubrovkin писал(а):
Но, если я не ошибаюсь, то тут используется PWM режим.
ошибаешься. это режим сброса по сравнению.
вот эти строки
akl писал(а):
   LDI   R22,1
   OUT   OCR0A,R22
задают, что счетчик таймера после установки в 1 сразу сбрасывается.
dubrovkin писал(а):
А мне же, вообще, нужно чтобы у меня сигнал был разного интервала
а записывая в OCR0A разные числа, можно изменять период следования импульсов.

_________________
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймер ATtiny13A каждый такт на частоте 9.6 МГц
СообщениеДобавлено: Ср июн 07, 2023 17:31:09 
Родился

Зарегистрирован: Пн июн 05, 2023 10:21:32
Сообщений: 3
Рейтинг сообщения: 0
dubrovkin писал(а):
Но, если я не ошибаюсь, то тут используется PWM режим.
ошибаешься. это режим сброса по сравнению.
вот эти строки
akl писал(а):
   LDI   R22,1
   OUT   OCR0A,R22
задают, что счетчик таймера после установки в 1 сразу сбрасывается.
dubrovkin писал(а):
А мне же, вообще, нужно чтобы у меня сигнал был разного интервала
а записывая в OCR0A разные числа, можно изменять период следования импульсов.

Если тут речь про таймер, то где функция обработки прерывания таймера? Я её не вижу по коду.


Вернуться наверх
 
Распродажа паяльного оборудования ATTEN!
Паяльные станции, паяльники и аксессуары по самой выгодной цене.

По промокоду radiokot скидка 10%
Не в сети
 Заголовок сообщения: Re: Таймер ATtiny13A каждый такт на частоте 9.6 МГц
СообщениеДобавлено: Чт июн 08, 2023 04:44:09 
Друг Кота

Карма: 64
Рейтинг сообщений: 1013
Зарегистрирован: Пт мар 07, 2008 06:54:43
Сообщений: 4326
Откуда: Ижевск
Рейтинг сообщения: 0
dubrovkin писал(а):
Если тут речь про таймер, то где функция обработки прерывания таймера? Я её не вижу по коду.
А её и нет. Используются возможности аппаратного модуля таймера. В Вашем случае лучше использовать режим с буферированием.
Попробуйте так.
Спойлер
Код:
.INCLUDE "tn13Adef.inc"
;.equ DDRB,0x17      ; такие установки делаются вручную
;.equ PORTB,0x18

;.data

;.section .text
.org 0x0000

vectors:
  rjmp main
   rjmp vectors
   rjmp vectors
   rjmp vectors
   rjmp vectors
   rjmp vectors
   rjmp vectors
   rjmp vectors
   rjmp vectors
   rjmp vectors

main:
   cli
   
   LDI   R16,0x17
   LDI   R17,0x19
   out DDRB,R16
   out PORTB,R17
   
   LDI R18,0x03
;   ldi R18,0x01
loop:
   eor R17,R18      ; 1 cycle
   out PORTB,R17   ; 1 cycle
   
   rjmp loop      ; 2 cycles
.EXIT


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймер ATtiny13A каждый такт на частоте 9.6 МГц
СообщениеДобавлено: Чт июн 08, 2023 05:39:40 
Друг Кота
Аватар пользователя

Карма: 51
Рейтинг сообщений: 2108
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Сообщений: 6998
Откуда: Сердце Пармы
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (2)
попробуйте режим тоггл — записывайте не меняющееся значение в порт, а 1 в пин, тогда инвертировать ничего не надо будет и 1 такт сэкономится
Спойлер
Код:
.INCLUDE "tn13Adef.inc"
;.equ DDRB,0x17      ; такие установки делаются вручную
;.equ PORTB,0x18

;.data

;.section .text
.org 0x0000

vectors:
  rjmp main
   rjmp vectors
   rjmp vectors
   rjmp vectors
   rjmp vectors
   rjmp vectors
   rjmp vectors
   rjmp vectors
   rjmp vectors
   rjmp vectors

main:
   cli
   
   LDI   R16,0x17
   LDI   R17,0x19
   out DDRB,R16
   out PORTB,R17
   
   LDI R18,0x03
;   ldi R18,0x01
loop:
   
   out PINB,R18   ; 1 cycle
   
   rjmp loop      ; 2 cycles
.EXIT

_________________
Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймер ATtiny13A каждый такт на частоте 9.6 МГц
СообщениеДобавлено: Вс июн 11, 2023 02:09:59 
Это не хвост, это антенна

Карма: 4
Рейтинг сообщений: 139
Зарегистрирован: Ср июн 25, 2008 15:19:44
Сообщений: 1477
Рейтинг сообщения: 0
Чуть не забыл. Неизвестно, исправили этот баг или нет. Несколько лет назад на одном из форумов мелькнула тема. Суть: Не помню какие мк. Копайте сами тему. Мне сейчас не до этого. Если сделать вывод в порт, будет задержка на не менее 8 тактов. Именно эта проблема решается только прямым управлением пинов. Sbi, cbi. Возможно, это этот случай.
Вроде нашел тему.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймер ATtiny13A каждый такт на частоте 9.6 МГц
СообщениеДобавлено: Вс июн 11, 2023 10:36:33 
Друг Кота
Аватар пользователя

Карма: 94
Рейтинг сообщений: 1466
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 15050
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
А кто гарантировал, что сигнал внутреннего генератора абсолютно точен и стабилен?
Это ведь даже не кварц...
8)
Да и требования к меандру довольно высоки - такую картинку предпочтительно на тиньке 25/45/85 делать.
Была когда-то тест-игрушка для опытов с самодельным протоколом для WS2812 под ассемблером (авр студио 4.19):
Вложение:
tnX5_2812_mm.zip [119.35 KiB]
Скачиваний: 49

Вполне удачна, но допуски +/- таки и там имеются.
:tea:


Вернуться наверх
 
В сети
 Заголовок сообщения: Re: Таймер ATtiny13A каждый такт на частоте 9.6 МГц
СообщениеДобавлено: Вс июн 11, 2023 12:56:03 
Говорящий с текстолитом

Карма: 25
Рейтинг сообщений: 450
Зарегистрирован: Сб май 05, 2012 20:24:52
Сообщений: 1622
Откуда: KN34PC, Болгария
Рейтинг сообщения: 0
С кодом ниже перебрал все возможные коэффициенты.
флаш: 54 байт, выход: PB0 (pin 5), контроль: oсциллограф и частотомер. Fclk Internal = 9,6 MHz
(Фильтрующий конденсатор рядом с МК предполагается ставить. Без него не обошлось без сюрпризов: чуть не бросил экспериментировать :) ).
Код:
int main(void) {
  PORTB = 0;
  DDRB = 0;

  DDRB |= (1 << DDB0);      // RB0 output

  TCCR0A = 0;
  TCCR0A |= (1 << WGM01);   // CTC mode
  TCCR0A |= (1 << COM0A0);  // toggle OC0A on compare match

  // FOCnx = Fclk_IO / (2 * N * (1 + OCRnx)
  // N (prescale factor) = 1, 8, 64, 256, or 1024

  TCCR0B |= (0 << CS02) | (0 << CS01) | (1 << CS00);  // no prescaler
  OCR0A = 1; // 0: 4.8 MHz, 1: 2.4 MHz, 2: 1,6 MHz, 4: 1.2 MHz ...

  while (1) {
  }

  return 0;
}


Вложения:
gen.ino_attiny13a_9600000L.zip [294 байт]
Скачиваний: 57
Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y