Jump to content

Таймер ATtiny13A каждый такт на частоте 9.6 МГц


dubrovkin
 Share

Recommended Posts

Всем доброго времени суток!

Есть микроконтроллер 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 кОм. Разницы никакой. С другой стороны, какая может быть разница, если микроконтроллер должен сбрасываться от сигнала низкого уровня на этой ножке.

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

Link to comment
Share on other sites

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Posted (edited)

В обработчике прерывания tcnt0 нужно обнулять.

2 часа назад, dubrovkin сказал:

сигналы будут каждые, примерно, 104.16(6) наносекунд

Не будут, это невозможно! Вызов обработчика прерывания, возврат из него, несколько команд для инверсии пина. Как Вы всё это представляете за один такт?

Если нужно максимально быстро, то нужно использовать режим, когда таймер непосредственно управляет выходом. Но возможно это не PB0 будет. Надо документацию читать.

Edited by ДядяВован
Link to comment
Share on other sites

Участвуйте в розыгрыше купонов 5000 ₽, 10000 ₽ и 15000 ₽! Выиграй купон и забирай на эту сумму любые электронные компоненты, радиодетали или любой другой товар из нашего каталога

Проигравших не будет, без подарков никто не останется! ТМ дарит всем участникам розыгрыша 5000 баллов на счёт весь декабрь скидка 10% по промокоду UHUHU23, а ещё 15% кэшбэк и бесплатная доставка! Ну... вздрогнем!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

@dubrovkin , такой код (проверка уровня на входе и установка соответствующего уровня на выходе порта) не требует использования прерывания и с максимальной скоростью выполняется, если просто написан в "вечном цикле". Написать лучше на ассемблере, чтобы точно знать, сколько машинных циклов потребуется на выполнение.

Link to comment
Share on other sites

Материалы вебинара «Литиевые аккумуляторы EVE Energy и решения для управления перезаряжаемыми источниками тока»

Опубликованы материалы вебинара Компэл, посвященного литиевым аккумуляторам EVE Energy и решениям для управления перезаряжаемыми источниками тока.

На вебинаре мы представили информацию не только по линейкам аккумуляторной продукции EVE, но и по решениям для управления ею, что поможет рассмотреть эти ХИТ в качестве дополнительной альтернативы для уже выпускающихся изделий. Также рассмотрели нюансы работы с производителем и сервисы, предоставляемые Компэл по данной продукции. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

 В этом режиме TCNT0 автоматически должен сбрасываться при совпадении с OCR0A., прерывания вообще убрать, а изменение выхода сделать аппаратно настроив COM0A, частоту рассчитать по формуле из даташита пункт 11.7.2

Link to comment
Share on other sites

Комплексные решения с литиевыми батареями EVE для интеллектуальных систем безопасности

Литиевые химические источники тока EVE по своим характеристикам являются идеальным выбором для современных интеллектуальных систем безопасности. EVE разрабатывает литиевые батареи, опираясь на многолетние исследования таких областей применения, как беспроводная связь стандартов Bluetooth, LoRa, Wi-Fi, NB-IoT и ZigBee. Рассмотрим решения для систем безопасности с использованием батарей EVE. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Posted (edited)

В регистр калибровки OSCCAL можно максимум (0x7F) записать . Частота почти в 2 раза увеличится .

Edited by dodik
Link to comment
Share on other sites

Posted (edited)

Так, начну по порядку...

Цитата

В обработчике прерывания tcnt0 нужно обнулять.

Не нужно, я использую режим CTC, он сам это делает. Единственное что я не понял, так это почему-то в какой-то из статей я читал, что нужно в регистре OCR0A ставить значение на 1 меньше чем нужно (типа ноль тоже считается). А я вот никак не могу понять, зачем убавлять. Например, мне нужно чтобы таймер срабатывал каждый 3 тик микроконтроллера. По логике из статьи, я должен там был написать 2. Но, всё начинается с нуля когда включается микроконтроллер. И вот идёт тик и там 1, ещё тик и там 2, и ещё тик и там 3. То есть, произошло 3 тика как мне и нужно. И вот как произошёл третий тик, то счётчик сбрасывается на 0. Он же это делает сразу же, а не в следующем тике? А если да, то установив я на одно значение меньше, чем писали в статье, то получается что была бы ошибка. Но, если микроконтроллер сбрасывает счётчик в режиме CTC не сразу, то да, тогда нужно убавлять. Как он это делает?

Цитата

Не будут, это невозможно! Вызов обработчика прерывания, возврат из него, несколько команд для инверсии пина. Как Вы всё это представляете за один такт?

А мне и не нужно чтобы прям всё было ровно. Микроконтроллер работате на частоте 9.6 МГц. Это очень много инструкций за единицу времени. Напишу я там в обработчике ряд команд - это всё мизер.

Цитата

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

Не знаю какого типа код имеется в виду. Этот код я показал лишь как алгоритм работы с таймером. Типа всё ли я верно делаю.

Цитата

прерывания вообще убрать

Зачем?)

Цитата

Вот я всегда и ратую, что лучше с ассемблера начинать программирование МК.

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

 

Ну и на счёт того, убрать прерывания, использовать там шим или ещё какие-то вещи...сразу дам ответ. Мне, в финальном результате, не нужно чтобы был какой-то постоянный сигнал на ножках (высокий уровень или низкий). Конкретно цель такая: есть ATtiny13A, есть WS2818B. Нужно передать на него ряд данных, чтобы микросхема зажгла сведодиод. У микросхемы свои лимиты по времени:

T0H = 220ns-380ns

T0L = 580ns-1.6us

T1H = 580ns-1.6us

T1L = 220ns-420ns

RES = > 280us

Биты передаются в виде пар T0/1H и T0/1L (где 0/1 в зависимости от того, что нужно за бит передать). А RES, это когда нужно чтобы микросхема не слала данные следующим микросхемам. И получается, что чтобы впендюриться в эти диапазоны, мне нужно пустить микроконтроллер на 9.6 МГц по таймеру на каждый тик, и сверять его по счётчику так, чтобы он каждые 3 тика мне давал возможность что-то сделать. А там, дальше, уже для передачи тех же самых данных использовать такие вот цифры:

T0H = 1 (312.5ns)

T0L = 2 (625ns)

T1H = 2 (625ns)

T1L = 1 (312.5ns)

RES = 897 (280.3125us)

Отсюда и вопрос, почему на осциллографе хрень отображается.

Edited by dubrovkin
Link to comment
Share on other sites

1 час назад, dubrovkin сказал:

вопрос, почему на осциллографе хрень отображается.

Ну, на этот вопрос можно ответить совершенно точно. Какая хрень в коде написана, такая и отображается.

Link to comment
Share on other sites

1 час назад, dubrovkin сказал:

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

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

Как его будете вызывать дело второе . Отлаживать удобно в Proteus или в чем-то похожем .

 

Link to comment
Share on other sites

25 минут назад, oleg korotkov сказал:

Обработка прерывания где то попадалось......... 13 тактов.......;-((

Тогда что же, вообще что ли без прерываний делать.

3 минуты назад, Lexter сказал:

Ну, на этот вопрос можно ответить совершенно точно. Какая хрень в коде написана, такая и отображается.

Вот в этом-то и вопрос, что не так написано?

Это что же получается, отказываться от прерываний и уже в цикле просто крутить с более менее точным расчётом на этой ли итерации цикла нужно что-то там устанавливать?

Какие вообще есть идеи?

2 минуты назад, dodik сказал:

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

Как его будете вызывать дело второе . Отлаживать удобно в Proteus или в чем-то похожем .

 

Программный драйвер...меня пугает слово драйвер. Что вообще под этим подразумевается? Как раз то, что я описал выше, что в цикле крутить всё и рассчитывать пришло ли время в этой итерации цикла что-то менять? Proteus платный. Да и не купить его в России, вроде бы. Альтернативы подскажите?

Link to comment
Share on other sites

1 час назад, dubrovkin сказал:

Это что же получается, отказываться от прерываний ...

А вы ещё обработку видео с кодированием на нём замутите, или распознавание образов, тогда вашему возмущению вообще не будет пределов. :D

 

2 часа назад, dubrovkin сказал:

Вот в этом-то и вопрос, что не так написано?

Да всё не так. Полное непонимание работы "железа". Учите матчасть.
Выучите - сами будете смеяться над такими вопросами. Пол-интернета завалено вот такими вопросами возмущённых "чисто кодеров" на С, типа "Почему у меня прерывание не отрабатывается, хотя все библиотеки подключил?" :angry:

Link to comment
Share on other sites

2 часа назад, dubrovkin сказал:

Альтернативы подскажите?

Ищите по названию ассемблера gavrasm, у автора есть симулятор avr-sim. Всё бесплатно и под linux/win, Но исходник нужен на ассемблере.

3 часа назад, dubrovkin сказал:

Микроконтроллер работате на частоте 9.6 МГц. Это очень много инструкций за единицу времени. Напишу я там в обработчике ряд команд - это всё мизер.

В какую единицу времени? Одна команда МК это 1, 2 или даже 3 такта. А этих команд в обработчике прерывания компилятор Си не меньше двух десятков впихнул, учитывая по миниму сохранение в стеке хотя бы регистра статуса. Плюс само прерывание и вызов обработчика, возврат из обработчика. Какой же тут мизер?

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

Link to comment
Share on other sites

Спасибо! Продолжу тесты уже на ассемблере. Что посоветуете: gavrasm или gcc-avr (есть на сайте Microchip, там и C/C++ и ассемблер)?

Link to comment
Share on other sites

3 минуты назад, dubrovkin сказал:

Что посоветуете

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

Link to comment
Share on other sites

17 минут назад, Геннадий сказал:

Вам нужен 1-Wire со скоростью от 400 kB/sec, а не прерывания.

Ну, в терминологии я не разбираюсь. А так да, данные на WSA2818B передаются по одному проводу. Но вот формулировка "1-Wire"...в ATtiny13A и в ATmega328PB я не увидел в Datasheet'е ни слова про 1-Wire. Точнее, в ATtiny13A было указано что так работает отладка. А вообще, WS2818B поддерживает скорость 800 KB/s (правда я не знаю биты это у них в Datasheet'е указаны или байты).

Link to comment
Share on other sites

15 часов назад, dubrovkin сказал:

меня пугает слово драйвер. Что вообще под этим подразумевается?

15 часов назад, dubrovkin сказал:

Альтернативы подскажите?

и т.д. 

Очень много разных вопросов, причем имеющих ответы в легком доступе .

Для себя делал программные драйвера SPI и I2С . Для WSA не доводилось, но судя по даташиту это еще проще , линию данных от SPI оставить , с учетом 24 бит .

Link to comment
Share on other sites

16 часов назад, dubrovkin сказал:

Нужно передать на него ряд данных, чтобы микросхема зажгла сведодиод. У микросхемы свои лимиты по времени:

Вы наверное просто не понимаете, что там написано и как это работает...
если очень примитивно , то в WS2818B два таймера:
первый запускается по нарастающему фронту на входе, отсчитывает 400..500ns и по окончанию счета состояние на выходе записывает в регистр защелку.
второй запускается по спаду и сбрасывается по нарастающему фронту на входе , если таймер отсчитал больше 50..280us(в разных ревизиях по разному) данные из регистра защелки переписываются в выходной регистр.
Т.е. для передачи бита важна только длительность импульса. длительность паузы не критична и не должна превышать время сброса.

10 часов назад, dubrovkin сказал:

в ATmega328PB я не увидел в Datasheet'е ни слова про 1-Wire.

Опять же не понимаете, что там написано и как это работает...
В ATmega328PB есть SPI , используется линия данных в режиме мастер,  длительность бита устанавливается 220..380ns. Два бита посылки передается двумя полубайтами:
лог1 = 1110 (T1H=3*220..380ns + T1L=220..380ns)
лог0 = 1000(T0L=220..380ns + T0H=3*220..380ns)
время передачи двух бит при этом составит 1,76..3,04us

Link to comment
Share on other sites

22 часа назад, dubrovkin сказал:

Осциллограф показывает чередование каждые, примерно, 4 микросекунды.

Так и будет, накладные расходы на выполнение кода. Опять же, вот это условие, да еще и с вызовом функций будет отжирать дофига времени:

	if(isHigh==1)
	{
		isHigh=0;
		outputLow();
	}
	else
	{
		isHigh=1;
		outputHigh();
	}

Сделать без условия, обычной инверсией бита и работа ускорится прилично.

 

19 часов назад, dubrovkin сказал:

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

UART в помощь. Можно посмотреть реализацию для 1-wire, просто изменить тайминги под себя.

Link to comment
Share on other sites

Если разговор идет про Attiny13, то без внешнего тактового генератора реализовать софтовый 1Wire на 800kb/s сложновато. В распоряжении будет всего несколько команд.  

По аппаратному решению - у нее кроме UART ничего и нет. SPI только для программирования.

Link to comment
Share on other sites

Спасибо за ответы! Буду смотреть. Пока просто начал с ATtiny13A на 9.6 МГц. Активный кварцевый генератор на 20 МГц для него есть. Но опять же, это я пока для тестов. Скорее всего конечный вариант будет с ATmega (наверное ATmega328PB или что-то такое, где может памяти больше). А там уже 16 МГц. Не помню только активный или пассивный кварц ему нужен, но в наличии есть и такой и такой.

Link to comment
Share on other sites

Для Atmega подойдет любой кварц, для Attiny13 - только генератор. Вы определитесь сразу Тинька или Мега, чтобы время зря не тратить.:)

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.

×
×
  • Create New...