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

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


dubrovkin

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

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

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

Да, это я знаю. Просто слышал что какие-то WS28xx не запоминают состояние. И там нужно выставлять биты постоянно. На WS2818B я проверил и он запоминает состояние и цвет продолжает гореть. Отсюда были мысли, а может ли получиться так, чтобы зажесь первый (3 байта), ждать секунду, затем второй (3 байта), ждать секунду и затем третий (3 байта). Но выходит, ждать можно не дольше времени сброса. Значит, нужно взять правило: всегда посылать всю последовательность на все светодиоды (если что-то нужно изменить, слать заново).

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

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

Так, провёл ряд тестов. Код остался тот же. LFuse сейчас такой 0b1101010. То есть, включил делитель на 8. В результате, всё так же плохо. Осциллограф выдаёт что +Width=~420ns, а -Width=~2.4us.

А вот далее я вообще запутался. Я же направление, сигнал и инверсию делаю по следующей константе 0x01. То есть, первый бит (по индексации он будет 0). Я решил поменять пин с PB0 (ножка 5) на PB1 (ножка 6). Пишу:

main:
	cli
	
	in R16,DDRB
	in R17,PORTB
	
	sbr R16,0x02
	cbr R17,0x02
	
	out DDRB,R16
	out PORTB,R17
	
	ldi R18,0x02

loop:
	eor R17,R18
	out PORTB,R17	
	rjmp loop

Подключаю осциллограф к пину PB1 (ножка 6). И...сигнала нет. Подключаю к пину PB0 (ножка 5) и сигнал есть. Осциллограф выдаёт что +Width=~18us, а -Width=~19us. Уже более менее что-то похоже на одинаковый сигнал, но. 1/9600000*1000*1000*4*8=3.3us, а тут аж целых 18us. И, почему сигнал идёт с PB0 (ножка 5), если я выставляю константу 0x02, которая в бинарном 0b00000010, что означает что я включаю выход на PB1 (ножка 6), и именно там выставляю и инвентирую сигнал LOW/HIGH. Что я упустил?

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

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

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

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

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

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

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

Таким образом, у меня должно уходить 4 тика на цикл. Ожидаю, что из 9.6 МГц,

Да, но только в том случае, если Вы будете переключения состояний на выводе производить с помощью регистра Pin, а не регистра Port (тини13 это позволяет. Но такое переключение работает не на всех МК – нужно смотреть даташит). Так как к циклу для его повторения необходимо прибавить безусловный переход, а он выполняется за два такта. Таким образом, два такта – инвертирование уровня и два такта – безусловный переход. А вот если уровни устанавливать регистром Port, то выйдет уже не четыре, а шесть тактов. К тому же низкий уровень в таком варианте будет затянут и потребует для выравнивания уровней (если необходимо) поместить два NOP между переключением логического уровня. Таким образом, с учётом выравнивания получим уже 8 тактов на цикл.

 

Цикл 4 такта:

Generator_4.hex

Цикл 8 тактов:

Generator_8.hex

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

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

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

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

2 часа назад, Просто зашёл сказал:

Да, но только в том случае, если Вы будете переключения состояний на выводе производить с помощью регистра Pin, а не регистра Port (тини13 это позволяет. Но такое переключение работает не на всех МК – нужно смотреть даташит). Так как к циклу для его повторения необходимо прибавить безусловный переход, а он выполняется за два такта. Таким образом, два такта – инвертирование уровня и два такта – безусловный переход. А вот если уровни устанавливать регистром Port, то выйдет уже не четыре, а шесть тактов. К тому же низкий уровень в таком варианте будет затянут и потребует для выравнивания уровней (если необходимо) поместить два NOP между переключением логического уровня. Таким образом, с учётом выравнивания получим уже 8 тактов на цикл.

 

Цикл 4 такта:

Generator_4.hex 124 Б · 3 загрузки

Цикл 8 тактов:

Generator_8.hex 136 Б · 2 загрузки

Попробовал Ваши два файла: Generator_4.hex и Generator_8.hex. Что с одним, что с другим - результат один и тот же. Показывает HIGH в течение около 400 нс и LOW в течение около 400 нс. Правда, иногда сигнал какой-то странный показывает. Но, может быть это какие-то проблемы синхронизации в осциллографе. Так вот, я тогда не понял, а почему временные интервалы одинаковые между этими двумя прошивками?

Вот смотрю сейчас я прошивку Generator_4.hex. Там вообще регистр какой-то SPL используется. Не очень понимаю зачем там стек?! Вроде push/pop не используем, всякие там call и прочее. Почему в PORTB загружается 0x1E (0b00011110), то есть, почему PB1, PB2, PB3 и PB4 стоит 1? Это прям важно? Ну и далее, я просто понимаю что используется инверсия напрямую в регистре ввода/вывода PINB, которая занимает 2 такта и инвентирует всего один бит по индексу.

Смотрю прошивку Generator_8.hex. Теперь понятно почему интервалы одинаковые.

В общем оба варианта работают. Остаются лишь вопросы по поводу 0x1E и по поводу того, почему я передавал 0x02, а у меня PB1 не выдавала сигнал.

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

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

Не тот файл *.hex записывал в контроллер?

Тот. Там у меня разложено всё по структуре и bat-файл берёт то, что нужно. Причём я это проверял 2 раза.

А вот интересно. Смотрю я файл Generator_8.hex:

Disassembly of section .sec1:

00000000 <.sec1>:
   0:   09 c0           rjmp    .+18            ;  0x14
   2:   18 95           reti
   4:   18 95           reti
   6:   18 95           reti
   8:   18 95           reti
   a:   18 95           reti
   c:   18 95           reti
   e:   18 95           reti
  10:   18 95           reti
  12:   18 95           reti
  14:   0f e9           ldi     r16, 0x9F       ; 159
  16:   0d bf           out     0x3d, r16       ; 61
  18:   01 e0           ldi     r16, 0x01       ; 1
  1a:   07 bb           out     0x17, r16       ; 23
  1c:   0e e1           ldi     r16, 0x1E       ; 30
  1e:   08 bb           out     0x18, r16       ; 24
  20:   c0 9a           sbi     0x18, 0 ; 24
  22:   00 00           nop
  24:   00 00           nop
  26:   c0 98           cbi     0x18, 0 ; 24
  28:   fb cf           rjmp    .-10            ;  0x20

Вижу что где используется команда rjmp, там указано смещение. А вот мой файл:


.equ PINB,0x16
.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,PINB
	
	sbr R16,0x02
	cbr R17,0x02
	
	out DDRB,R16
	out PINB,R17
	
	ldi R18,0x02

mainLoop:
	eor R17,R18																	; 1 cycle
	out PINB,R17																; 1 cycle
	
	rjmp mainLoop																; 2 cycles

Делаю сборку:

avr-as -mmcu=attiny13a -o Temp\00.o Source\00.asm

Далее превращаю в hex:

avr-objcopy -O ihex Temp\00.o Bin\00.hex

И смотрю что там внутри:

avr-objdump -m avr -D Bin\00.hex

А там:

Disassembly of section .sec1:

00000000 <.sec1>:
   0:   00 c0           rjmp    .+0             ;  0x2
   2:   00 c0           rjmp    .+0             ;  0x4
   4:   00 c0           rjmp    .+0             ;  0x6
   6:   00 c0           rjmp    .+0             ;  0x8
   8:   00 c0           rjmp    .+0             ;  0xa
   a:   00 c0           rjmp    .+0             ;  0xc
   c:   00 c0           rjmp    .+0             ;  0xe
   e:   00 c0           rjmp    .+0             ;  0x10
  10:   00 c0           rjmp    .+0             ;  0x12
  12:   00 c0           rjmp    .+0             ;  0x14
  14:   f8 94           cli
  16:   07 b3           in      r16, 0x17       ; 23
  18:   16 b3           in      r17, 0x16       ; 22
  1a:   02 60           ori     r16, 0x02       ; 2
  1c:   1d 7f           andi    r17, 0xFD       ; 253
  1e:   07 bb           out     0x17, r16       ; 23
  20:   16 bb           out     0x16, r17       ; 22
  22:   22 e0           ldi     r18, 0x02       ; 2
  24:   12 27           eor     r17, r18
  26:   16 bb           out     0x16, r17       ; 22
  28:   00 c0           rjmp    .+0             ;  0x2a

То есть, все мои прыжки на месте. Это почему так?

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

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

Вообще-то это должна быть секция .code

или .cseg как там у тебя в компиляторе

Должна-то может и должна. Но там везде 0 стоит. даже если бы считать что он должен на начало main: перейти, то вот мой цикл не должен переходить на main:, а на loop: должен.

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

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

Что с одним, что с другим - результат один и тот же.

По идее должны быть немного разными. Но в железе сам не проверял. Может компилятор чего-то сам подставил, не знаю… надо поразмышлять.

Посмотрел внимательней и понял, что балбес, слона-то и не заметил. :) Всё верно, оба кода хоть и немного разные, но интервалы то уровней выходят одинаковыми (в районе 0,4 мкс). В первом варианте: 0,208 - переключение уровня и 0,208 - безусловный переход = 0,4 мкс. логический уровень. Так же и во втором варианте: 0,208 - переключение уровня + два NOP (по 0,104 мкс.) = 0,4 мкс. логический уровень. Затем опять 0,208 - переключение уровня + 0,208 - безусловный переход = 0,4 мкс. логический уровень.

Так что всё верно - период в обоих случаях одинаков. 

Цитата

Почему в PORTB загружается 0x1E (0b00011110), то есть, почему PB1, PB2, PB3 и PB4 стоит 1?

Что касается незадействованных выводов кроме РВ0, то они подтянуты внутренними резисторами к питанию (привычка такая). :unknw:

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

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

Но там везде 0 стоит

Потому, что компилятор воспринимает метки не как метки в коде, а как непойми, что. У тебя указано, что это не секция кода, а какая-то .section .text 

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

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

Потому, что компилятор воспринимает метки не как метки в коде, а как непойми, что. У тебя указано, что это не секция кода, а какая-то .section .text 

Так я не сам придумал, нашёл где-то такое указание. Я использую avr-as (качал с официального сайта Microchip). Как тогда мне секцию кода там обозвать?

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

  А если вообще убрать  упоминание о секции, может по умолчанию будет код? Может .cseg  маленькими буквами.

Или тогда читать доку на компилятор

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

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

Error: unknown pseudo-op: `.cseg'

А как выглядит в полном тексте?

В доке указана именно эта директива.

333.jpg.5974495709e26c4c6830bafc2af7cfb0.jpg

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

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

  А если вообще убрать  упоминание о секции, может по умолчанию будет код? Может .cseg  маленькими буквами.

И маленькими так же. Как это по умолчанию будет код, если я выше поставил секцию данных. Да, данных там нет, но когда они будут, всё равно ставить нужно будет секцию кода.

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

А как выглядит в полном тексте?

В полном тексте выглядит вот так:

Source\00.asm: Assembler messages:
Source\00.asm:9: Error: unknown pseudo-op: `.cseg'

А вообще. Ну да, я видел что у Microchip там есть документация на какой-то ассемблер версии 2. Мне даже понравилось что там комментарии можно в C-стиле указывать. Вот только я не понял как этот ассемблер скачать. А вот скачивание комплекта GCC где и C и C++ и ассемблер...это легко с их сайта получилось. Ну и я видел статью, про сравнение ассемблеров. Вот она. Как раз эти .cseg там для других ассемблеров. А для avr-as (что я использую из комплекта GCC) написано как раз:

.section .text

Вот и не понимаю, что за ерунда. Если это секция кода, почему тогда прыжки такие.

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

А он точно подходит тебе, а то в интернете такое пишут, правда для линукс, но все же

Да, ассемблер работает — ассемблирует. Но основное его назначение — не ассемблирование исходных файлов, набранных программистом, а ассемблирование ассемблерных файлов, созданных С-ишным компилятором с ключом -S.

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

Мне кажется, что намного чаще возникает потребность написать проект под ассемблером. И как раз на это avr-as не заточен!

https://zhevak.wordpress.com/2013/08/12/как-приручить-avr-gnu-assembler/

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

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

А он точно подходит тебе

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

Да и не верю я, что во тесть ассемблер и он чем-то не подходит. Да, я допускаю что разные ассемблеры могут с разной скорость исполяться. Но я за скоростью не спешу. А тут вообще гибко получается. Не понятно только почему такие переходып олучаются при rjmp.

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

Вот ты опять вершки прочёл, а до смысла не дошёл.

Ты компилишь объектный файл .o, а avr as  компилит файл .S, внимательно прочти статью, особенно в конце приписку, и как вызов происходит при компиляции

 

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

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

Вот ты опять вершки прочёл, а до смысла не дошёл.

Ты компилишь объектный файл .o, а avr as  компилит файл .S, внимательно прочти статью, особенно в конце приписку, и как вызов происходит при компиляции

 

А какая разница как называется файл и какое он имеет расширение? По крайней мере в данном случае. Это всего лишь текстовый файл. И тут не нужно каких-то сторонних механизмов, чтобы кто-то там где-то смог его увидеть и подхватить. Так же как и какая разница как его назвать, там elf, я o. Никакой разницы. Ну, это я умом понимаю. Но всё же, сделал. Переименовал в S. И сделал:

avr-as -mmcu=attiny13a 00.S -o 00.elf
avr-objdump -D 00.elf > 00.lst

Вот вывод:

00.elf:     file format elf32-avr


Disassembly of section .text:

00000000 <vectors>:
   0:	00 c0       	rjmp	.+0      	; 0x2 <vectors+0x2>
   2:	00 c0       	rjmp	.+0      	; 0x4 <vectors+0x4>
   4:	00 c0       	rjmp	.+0      	; 0x6 <vectors+0x6>
   6:	00 c0       	rjmp	.+0      	; 0x8 <vectors+0x8>
   8:	00 c0       	rjmp	.+0      	; 0xa <vectors+0xa>
   a:	00 c0       	rjmp	.+0      	; 0xc <vectors+0xc>
   c:	00 c0       	rjmp	.+0      	; 0xe <vectors+0xe>
   e:	00 c0       	rjmp	.+0      	; 0x10 <vectors+0x10>
  10:	00 c0       	rjmp	.+0      	; 0x12 <vectors+0x12>
  12:	00 c0       	rjmp	.+0      	; 0x14 <main>

00000014 <main>:
  14:	f8 94       	cli
  16:	07 b3       	in	r16, 0x17	; 23
  18:	16 b3       	in	r17, 0x16	; 22
  1a:	02 60       	ori	r16, 0x02	; 2
  1c:	1d 7f       	andi	r17, 0xFD	; 253
  1e:	07 bb       	out	0x17, r16	; 23
  20:	16 bb       	out	0x16, r17	; 22
  22:	22 e0       	ldi	r18, 0x02	; 2

00000024 <mainLoop>:
  24:	12 27       	eor	r17, r18
  26:	16 bb       	out	0x16, r17	; 22
  28:	00 c0       	rjmp	.+0      	; 0x2a <mainLoop+0x6>

Как видно, ничего не изменилось. Или Вы про что-то другое? Тогда скажите конкретно про что, пожалуйста.

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

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

Вот вывод:

Я наверное чего-то не понимаю... Почему дизассемблер? А нет листинга компиляции от ассемблера?

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

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

Только что, ДядяВован сказал:

Я наверное чего-то не понимаю... Почему дизассемблер? А нет листинга компиляции от ассемблера?

А, ну я вывел так, как в статье показывалось. А от ассемблера как вывести?

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

UPDATE 13.08.2013

Не! Что-то все-таки тут не так! Стоит только чуть-чуть дописать функциональности (другими словами — еще команд) в проект, получаешь какую-то неработающую фигню. Нужно еще разбираться, оказалось не все так просто.

В частности я про это, а также про последовательность указания файлов в строке, возможно это не имеет значения

 

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

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

В частности я про это

 

Это я читал, но что он там имел в виду - я не увидел. Ну не верю я, что Microchip не рабочий продукт выложили. Решение, наверняка на поверхности. Как бы, инструмент поставил...но вот что-то же не так указано. А что...

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

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

А от ассемблера как вывести?

Конкретно от этого я не знаю.
Обычно так, файл asm обрабатывается компилятором, в результате два файла: hex и lst. Вот этот листинг и показывает как всё там "сложилось".

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

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

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

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

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

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

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

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

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

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

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

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

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