Jump to content

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


dubrovkin
 Share

Recommended Posts

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

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

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

Link to comment
Share on other sites

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

inline

Да, не заметил его. В любом случае остаются if-else + бестолковая смена значения переменной.

Link to comment
Share on other sites

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

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

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

Всем кто сделает заказ в сентябре, начислим 3000 баллов на аккаунт. 1 балл = 1 рублю!

Подробнее

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

  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

 

Link to comment
Share on other sites

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

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

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

Литиевые ХИТы EVE Energy на складе в Компэл

На склад КОМПЭЛ поступил ассортимент литиевых химических источников тока EVE. На данный момент доступны батарейки серии ER типоразмеров 1/2АА, С, D и аккумуляторы серий ICR, INR с типоразмером 18650. 

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

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

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

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

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

 

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

Link to comment
Share on other sites

Вот когда то давно на 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

Link to comment
Share on other sites

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

Всё, я сдаюсь

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

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

Link to comment
Share on other sites

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

flash.asm spi.asm

Link to comment
Share on other sites

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Edited by dubrovkin
Link to comment
Share on other sites

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, иначе он подумает что я отправил команду сброса. В общем, я правильно понял принцип того, как с ним можно работать?

Link to comment
Share on other sites

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

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

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

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

Link to comment
Share on other sites

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

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

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

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

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

 

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

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

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

Link to comment
Share on other sites

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

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

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

Link to comment
Share on other sites

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

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

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

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

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

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

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

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

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

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

Link to comment
Share on other sites

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

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

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

 

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

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

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

Link to comment
Share on other sites

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

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

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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.
Link to comment
Share on other sites

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

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

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

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

Link to comment
Share on other sites

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

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

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

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

Link to comment
Share on other sites

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

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

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

Link to comment
Share on other sites

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

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

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

Link to comment
Share on other sites

Posted (edited)

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

Edited by IMXO
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...