Jump to content

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


dubrovkin
 Share

Recommended Posts

25 минут назад, ДядяВован сказал:

А как это узнать на этапе компиляции???

Скажем так, когда я пишу код, я как-то могу понять какая у меня глубина push'ей и call'ов будет максимальная (уж извините, если за этим не слелить, то остаётся только с закрытыми глазами писать код, наверное современные игры так и пишут). В результате, когда я бы стал делать ассемблирование, я мог бы передать в ассемблер сколько мне нужно стека (либо через параметр командной строки, либо через какую-нибудь .maxstack). Он видит сколько переменных объявлено и если оставшееся место меньше чем я указал, то выдавать ошибку. Сейчас я всё и так это сам могу посчитать и решить хватит или нет. Но я же говорю про вынос таких вещей в автоматизацию. Да, не автоматизируешь подсчёт глубины push'ей и call'ов (это достаточно сложный анализ, хоть это и можно посчитать, но это уже вопрос анализаторов). Но я готов сам это считать, так как это не сложно (код-то я пишу). Просто в чём-то облегчить себе задачу. Ладно, пофиг.

 

Link to comment
Share on other sites

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

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

Link to comment
Share on other sites

Реле, разъемы, вентиляторы, корпуса, микросхемы, конденсаторы и много другое!

Скидки до 20% на сайте электронного дискаунтера ТМ Электроникс.

Бесплатная доставка в любую точку России + кэшбэк 15%.

Подробнее

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

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

хоть это и можно посчитать, но это уже вопрос анализаторов)

Не можно. Ну если только нейросеть попытается...

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

Ладно, пофиг

Золотые слова!

Link to comment
Share on other sites

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

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

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

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

Ребят, есть вопрос по поводу регистра TIFR0 и его бита OCF0A (бит 2). В Datasheet написано:

Цитата

The OCF0A bit is set when a Compare Match occurs between the Timer/Counter0 and the data in OCR0A – Output Compare Register0. OCF0A is cleared by hardware when executing the corresponding interrupt handling vector. Alternatively, OCF0A is cleared by writing a logic one to the flag. When the I-bit in SREG, OCIE0A (Timer/Counter0 Compare Match Interrupt Enable), and OCF0A are set, the Timer/Counter0 Compare Match Interrupt is executed.

В общем понятно, что когда условия выполнили, устанавливается 1 чтобы вызвать прерывание. Обработка прерывания само сбросит на 0. Альтернативный способ - это самому установить бит в 1 и это его сбросит. То есть, я так понял, они имеют в виду, что если там записано 1, то запись туда 1 принудительно, сбросит бит на 0. А если там записано 0 и мы запишем туда 1, то там что будет?

Просто у меня такая задача. Мне нужно так, чтобы в не зависимости что там записано, там 100% было 0.

Link to comment
Share on other sites

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

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

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

1 туда не записывается. бит можно только сбросить.

Мудрость приходит вместе с импотенцией...

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

Link to comment
Share on other sites

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

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

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

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

7 минут назад, Starichok сказал:

1 туда не записывается. бит можно только сбросить.

Так в Dataheet написано же:

Цитата

Alternatively, OCF0A is cleared by writing a logic one to the flag.

Что они тогда имеют в виду? Куда записывать 1?

Link to comment
Share on other sites

Блин, а что, эффект дребезжания контактов нужно не только в момент нажатия на кнопку ликвидировать, но и в момент отпускания? А то нажал, долго держу. А потом отпустил и на тебе, бывает что срабатывает снова действие.

Link to comment
Share on other sites

17 часов назад, ДядяВован сказал:

Я же про количество команд cli и sei отвечал. Причём здесь стек?

При том , что стек штука вытесняемая. Каждый вызов любой функции увеличивает стек, возврат уменьшает. Вот вызвали в мейне 7 вложенных функций, стек+7 , а стек всего скажем 10 , прерывание прилетело , в нем разрешили прерывание sei,  в нем еще функцию вызвали, стек+2, еще прерывание прилетело еще +2, итого +11, и в мейне в начало вызова уже не попали....
А если в прерывании рекурсия начнется вообще опа будет.

Link to comment
Share on other sites

@IMXO, ещё раз попробую.

ТС спрашивал, после 10 команд CLI, сколько нужно команд SEI, чтобы разрешить прерывание, одна или десять? Мой ответ: никакого счётчика нет, после 100500 запретов прерывания одна инструкция SEI разрешит их. Эти инструкции МК никакого отношения к стеку не имеют. Вы снова пишете про стек...

Link to comment
Share on other sites

Разница мышлений между Си и Ассм. Один говорит про функции, другой про команды.:) Отсюда и непонимание друг друга.

Дубровкин, прочитайте же Евстифеева. Много вопросов отпадут сами собой. И еще... В Ассме главное правильно выбрать способ решения данной задачи, что позволит легко ее выполнить. Кидаться делать не подумавши не нужно, иначе можно заблудиться в дебрях алгоритмов.

Edited by Геннадий
Link to comment
Share on other sites

На праздниках(выходные всегда праздник)   немного подумал над темой и доработал драйвер . Он оказался не RGB , а GRB

И совсем не понятно зачем здесь прерывания . Можно поставить счетчик светодиодов и по нему вызывать опрос кнопок и смену информации .  

Да и стек напрягать не обязательно. Лучше использовать адресацию ОЗУ , ее проще контролировать .

Для сокращения памяти можно добавить конвертер . Информацию о цвете хранить в  8-разрядном формате и конвертировать в 24 разряда перед загрузкой в светодиоды . 

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

WS2812_8.png.79b5975e9f44fdf7de5f83d4879730f9.png

Прога

Спойлер
;WS2818 Управление светодиодами
.def zero   = R15
.def temp   = R16
.def CLK    = R19
.def RED    = R20
.def GREEN  = R21
.def BLUE   = R22
.def color  = R23
.equ W1=2 ;Линия управления
.nolist .include "tn13def.inc" .list 
;.dseg ;.eseg 
.cseg
;.include "lib.asm"
Reset: cli
ldi temp, low(RAMEND) out SPL, temp	         ; Инициализация стека
clr r31 ldi r30,29 st Z,R31 dec	R30 brne PC-2    ; Очистка регистров 
sbi DDRB,W1
proga:
ldi RED,  $f0 ldi GREEN,$f0 ldi BLUE, $f0 rcall DRIVER_GRB
ldi RED,  $ff ldi GREEN,$f0 ldi BLUE, $f0 rcall DRIVER_GRB
ldi RED,  $f0 ldi GREEN,$ff ldi BLUE, $f0 rcall DRIVER_GRB
ldi RED,  $fF ldi GREEN,$fF ldi BLUE, $f0 rcall DRIVER_GRB
ldi RED,  $F0 ldi GREEN,$F0 ldi BLUE, $Ff rcall DRIVER_GRB
ldi RED,  $Ff ldi GREEN,$F0 ldi BLUE, $FF rcall DRIVER_GRB
ldi RED,  $F0 ldi GREEN,$Ff ldi BLUE, $Ff rcall DRIVER_GRB
ldi RED,  $FF ldi GREEN,$FF ldi BLUE, $Ff rcall DRIVER_GRB
rjmp PC-0
;------------------------------------------
DRIVER_GRB: ;WS2812
ldi CLK,9
GREEN_OUT:
sbi PORTB,W1   sbrs GREEN ,W1    ;3t
OUT portB,temp dec CLK lsr GREEN ;3t
OUT portB,temp brne GREEN_OUT    ;3t
ldi CLK,9
RED_OUT:
sbi PORTB,W1   sbrs RED,W1       ;3t     "1"
OUT portB,temp dec CLK lsr RED   ;3t "1" или "0"
OUT portB,temp brne RED_OUT      ;3t     "0"
ldi CLK,9
BLUE_OUT:
sbi PORTB,W1   sbrs BLUE,W1      ;3t
OUT portB,temp dec CLK lsr BLUE  ;3t
OUT portB,temp brne BLUE_OUT     ;3t
ret
;-----------------------------------------

 

Link to comment
Share on other sites

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

Евстифеева читает

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

Link to comment
Share on other sites

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

...как составлять алгоритмы там нет , и вроде нигде нет .  

Вот этим и можно поделиться. Но для этого надо знать полную "задумку" автора, которую он выложить не торопится. Затаился.:)

Link to comment
Share on other sites

Да тут я. Алгоритмы самому придумывать нужно. В общем, интересная тут вещь получается. Чтобы разобраться по подробнее с прерываниями, я решил в свою тестовую задачку включить прерывания от кнопки и прерывания от таймера. А сама передача на WS2818B идёт вне прерываний в цикле. Так вот, прерывание от кнопки для определения состояния нажали или нет. А таймер, чтобы дребезжание контактов отсечь. В общем делал, делал, всё не так. Думал что не так с прерываниями. В итоге, опытным путём, выяснил что прерывания не виноваты. Написал отдельный код, его задача, отправлять на микросхему цвета в цикле. Цвета выбрал: красный, оранжевый, жёлтый, зелёный, голубой, синий, фиолетовый, белый и чёрный (не горит). Между отправками выставил тройной цикл для задержки. В общем какая-то дичь была. Оставил отправку только трёх цветов: красный, зелёный и синий. Всё идеально. Включил все цвета радуги - идеально. Добавил к ним чёрный (отключение) - то же нормально. Но вот как только я начинаю использовать белый цвет, то всё работает странно (зажигается не белый, а какой-то другой цвет, я там даже понять не могу что происходит). Вообще, цвета пробовал передавать и как 255 и как 50 (255 очень ярко). В общем я думал у меня кнопка что-то не так передаёт, когда я делал чтобы цвет менялся от кнопки (грешил что не так прерывания обрабатываю). А тут дело оказывается в белом цвете. В последний раз передавал на него (50,50,50) и происходит бред. Есть идеи что за поведение такое? У меня как бы не отдельные алгоритмы для каждого цвета, всё одно и то же. Есть процедура задержки, есть процедура отправки цвета. Есть заранее определённые регистры, в которые я помещаю байты цвета. Так что всё работает универсально (на то и процедура, чтобы выполнять одни и те же действия), но вот как хочу получить белый цвет, то не получаю)

Link to comment
Share on other sites

А там по разному. То слишком красный яркий, то белый очень яркий. То вообще словно перепрыгивание цвета. Там хрен поймёшь. У меня как устроено. Я ввёл 3 константы: R, G и B. Они обозначают максимальную яркость на канал. А в цветах я оперирую уже:

; Красный
ldi RR,R
ldi RG,0
ldi RB,0

; Оранжевый
ldi RR,R
ldi RG,G/2
ldi RB,0

; Жёлтый
ldi RR,R
ldi RG,G
ldi RB,0

; Зелёный
ldi RR,0
ldi RG,G
ldi RB,0

И так далее. Вначале я выставлял всё как 255, но были слишком ярко. Сейчас выставил 50. А вот когда доходил дело до белого цвета, то может даже что-то яркое загореться.

Link to comment
Share on other sites

Так я же говорю, код отправки цвета один - это процедура. И все цвета нормально отправляются и всё работает. Но как только отправляю белый - не работает.

Link to comment
Share on other sites

В 10.06.2023 в 14:57, colorad сказал:

Предложите свою архитектуру МК .

Ну, например, в RISC-V нет аппаратного стека. Соответственно, если не пользоваться чужими библиотеками (и особенно языками высокого уровня), можно стек пустить хоть снизу вверх, хоть сверху вниз, хоть через DMA по диагонали.

Если интересно, могу попробовать организовать удаленный доступ на микроконтроллер gd32vf103, как раз на risc-v. Правда, он 32-битный и с довольно развесистой периферией. Если уж avr проблемы вызывает, то там точно утонете.

В 10.06.2023 в 15:44, dubrovkin сказал:

Скажем так, когда я пишу код, я как-то могу понять какая у меня глубина push'ей и call'ов будет максимальная

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

В 10.06.2023 в 15:44, dubrovkin сказал:

я мог бы передать в ассемблер сколько мне нужно стека (либо через параметр командной строки, либо через какую-нибудь .maxstack). Он видит сколько переменных объявлено и если оставшееся место меньше чем я указал, то выдавать ошибку.

Ну пропишите для стека специальную секцию памяти с заданным размером. Если "обычная" .data начнет на нее наползать, получите ошибку. Правда зачем вам это надо я без понятия.

В 10.06.2023 в 15:44, dubrovkin сказал:

Да, не автоматизируешь подсчёт глубины push'ей и call'ов (это достаточно сложный анализ, хоть это и можно посчитать, но это уже вопрос анализаторов).

В общем случае это невозможно посчитать. Допустим, вы хотите организовать вложенные прерывания и сделали там sei. Откуда автоматике знать будет ли вызываться одно и то же прерывание раз за разом?

А для хелло-ворлдов в этом просто нет смысла.

В 10.06.2023 в 16:16, ДядяВован сказал:

Не можно. Ну если только нейросеть попытается...

...то она выдаст какой-то результат, достоверность которого человек даже оценить не сможет. Хотя в случае стека как раз сможет: где-то около нуля.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Link to comment
Share on other sites

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

Так я же говорю...

Вы не говорите, Вы покажите весь код. Иначе получается разговор ни о чем (два пишем, три в уме).

Для Вашей задачи, как я понимаю, нужно одно прерывание, задаваемое системным таймером и формирующее несколько тиков в секунду. Все остальное Вы преспокойно выполните в основном цикле, опираясь на интервал этого таймера (и кнопку опросите, и цвета подготовите, и их же отправите в светодиоды).

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...