Jump to content

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


dubrovkin
 Share

Recommended Posts

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 сказал:

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

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

Link to comment
Share on other sites

Всё проще. Вы используете одни инструменты, я другие. То есть, по сути, 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

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

Link to comment
Share on other sites

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

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

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

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

Подробнее

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

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

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

 

Link to comment
Share on other sites

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

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

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

Ну, я ему пишу:

vectors:
	rjmp main
	rjmp PC-1
	rjmp vectors
	rjmp vectors
	rjmp vectors
	rjmp vectors
	rjmp vectors
	rjmp vectors
	rjmp vectors
	rjmp vectors

А он мне:

undefined reference to `PC'

 

Link to comment
Share on other sites

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

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

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

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

.equ PC,???

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

sbr R16,0x02

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

Link to comment
Share on other sites

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

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

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

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

Link to comment
Share on other sites

Posted (edited)

Ну, в общем они сделали вот как. Вообще такой подход, это же 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 такта. Если нужна экономия памяти.

Edited by dubrovkin
Link to comment
Share on other sites

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

RJMP .0

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

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

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

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

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

Edited by dodik
Link to comment
Share on other sites

rjmp .0 gcc-as не понимает. А вот rjmp .+0 он понимает и показывает что переход пойдёт к следующей инструкции.

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

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

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

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

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

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

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

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

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

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

Link to comment
Share on other sites

Честно говоря не понял. Мне как раз говорили, что устанавливать уровень сигнала на выходе можно через PINB, вместо PORTB.

Link to comment
Share on other sites

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

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

Это PINB

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

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

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

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

Это неверно

Link to comment
Share on other sites

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

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

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

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

Link to comment
Share on other sites

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

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

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

Link to comment
Share on other sites

Не нужно гадать читай документы

"Микроконтроллеры AVR семейства Tiny. Руководство пользователя" Евстифеев А. В.

Link to comment
Share on other sites

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

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

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

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

Link to comment
Share on other sites

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

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

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

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

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

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

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

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