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

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


dubrovkin

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

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

Такая вещь, как .-4 указывает

Но -4 должно отниматься от "PC", а в той строке PC = 2  Не понимаю :unknw:

Сейчас даже скомпилировал код от @Геннадий , думал может это я "гоню" и для ATtiny13 всё по другому.
Но нет. Вот листинг...

gavrasm Gerd's AVR assembler version 5.4 (C)2022 by DG4FAC
----------------------------------------------------------
Source file: test.asm
Hex file:    test.hex
Eeprom file: test.eep
Compiled:    08.06.2023, 10:26:51
Pass:        2
     1: .DEVICE ATtiny13
     2: main:
     3: 000000   D001  rcall  send_pack ;отправка всего пакета данных
     4: 000001   CFFE  rjmp main
     5: ;===========================================================
     6: ;пакет состоит из 3-х байт (RGB) на один светодиод
     7: send_pack:
     8: 000002   E575  ldi  r23,0x55
     9: 000003   D005  rcall  send_wire
    10: 000004   EA7A  ldi  r23,0xAA
    11: 000005   D003  rcall  send_wire
    12: 000006   EF70  ldi  r23,0xF0
    13: 000007   D001  rcall  send_wire
    14: 000008   9508  ret
    15: ;===========================================================
    16: ;отправка одного байта
    17: send_wire:
    18: 000009   E008  ldi  r16,8 ;счетчик отправленных бит
    19: cyc_send_wire:
    20: 00000A   9AC0  sbi  PORTB,0
    21: 00000B   9576  lsr  r23
    22: 00000C   F448  brcc  send_zero
    23: send_one:
    24: 00000D   0000  nop
    25: 00000E   0000  nop
    26: 00000F   0000  nop
    27: 000010   0000  nop
    28: 000011   0000  nop
    29: 000012   98C0  cbi  PORTB,0
    30: 000013   950A  dec  r16
    31: 000014   F7A9  brne  cyc_send_wire
    32: 000015   C007  rjmp  exit_send_wire
    33: send_zero:
    34: 000016   98C0  cbi  PORTB,0
    35: 000017   0000  nop
    36: 000018   0000  nop
    37: 000019   0000  nop
    38: control_full:
    39: 00001A   950A  dec  r16
    40: 00001B   F009  breq  exit_send_wire
    41: 00001C   CFED  rjmp  cyc_send_wire
    42: exit_send_wire:
    43: 00001D   9508  ret
 -> Warning 001: 2 symbol(s) defined, but not used!

Program             :       30 words.
Constants           :        0 words.
Total program memory:       30 words.
Eeprom space        :        0 bytes.
Data segment        :        0 bytes.
Compilation completed, no errors.
Compilation ended 08.06.2023, 10:26:51

 

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

Счётчик команд - это одно дело

КМК счётчик команд это главное в процессоре.

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

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

Всё проще. Вы используете одни инструменты, я другие. То есть, по сути, avr-as и gavrasm должны один и тот же hex-файл получить. Разница лишь в том, что входной ассемблерный файл может иметь разный синтаксис (например названия секций кода, данных и так далее). Можно взять один и тот же файл и получить hex-файл и посмотреть одинаковы ли там инструкции перехода. Вот мой код:


.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

Вот результат:

Disassembly of section .sec1:

00000000 <.sec1>:
   0:   09 c0           rjmp    .+18            ;  0x14
   2:   fe cf           rjmp    .-4             ;  0x0
   4:   fd cf           rjmp    .-6             ;  0x0
   6:   fc cf           rjmp    .-8             ;  0x0
   8:   fb cf           rjmp    .-10            ;  0x0
   a:   fa cf           rjmp    .-12            ;  0x0
   c:   f9 cf           rjmp    .-14            ;  0x0
   e:   f8 cf           rjmp    .-16            ;  0x0
  10:   f7 cf           rjmp    .-18            ;  0x0
  12:   f6 cf           rjmp    .-20            ;  0x0
  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:   fd cf           rjmp    .-6             ;  0x24

Я думаю, что отображаться будет по разному, но байты команд будут совпадать.

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

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

Вы используете одни инструменты, я другие

Это я понял. Просто очень удивляет, что avr-as не соответствует архитектуре контроллера. Трудно программировать, когда PC не отражает реальность.

 

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

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

Сравнительное тестирование аккумуляторов 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

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

А он мне:

undefined reference to `PC'

Так надо сделать вначале
.include tn13def.inc
Там же все регистры, порты...

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

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

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

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

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

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

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

.equ PC,???

И что я там написать должен?! В общем, это должны быть на уровне, как я пишу:

sbr R16,0x02

Я же нигде не объявляю про регистр R16. Так же и должно быть с PC.

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

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

должно быть с PC

Да, согласен, PC он и так должен знать. Видимо совсем другой ассемблер.

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

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

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

Ну, в общем они сделали вот как. Вообще такой подход, это же GCC. Считайте так, что там всё по байтам построено. Да, PC нет. А если нужно прыгнуть всё же через PC, то нужно указывать так:

vectors:
	rjmp main
	rjmp .-2
	rjmp vectors
	rjmp vectors
	rjmp vectors
	rjmp vectors
	rjmp vectors
	rjmp vectors
	rjmp vectors
	rjmp vectors

То есть, PC-1, тут записывается как .-2. Причём, если указать .-1, то он сделает так, что прыжка словно не будет. Там будет rjmp на следующую инструкцию (в общем тупо словно два nop'а).

Кстати, даже интересно. NOP же занимает так же 2 байта. Но тратит 1 такт. Если нужно ждать 2 такта, то проще не писать 2 NOP'а на 4 байта, а один RJMP .0 на 2 байта, что потратит так же 2 такта. Если нужна экономия памяти.

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

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

RJMP .0

Я в этом ассемблере вообще не алё, но не получится ли бесконечный цикл от этой конструкции?

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

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

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

RJMP .0

"rjmp PC-0"  proteus понимает. Использую для остановки программы .  

А то если программу не зациклить или не остановить, он начинает выражаться . 

Узнал с помощью "бубна" .

С проблемой переходов столкнулся, когда выяснил, что для прыжков через call надо к rjmp PC+K добавлять 1,  по сравнению с rcall .

Но это пока не точно .

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

Оставьте PC-ки для дизассемблера. Он не может восстановить метки, поэтому и указывает переходы относительно счетчика команд. А зацикливаться на представлении смещения (при переходах) вообще нет смысла. Хоть у Дубровкина дизассемблер и показывает rjmp .+18, но в коде содержится C0 09 (!!!), т.е. смещения на 9 слов (18 байт). Вот и думайте... Пользуйтесь метками и не парьтесь.:)

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

Да. По сути со многими вещами Вы мне тут помогли. Но, как не тяжело признавать ошибки, но один товарищ был прав - я действительно всё время заливал (когда именно свой код пробовал) один и тот же hex-файл (а именно от MPLAB X IDE). Вот это я лоханулся, а я думал я правил bat-файл. Так что всё теперь заработало. У меня только вопрос: а чем PORTB и PINB различаются? Я Сейчас попробовал через PORTB и у меня сигнал чередуется каждые 400 нс. Как раз то, что и нужно.

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

представь себе, что твоя ладонь - это PORTB.

сначала ты настроил свою ладонь на "вывод".

теперь даешь ладони команду согнуть все пальцы - это ты записал в свой PORTB все единицы.

потом даешь команду выпрямить все пальцы - это ты записал в свой PORTB все нули.

теперь настраиваешь свой порт PORTB на ввод. а твои пальцы - это PINB. и теперь можно проверять, что имеется на каждом пине.

а затем проверяешь свой указательный палец- чувствует он что-либо или нет.

если палец ничего не касается, то на входе "указательный палец" имеем "ноль".

если палец чего-то касается, ты это почувствуешь - на этом "входе" имеем единицу.

Мудрость приходит вместе с импотенцией...

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

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

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

затем проверяешь свой указательный палец- чувствует он что-либо или нет

Это PINB

PORTB это указание порту в каком состоянии быть

PINB что "чувствует" порт в данный момент

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

через PINB, вместо PORTB

Это неверно

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

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

Так, если я настроил всё на выход. То есть ли разница что использовать для того, чтобы устанавливать уровень сигнала: PORTB или PINB?

Не, для приёма сигнала я понимаю. Тут всё просто:

  • DRRB - направление
  • PORTB - зависит от направления (либо с подтягивающим резистором, либо какой уровень сигнала на выходе)
  • PINB - если направление на вход, то узнаем какой уровень сигнала. А если направление на выход?
Ссылка на комментарий
Поделиться на другие сайты

Посмотри даташит там все нарисовано. PORTB - это выходной буфер, что туда запишешь то и будет на выходе если пин включен на выход, или не дойдет до выхода если пин включен на вход. PINB - это входной буфер, что в данный момент присутствует на пине то и будет  в PINB.

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

В 07.06.2023 в 13:07, Просто зашёл сказал:

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

Не, ну блин, мне же вот что написали. Тут как раз про PINB. Или я что-то не так понял?

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

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

Тут как раз про PINB. Или я что-то не так понял?

Если не используется порт на вход ,  про  PINы даже не вспоминайте .

Конфигурация портов задается без них.

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

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

Не, ну блин, мне же вот что написали.

на заборах тоже много чего пишут. а читать надо документацию - даташит.

Мудрость приходит вместе с импотенцией...

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

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

В Attiny13 есть такая функция и регистр PIN имеет возможность R/W. В даташите это указано как Toggling the Pin. Это частный случай и привыкать к нему не надо.

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

1 час назад, Геннадий сказал:

В Attiny13 есть такая функция и регистр PIN имеет возможность R/W

Немного не так - если будет выполнена команда записи в PIN то физически запись будет выполнена в PORT

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

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

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

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

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

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

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

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

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

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

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

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