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

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


dubrovkin

Рекомендуемые сообщения

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

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

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

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

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

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

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

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

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

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

Изменено пользователем ДядяВован

С уважением, Владимир

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

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

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

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

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

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

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

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

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

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

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

Цитата

В обработчике прерывания 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)

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

Изменено пользователем dubrovkin
Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

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

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

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

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

 

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

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

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

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

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

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

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

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

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

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

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

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

 

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

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

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

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

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

 

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

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

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

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

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

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

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

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

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

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

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

С уважением, Владимир

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

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

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

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

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

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

Что посоветуете: gavrasm или gcc-avr

С этим помочь не смогу, т.к. вторым вариантом не пользовался.

С уважением, Владимир

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

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

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

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

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

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

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

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

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

и т.д. 

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

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

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

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

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

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

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

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

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

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

 

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

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

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

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

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

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

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

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

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

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

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

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

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

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

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

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

  • Сообщения

    • Lexter.. а чтобы проверить защиту Можно же просто замкнуть транзистор оптопары? Защита быстро срабатывает генерация прекращается
    • У меня в детстве были платы (брак с радиозавода), очень много, не говоря уже о всяких деталюхах, которые отец успел накопить. Проблем не было не в резисторах, не в конденсаторах, не в транзисторах. Мне как новичку хватало всего. Покупать начал лет в 17-18 и то только конденсаторы большой емкости, да транзисторы кой какие.
    • Приветствую братва! Заказал активный фильтр для сабвуфера с регулятором среза и регулятором громкости. Сам фильтр верха срезает, но при дополнительной регулировке среза меняется громкость, а не срез. На слух никакой разницы не слышу. Может срез и регулируется, но одновременно и уровень громкости. Получается, эти оба потенциометра регулируют громкость. Схему приложил, продавец дал. Что можете по ней сказать? Как её работоспособность? И что можно изменить, чтобы регулировался срез? Качество схемы только такое…
    • Хорошо в придачу к мультиметру  купить транзистор-тестер с возможностью измерения  емкости и ESR конденсаторов. Да и других функций у него достаточно.
    • На Али полно всяких наборов из широко применяемых транзисторов, резисторов и конденсаторов разных номиналов, стабилизаторов напряжения, светодиодов и т.п. Удобно и недорого. Беспаечные и под пайку макетки.
    • А монтажные провода? А набор отверток? А бокорезы, в конце концов, пинцеты? Забыли посоветовать?
    • Monica Хорошие вопрос для начинающего! Вот несколько основных радиокомпонентов, которые я бы рекомендовал новичку: Резисторы - это базовый пассивный компонент, который используется для регулировки тока и напряжения в цепи. Выберите набор резисторов с разными номиналами сопротивления. Конденсаторы - еще один основной пассивный компонент, используемый для фильтрации, развязки и других применений. Рассмотрите электролитические, керамические и пленочные конденсаторы. Светодиоды - это простые и полезные активные компоненты, которые можно использовать для индикации и простых схем. Транзисторы - эти активные компоненты являются основой многих электронных схем. Я бы посоветовал начать с биполярных транзисторов. Микроконтроллеры - миниатюрные программируемые компьютеры, которые дают начинающим большие возможности для творчества и экспериментов. Также очень полезно иметь базовые инструменты, такие как мультиметр, паяльник и припой. Начните с этих основных компонентов и постепенно расширяйте свою коллекцию по мере роста знаний и интересов. Желаю успехов в ваших электронных проектах!
×
×
  • Создать...