Jump to content

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


dubrovkin
 Share

Recommended Posts

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

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

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

Link to comment
Share on other sites

Реклама: ООО ТД Промэлектроника, ИНН: 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. Что я упустил?

Link to comment
Share on other sites

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

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

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

Подробнее

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

Posted (edited)
17 часов назад, dubrovkin сказал:

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

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

 

Цикл 4 такта:

Generator_4.hex

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

Generator_8.hex

Edited by Просто зашёл
Link to comment
Share on other sites

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

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

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

Реклама: АО КОМПЭЛ, ИНН: 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 не выдавала сигнал.

Link to comment
Share on other sites

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

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

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

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

почему я передавал 0x02, а у меня PB1 не выдавала сигнал.

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

Link to comment
Share on other sites

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

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

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

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

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

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

Link to comment
Share on other sites

47 минут назад, dubrovkin сказал:
.data

.section .text
.org 0x0000

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

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

Link to comment
Share on other sites

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

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

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

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

Link to comment
Share on other sites

Posted (edited)
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:

Edited by Просто зашёл
Link to comment
Share on other sites

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

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

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

Link to comment
Share on other sites

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

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

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

Link to comment
Share on other sites

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

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

Link to comment
Share on other sites

Posted (edited)
45 минут назад, dubrovkin сказал:

Error: unknown pseudo-op: `.cseg'

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

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

333.jpg.5974495709e26c4c6830bafc2af7cfb0.jpg

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

Posted (edited)
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

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

Edited by dubrovkin
Link to comment
Share on other sites

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

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

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

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

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

Link to comment
Share on other sites

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

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

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

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

Link to comment
Share on other sites

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

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

 

Link to comment
Share on other sites

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>

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

Link to comment
Share on other sites

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

Вот вывод:

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

Link to comment
Share on other sites

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

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

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

Link to comment
Share on other sites

UPDATE 13.08.2013

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

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

 

Link to comment
Share on other sites

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

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

 

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

Edited by dubrovkin
Link to comment
Share on other sites

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

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

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

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