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

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


dubrovkin

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

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

придётся доставать секретное оружие

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

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

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

Так это...да ну, правда?! Хы. Прикольно. Такая мелкая фигнюшка, а уже своя микросхема. Для чистоты эксперимента, остаётся старый добрый 5 мм светодиод с 4 ножками (общим анодом) воткнуть, там-то нет микрухи? А так, если что, я тестирую всё на 0603 SMD.

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

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

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

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

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

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

17 часов назад, IMXO сказал:

это вы привели свой код в соответствие с ДШ,

Как выяснил @Генадий  Дубровкин даже вместо бита кракозябры шлет , можно расходится )

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

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

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

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

Это какие ещё я кракозябры шлю? Без понятия что такое 7805. Не самодельный.

Так, ну что, приступим?

13 часов назад, Геннадий сказал:

Это такой троллинг? Спрашивать про баги программы, а подсовывать для нас накиданную лабуду? В чем наглядность? Неужели Вы думаете, что парни в Ассме не разберутся? Петляете как заяц!

Ваша переписанная лабуда работает так:

555.jpg.f786f857b0747b1885d67016464bfc6b.jpg

Очень похоже на примеры из даташита? Сигнал RET Вы вообще не формируете?

А до Вас никак дойти не может что и одна и другая программа работают одинаково?! Какая Вам к чёрту разница где там что на ассемблере лежит. Дали код, есть что сказать, здорово, нет...мимо. Логично?! Логично.

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

Ну и главное. Картинку Вы привели. А теперь, будьте добры, скажите-ка нам пожалуйста, что же там не так? Я вот смотрю, деление 500 нс. Смотрю, HIGH посылаются примерно как нужно. Смотрю, между HIGH проходит около 7 мкс. Как думаете, товарищ, это больше чем время для сброса? Так что не так??? Почему лабуда? Вечер не удался?!

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

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

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

Вот и Ваш подход такой же. Говорить что-то по аналогам нет смысла, так что МИМО...

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

Вы придуриваетесь? Моя цель была писать на C/C++ с использованием ассемблерных вставок. Легче было начать с ассемблера, потому что я, на тот момент, не знал как использовать ассемблерные вставки (слишком там синтаксис не понятный, всякие двоеточия, входные, выходные параметры и ещё там какие-то). Но, когда я столкнулся с неправильным поведением, я решил реализовать всё-таки на том, на чём я первоначально хотел. Заливаю и тестирую я именно C код, а не ассемблерный. Поэтому то, что Вы прицепились к тому, что я залил не ассемблерный, меня удивляет. Словно Вы лично знаете только ассемблер и помочь не можете в С. Но интересно даже не то, а то, нахрена Вы свою картинку вставили, если по ней всё нормально. Для чего она? Где там ошибка? В какой момент времени там не то посылается? Что не по datasheet'у? Сами привели, сами и опозорились!

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

Спойлер

.equ R,50
.equ G,50
.equ B,50

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

.equ SPL,0x3D

.equ RC1,20																		; Регистр счётчика 1 (R20)
.equ RC2,21																		; Регистр счётчика 2 (R21)
.equ RC3,22																		; Регистр счётчика 3 (R22)
.equ RRed,23																	; Красный регистр (R23)
.equ RGreen,24																	; Зелёный регистр (R24)
.equ RBlue,25																	; Синий регистр (R25)
.equ RSend,26																	; Регистр отправляемых битов (R26)
.equ RByte,27																	; Счётчик байтов (R27)
.equ RBit,28																	; Счётчик битов (R28)
.equ RBitFlag,29																; Флаг отправляемого бита (R29)

.section .text
.org 0x00

vectors:
	rjmp main																	; RESET
	reti																		; INT0
	reti																		; PCINT0
	reti																		; TIM0_OVF
	reti																		; EE_RDY
	reti																		; ANA_COMP
	reti																		; TIM0_COMPA
	reti																		; TIM0_COMPB
	reti																		; WDT
	reti																		; ADC

main:
	cli
	
	; Стек
	ldi R16,0x9F
	out SPL,R16
	
	; Направление пинов
	ldi R16,0b00000111
	out DDRB,R16
	ldi R16,0b00001000
	out PORTB,R16

loop:
	; Красный
	rcall delay
	ldi RRed,R
	ldi RGreen,0
	ldi RBlue,0
	rcall send
	
	; Оранжевый
	rcall delay
	ldi RRed,R
	ldi RGreen,G/2
	ldi RBlue,0
	rcall send
	
	; Жёлтый
	rcall delay
	ldi RRed,R
	ldi RGreen,G
	ldi RBlue,0
	rcall send
	
	; Зелёный
	rcall delay
	ldi RRed,0
	ldi RGreen,G
	ldi RBlue,0
	rcall send
	
	; Голубой
	rcall delay
	ldi RRed,0
	ldi RGreen,G
	ldi RBlue,B
	rcall send
	
	; Синий
	rcall delay
	ldi RRed,0
	ldi RGreen,0
	ldi RBlue,B
	rcall send
	
	; Фиолетовый
	rcall delay
	ldi RRed,R
	ldi RGreen,0
	ldi RBlue,B
	rcall send
	
	; Белый
	rcall delay
	ldi RRed,R
	ldi RGreen,G
	ldi RBlue,B
	rcall send
	
	; Чёрный
	rcall delay
	ldi RRed,0
	ldi RGreen,0
	ldi RBlue,0
	rcall send
	
	rjmp loop

; Функция отправки цвета
send:
	ldi RByte,0

byteLoop:
	cpi RByte,0
	breq sendRedByte
	
	cpi RByte,1
	breq sendGreenByte
	
	cpi RByte,2
	breq sendBlueByte
	
	cpi RByte,3
	breq endByteLoop

sendRedByte:
	mov RSend,RRed
	rjmp sendByte

sendGreenByte:
	mov RSend,RGreen
	rjmp sendByte

sendBlueByte:
	mov RSend,RBlue

sendByte:
	ldi RBit,0b10000000

bitLoop:
	cpi RBit,0
	breq continueByteLoop
	
	mov RBitFlag,RSend
	and RBitFlag,RBit
	cpi RBitFlag,0
	brne sendBitValue1
	
	; Значение бита 0
	ldi R16,0b00001100
	out PORTB,R16
	nop
	ldi R16,0b00001000
	out PORTB,R16
	rjmp continueBitLoop

sendBitValue1:
	; Значение бита 1
	ldi R16,0b00001100
	out PORTB,R16
	nop
	nop
	nop
	nop
	ldi R16,0b00001000
	out PORTB,R16

continueBitLoop:
	lsr RBit
	rjmp bitLoop

continueByteLoop:
	inc RByte
	rjmp byteLoop

endByteLoop:
	ret

; Функция задержки
delay:
	ldi RC1,0
	
loop1Delay:
	cpi RC1,255
	breq endDelay
	
	ldi RC2,0
	
loop2Delay:
	cpi RC2,255
	breq tick1Loop
	
	ldi RC3,0
	
loop3Delay:
	cpi RC3,16
	breq tick2Loop
	
	inc RC3
	rjmp loop3Delay
	
tick2Loop:
	inc RC2
	rjmp loop2Delay
	
tick1Loop:
	inc RC1
	rjmp loop1Delay
	
endDelay:
	ret

 

 

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

Всем привет!

В общем потыкался ещё. Первым делом, взял Arduino UNO R3 и снова, используя библиотеку microLED (там ещё нужно поставить FastLED, а то не скомпилируется), попробовал все цвета радуги + белый и чёрный. Работает нормально. Нашёл как, из под этой же Arduino, скомпилировать пример для ATtiny13 (к сожалению там выбрать нельзя ATtiny13A), а то библиотека microLED хвастается что и под ATtiny умеет. Там, правда, есть нюанс, что среди микросхем, выбрать можно WS2818 (среди прочих), вот только там нет WS2818B (а у меня именно она). Уж не знаю на сколько это важно, но именно сам Arduino Uno R3 нормально работает при выборе WS1818. Так вот, прошил ATtiny13A и ничего не работает. Исходный код открытый, поковырялся.

Так вот, первое про что хочу спросить. Я покупал WS2818B через AliExpress. На сайте продавца уже была документация по микросхеме. И там приводилась такая вот таблица:

image.png.70c274f786f96f2b90f84cbadf101768.png

На самой микросхеме я увидел название фирмы, которая её разработала. Нашёл их сайт в Интернете, но там что-то не скачать Datasheet'ов (в общем сайт у них не доделан). Однако в Интернете я нашёл pdf документ, где внутри него указана именно эта фирма. Да, можно было бы засомневаться что это за документ, вот только найдя эту микросхему на сайте ЧИП и ДИМ, я увидел что там есть ссылка на Datasheet. А он как раз такой же, как и тот, что я нашёл ранее (только язык другой). В общем, по этому документу имеем вот такие тайминги:

image.png.e3cdd3f0bf1811f69cba93552006634e.png

Как видно, всё же они разные. Когда я писал код, я полагался не на то, что было у продавца, а на то, что было якобы у производителя. Так вот, так-то у меня всё нормально работало, пока на микросхему не передаются одинаковые байты для всех трёх каналов. Пошёл изучать код от microLED. Начну с части для ATtiny. В коде видим:

image.png.256a3a20ae0f6e3ce14230b87456671c.png

Свёрнутая мной часть, она только для задержки. И, по содержащемуся там коду, я сделал вывод, что этот код не предназначен для связки ATtiny13A на 9.6 МГц и микросхемы WS2818/WS2818B (там тупо идёт убавление значения и сравнение, но инициализации не было). Так что не удивительно что у меня пример не заработал когда я прошил ATtiny13A кодом, использующим их библиотеку.

Теперь посмотрим на то, как дело обстоит в самом ATmega328P на 16 МГц. Ведь Arduino Uno R3 использует именно этот микроконтроллер и именно эту частоту. Вот код:

image.png.9cd765a48f4b7e533124a6a47b019a4b.png

Смотрите. Частота микроконтроллера 16 МГц. А это значит, что один тик проходит за 62.5 наносекунд. По коду мы видим, что после того, как устанавливается высокий уровень сигнала (HIGH), до установки низкого уровня сигнала (LOW), проходит 3 тика. Это в случае если нужно передать бит 0. А если нужно передать бит 1, то от HIGH до LOW проходит 15 тиков. Так вот, получается, что, чтобы передать 0, выжидается 187.5 наносекунд, а чтобы передать 1 - 937.5 наносекунд. Видим, что 187.5 наносекунд не укладываются по Datasheet'у ни от продавца, ни от якобы производителя. Но, при этом ведь работает. Вопрос: где взять правильный Datasheet? Ну или, а нафига тогда эти интервалы от, до? Могли бы уже тогда написать, для 0 пофиг, а для 1 не короче такой-то длины. Ну или как там всё это работает? Я просто вижу в документе интервалы и по ним делаю. А тут есть библиотека, и она делает по другим интервалам. Где правда?

В общем, я взял ATmega328P. Подключил к нему кварцевый резонатор на 16 МГц (ну и всё что положено по Dataheet'у). Взял свой код. Подправил так, чтобы интервалы были ровно такие же, только с учётом того, что уже не 9.6 МГц, а 16 МГц. Запустил и всё работает. Как бы, по таймингам мне и ATtiny13A хватало (ну, по моим расчётам). Это что же получается, просто стабильности нет? Если бы я взял активный кварцевый резонатор на 9.6 МГц, то у меня и на ATtiny13A всё заработало?

Ну, и в общем, меня пугают интервалы. Как правильно-то?

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

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

Ну или, а нафига тогда эти интервалы от, до? Могли бы уже тогда написать, для 0 пофиг, а для 1 не короче такой-то длины.

Есть такая штука как длительность фронта/спада и чем длиннее линия тем эта длительность будет больше и короткий импульс может вообще не дойти до приемника и бит будет пропущен.

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

Как правильно-то?

правильно в ДШ.

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

Я это понимаю. Я не понимаю как можно что-то делать, если нет вводных. Где их взять?

Это что же, кто делал microLED, сделали её не правильно?

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

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

По коду мы видим, что после того, как устанавливается высокий уровень сигнала (HIGH), до установки низкого уровня сигнала (LOW), проходит 3 тика.

где Ты насчитал 3 тика? 

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

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

...а нафига тогда эти интервалы от, до? Могли бы уже тогда написать, для 0 пофиг, а для 1 не короче такой-то длины. Ну или как там всё это работает? Я просто вижу в документе интервалы и по ним делаю. А тут есть библиотека, и она делает по другим интервалам. Где правда?

Рекомендуемая скорость передачи 800Kbps, период одного бита 1,25 uS. Возьмите за ориентир время срабатывания регистра-защелки от начала положительного импульса 500nS (около половины периода, но может отличаться плюс/минус). Тогда во время передачи 0 Вы должны опустить данные в 0 раньше, чем сработает защелка (пример D-триггер). С учетом всех технологических задержек в полупроводниках, длительность положительного импульса, при передаче 0, выбирайте 500/2 = 250 nS (примерно), а при передаче 1 500+(500/2)=750 nS (опять примерно), чтобы защелка зафиксировала 1. Остальная часть периода передачи должна быть в 0. Старайтесь придерживаться длительности передачи одного бита в разумных рамках (около 1,25 uS весь период передачи) и у Вас все получится.

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

В 16.06.2023 в 10:03, dubrovkin сказал:

между HIGH проходит около 7 мкс

Если верить даташиту, то это время не должно превышать 1.6 мкс. С другой стороны, что произойдёт если оно будет в пределах 1.6 - 280 мкс, в даташите не описано.

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

Ребят, всё про WS2818B. Я вообще в электронике не шарю. Поэтому сразу говорю - никакой не радиолюбитель, не начинающий - вообще никто! Вот картинка из Datasheet'а:

image.png.785a3f58e3dbd5a6727e1032419a772f.png

Зачем здесь, из вывода сигнала от одной микросхемы до входа сигнала в другую, идёт резистор R3 и резистор R2?

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

Ну и? У меня логика простая. Стоят два подряд резистора. Если два подряд резистора идут, то между ними будет падение напряжения. Но, никто между ними сигнал не снимает. Тогда вопрос: зачем там два подряд? Почему не один?

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

@dubrovkin между ними может быть до 5 метров кабеля. Без резисторов будет повышенный звон. Если чипы рядом, можете вообще не ставить резисторы.

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

Честно говоря я не знаю что за звон. В общем, китайцы это написали не для того, чтобы побольше резисторов продать, видимо. А что если между ними 15-25 см?

 

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

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

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

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

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

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

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

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

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

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

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

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