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

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


dubrovkin

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

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

с вызовом функций будет отжирать дофига времени:

inline предполагает вставку кода функции компилятором на месте вызова или нет?

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

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

  1. Отключаю глобальные прерывания.
  2. Запоминаю содержимое порта DDRB.
  3. Запоминаю содержимое порта PORTB.
  4. Корректирую регистр для порта DDRB так, чтобы он делал пин PB0 (ножку 5) на выход.
  5. Корректирую регистр для порта PORTB так, чтобы на пине PB0 (ножка 5) был низкий уровень сигнала.
  6. Записываю изменения в порт DDRB.
  7. Записываю изменения в порт PORTB.
  8. Запоминаю значение для инверсии.
  9. Инвентирую значение для пина PBO (ножка 5).
  10. Отправляю в порт PORTB новое значение.
  11. Повторяю всё с шага 9.

Таким образом, у меня должно уходить 4 тика на цикл. Ожидаю, что из 9.6 МГц, у меня чередование низкого и высокого уровня на выходе пина PB0 (ножка 5) будет каждые 416.6(6) наносекунд (1/9600000*1000*1000*1000*4). Запускаю и вижу, что большую часть времени у меня сигнал выского уровня. Примерно так:

Высокий уровень сигнала: около 50 микросекунд.

Низкий уровень сигнала: около 400 наносекунд (но там показывает то 200, то 400).

Всё, я сдаюсь, не знаю где ошибка. Если кому не сложно, ткните. Вот код (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

 

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

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

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

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

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

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

Подключите к выв. Reset (PB5) внешний резистор подтяжки к Vcc.

Ну я пробовал и с висящей в воздухе ножкой номер 1 и с подключением её к общему питанию через 1 кОм резистор. Разницы никакой.

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

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

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

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

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

Вы же пишете на Ассме. Значит контролируете все события. Совсем не обязательно, читать-модифицировать-записывать. Берите сразу константу:

1 час назад, dubrovkin сказал:
.equ DDRB,0x17
.equ PORTB,0x18

.data

.section .text
.org 0x0000

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

main:
	cli
	ldi	r16,0b00000001
    out	DDRB,r16  
	ldi	r16,0b00111111
    out PORTB,R16
	clr	r17
	ldi R18,0x01

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

 

Не обещаю, что поможет с Вашим глюком, но "портянка" будет меньше.

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

Вот когда то давно на tiny2313 - 20  MHz тупо формировали импульсы противофазные 440kHz ( это длитетедьность 2272nс) c  Dead time получилось впритык

вот кусок программы

INT1_time:
    cbi    PortB,3        ; "выкл." импульс 1
    nop
    nop
    sbi    PortB,4        ; "вкл." импульс 2
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    cbi    PortB,4        ; "выкл." импульс 2
    nop
    nop
    sbi    PortB,3        ; "вкл." импульс 1
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    reti

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

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

Всё, я сдаюсь

Не надо сдаваться))

Включите фьюзами делитель на 8, добавьте nop'ов. Добейтесь меандра на осциллографе, потом будем дальше думать.

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

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

На Тини2313 есть модуль полуфабрикат USI, с его помощью как-то делал запись на флешку, что интересного так это при частоте генератора 8МГц SPI работала на 4МГц, с его помощью также можно лентой управлять, тайминги должны подойти. Здесь два файла по которым можно понять как это было сделано

flash.asm spi.asm

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

52 минуты назад, donec сказал:

От чего запитано это все? Провалов по питанию нет? Помехи от подключённого программатора? Или осциллографа

Запитано от лабораторного блока питания. Выставил напряжение 5 В, а максимальный ток, то ли 200, то ли 500 мА (сейчас уже не помню). Не, там программатора нет. Микроконтроллер вставлен в макетную плату. Когда нужно прошить, я его вытаскиваю и несу в другое место. Ну и, по сути 4 ножка подключена к минусу, 8 к плюсу. Всё это напрямую, без резисторов. А вот 5 ножка подключена через резистор на 1 кОм к минусу. Как раз осциллографом цепляюсь за концы этого резистора.

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

Вы же пишете на Ассме. Значит контролируете все события. Совсем не обязательно, читать-модифицировать-записывать. Берите сразу константу:

Не обещаю, что поможет с Вашим глюком, но "портянка" будет меньше.

Ну да, это я так, как правильно сказать, в общем, "безопасно" изменяю. Но у Вас в примере так же PB0 пойдёт на выход, а все остальные на вход. И выставлено для всех (ну кроме не используемых) ножек 1 на порту PORTB. То есть, для выхода будет высокий уровень, а для входа там, я только не помню 0 или 1 тогда отвечает за подтягивающий резистор. Это намеренно там единички?

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

Не надо сдаваться))

Включите фьюзами делитель на 8, добавьте nop'ов. Добейтесь меандра на осциллографе, потом будем дальше думать.

У меня такие фьюзы: Low 0b1111010, High 0b11111111, то есть делитель я отключил. Да и сигнал не равноценный, чтобы обращать внимание на это, он просто, тупо такой:

----------------_----------------_----------------_----------------_

А должен быть хоть равномерный:

--__--__--__--__--__--__--__

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

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

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

Опять же не понимаете, что там написано и как это работает...
В 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

Судя по тому, что Вы сказали, получается что тайминги вообще можно не соблюдать (исключение только Reset). Ну, если я правильно понял. То есть, в Datasheet'е указаны интервалы для срабатывания таймера. Там написано:

T0H = 220ns-380ns
T0L = 580ns-1.6us

T1H = 580ns-1.6us
T1L = 220ns-420ns

RES = > 280us

То есть, если я захочу подать 0, я могу подать высокий уровень в течение 1 секунды. Просто когда пройдёт 220ns-380ns, он у себя там зафиксирует. Затем, даже через 2 часа, я могу подать низкий уровень и вот тут тоже можно ждать дольше 1.6us (это он просто через это время у себя там выставит). Главное тогда не перешагнуть за 280us, иначе он подумает что я отправил команду сброса. В общем, я правильно понял принцип того, как с ним можно работать?

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

Так я  и предлагаю замедлить контроллер, включить делители, потом глянуть сигнал на пине. 

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

он просто, тупо такой

Как будто что-то ресетит МК. Непонятно... WDT отключен?

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

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

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

Так я  и предлагаю замедлить контроллер, включить делители, потом глянуть сигнал на пине. 

Как будто что-то ресетит МК. Непонятно... WDT отключен?

Я только отключал делитель на 8. Другое ничего не трогал. Там, вроде 3 байта управляющие. Я вот только Low менял:

avrdude -c usbasp -p t13a -U lfuse:w:0b01111010:m

 

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

Так я  и предлагаю замедлить контроллер, включить делители, потом глянуть сигнал на пине. 

Да, я завтра так и сделаю. Включу делитель на 8.

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

Прошейте lfuse = 0x6A и посмотрите как будет работать.

Ёмкость по питанию есть на макетке в непосредственной близости от пинов 4 и 8 ?

И ещё,  попробуйте другой бит порта. Может проблемы какие с PB0...

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

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

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

Прошейте lfuse = 0x6A и посмотрите как будет работать.

Надо будет ещё посмотреть что эта константа означает)

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

Ёмкость по питанию есть на макетке в непосредственной близости от пинов 4 и 8 ?

Если речь про конденсатор, то его там нет.

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

И ещё,  попробуйте другой бит порта. Может проблемы какие с PB0...

Да, завтра всё попробую.

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

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

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

может ему нужно больше времени

Это прояснит активация делителя на 8.

 

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

что эта константа означает)

Не стал переводить в bin, взял как есть из калькулятора фьюзов. У Вас сейчас Lfuse=0x7A, значение 0x6A (01101010b) активирует бит делителя на 8.

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

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

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

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

Нет не правильно.
длительность импульса   должна быть не больше 1,6мс
длительность паузы не более времени сброса.

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

Есть у Тиньки регистр CLKPR (прескалер тактовой частоты). Так вот, деление можно изменять в нем, не балуясь с фьюзами (особенно если этот вопрос туманный).

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

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

Нет не правильно.
длительность импульса   должна быть не больше 1,6мс
длительность паузы не более времени сброса.

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

У меня логика была такая:

  • Хочу передать 0: выдаю HIGH в течение 220ns~380ns, далее LOW в течение 580ns~1.6µs, меняя потом сигнал на HIGH.
  • Хочу передать 1: выдаю HIGH в течение 580ns~1.6µs, затем меняю на LOW в течение 220ns~420ns и затем меняю на HIGH.
  • Хочу начать передачу данных с начала, передаю LOW в течение > 280µs.
Ссылка на комментарий
Поделиться на другие сайты

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

Я только отключал делитель на 8. Другое ничего не трогал. Там, вроде 3 байта управляющие. Я вот только Low менял:

avrdude -c usbasp -p t13a -U lfuse:w:0b01111010:m

Биты фьюз случаем не инверсные нужно писать?

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

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

У меня логика была такая:

Хочу передать 0: выдаю HIGH в течение 220ns~380ns, далее LOW в течение 580ns~1.6µs, меняя потом сигнал на HIGH.

после того как передали LOW сигнал на HIGH не меняется.
HIGH устанавливается только при начале передачи следующего бита или новой посылки битов.
после того как переданы все биты линия тупо держится в  LOW  > 280µs.

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

5 минут назад, IMXO сказал:

после того как передали LOW сигнал на HIGH не меняется.
HIGH устанавливается только при начале передачи следующего бита или новой посылки битов.
после того как переданы все биты линия тупо держится в  LOW  > 280µs.

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

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

28 минут назад, donec сказал:

случаем не инверсные нужно писать?

Да, активируется опция нулевым битом.
У автора Lfuse правильный:
01111010b = частота не делится на 8
01101010b = активирован делитель на 8

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

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

для зажечь/изменить_цвет  первый СД нужно передать 24бита , выдать сброс.
для зажечь/изменить_цвет второй СД нужно передать 48бит(24бита первого СД и 24бита второго СД) , выдать сброс. и тд.

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

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

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

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

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

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

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

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

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

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

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

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