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

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


dubrovkin

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

Недавно столкнулся с таким, файл проекта для GD32 с кодировкой UTF8, часть кода с этого файла, только латиница,  перенес в другой файл, но кодировка windows 1251, Кеил не ругается, компилятор GNU99 компилит без ошибок и варнингов, зашиваю в контроллер не работает. При отладке не попадаю на перенесеный код. Стираю перенесеный код и набираю его с клавиатуры, после этого все нормально работает.

У тебя есть кириллица, может и с кодировкой связано.

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

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

Вывел от ассемблера через команду:

-a=Log.txt

Вот что там:

GAS LISTING 00.asm 			page 1


   1               	
   2               	.equ PINB,0x16
   3               	.equ DDRB,0x17
   4               	.equ PORTB,0x18
   5               	
   6               	.data
   7               	
   8               	.section .text
   9               	.org 0x0000
  10               	
  11               	vectors:
  12 0000 00C0      		rjmp main
  13 0002 00C0      		rjmp vectors
  14 0004 00C0      		rjmp vectors
  15 0006 00C0      		rjmp vectors
  16 0008 00C0      		rjmp vectors
  17 000a 00C0      		rjmp vectors
  18 000c 00C0      		rjmp vectors
  19 000e 00C0      		rjmp vectors
  20 0010 00C0      		rjmp vectors
  21 0012 00C0      		rjmp vectors
  22               	
  23               	main:
  24 0014 F894      		cli
  25               		
  26 0016 07B3      		in R16,DDRB
  27 0018 16B3      		in R17,PINB
  28               		
  29 001a 0260      		sbr R16,0x02
  30 001c 1D7F      		cbr R17,0x02
  31               		
  32 001e 07BB      		out DDRB,R16
  33 0020 16BB      		out PINB,R17
  34               		
  35 0022 22E0      		ldi R18,0x02
  36               	
  37               	mainLoop:
  38 0024 1227      		eor R17,R18																	; 1 cycle
  39 0026 16BB      		out PINB,R17																; 1 cycle
  40               		
  41 0028 00C0      		rjmp mainLoop																; 2 cycles
GAS LISTING 00.asm 			page 2


DEFINED SYMBOLS
              00.asm:2      *ABS*:0000000000000016 PINB
              00.asm:3      *ABS*:0000000000000017 DDRB
              00.asm:4      *ABS*:0000000000000018 PORTB
              00.asm:11     .text:0000000000000000 vectors
              00.asm:23     .text:0000000000000014 main
              00.asm:37     .text:0000000000000024 mainLoop

NO UNDEFINED SYMBOLS

Как видно, прыгает он уже не так как нужно.

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

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

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

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

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

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

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

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

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

Скачайте VMLAB 3.15. Хоть она и не поддерживает AtTiny13 в полном режиме IDE, но avrasm32 в ней есть (для командной строки) и он никогда не подводил. Работа с наиболее популярными МК типа Atmega - одно удовольствие.

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

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

У тебя есть кириллица, может и с кодировкой связано.

А где она там у меня?

 

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

$ avr-objdump -D ex1.elf > ex1.lst

Выдаёт:


00.o:     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>

 

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

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

Как видно, прыгает он уже не так как нужно.

Видно, что он у ВАс не понимает метки - все rjmp одинаковые (0x00С0) и даже в mainloop.

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

Только что, donec сказал:

Кодировка файла какая?

ANSI/UTF-8. Разницы никакой, так как там нет ни одного символа за пределами 128 диапазона и нет BOM.

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

Если ещё хочешь с ним возиться, то напиши на СИ сохрани с ключом  S в листинг asm, попробуй скомпилировать файл .S , тогда может и будет что то понятно.

А так или как Геннадий написал или АтмелСтудию ставь, не помню в MPLAB X есть поддержка или нет, это только завтра смогу посмотреть

 

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

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

все rjmp одинаковые (0x00С0)

Именно так, какая-то проблема с метками.

@dubrovkin , попробуйте вручную посчитать и написать без меток: rjmp PC + xx, rjmp PC - xx

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

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

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

Если ещё хочешь с ним возиться, то напиши на СИ сохрани с ключом  S в листинг asm, попробуй скомпилировать файл .S , тогда может и будет что то понятно.

А так или как Геннадий написал или АтмелСтудию ставь, не помню в MPLAB X есть поддержка или нет, это только завтра смогу посмотреть

 

Что же так сложно-то. Конкретно в данном случае же не нужен мне C. Есть же отдельная утилитка avr-as. И есть ассемблерный файл. Неужели просто нельзя?!

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

Именно так, какая-то проблема с метками.

@dubrovkin , попробуйте вручную посчитать и написать без меток: rjmp PC + xx, rjmp PC - xx

Я даже подбирать не стал. Просто на бум так указал значения и он всё равно генерирует для них один и тот же опкод.

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

В общем удалось добиться чтобы он выдавал это:

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

Завтра буду уже тестировать. Всем спасибо за помощь)

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

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

удалось добиться чтобы он выдавал это

А почему значение адреса удвоенное? :unknw:

В AVR должно быть так:

    28: .ORG 0x0000
    29: 000000   C0CA  rjmp    Reset   ; 0x0000 RESET
    30: 000001   9518  RETI            ; 0x0001 INT0
    31: 000002   9518  RETI            ; 0x0002 PCINT0
    32: 000003   9518  RETI            ; 0x0003 TIMER1 COMPA
    33: 000004   C036  rjmp    pT1_INT ; 0x0004 TIMER1 OVF
    34: 000005   9518  RETI            ; 0x0005 TIMER0 OVF
    35: 000006   9518  RETI            ; 0x0006 EE READY
    36: 000007   9518  RETI            ; 0x0007 ANALOG COMP
    37: 000008   C088  rjmp    pADC_INT; 0x0008 ADC
    38: 000009   9518  RETI            ; 0x0009 TIMER1 COMPB
    39: 00000A   C004  rjmp    pT0_INT ; 0x000A TIMER0 COMPA
    40: 00000B   9518  RETI            ; 0x000B TIMER0 COMPB

Если мне нужен простейший цикл, то я пишу rjmp PC - 1 и получаю переход на адрес 124 (125 - 1)

    86: 000124   FF05  sbrs    rFlags, cNeedCalc_b ;
    87: 000125   CFFE  rjmp    PC - 1              ;

По Вашему листингу мне бы пришлось написать PC - 2 ? Ерунда какая-то...

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

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

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

Вот только я не понял как этот ассемблер скачать

Не понял какой ассемблер, вот скачал установил студию для AVR

https://www.microchip.com/en-us/tools-resources/develop/microchip-studio#Downloads

Компиляторы установились с ним, не отдельно как обычно

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

6 часов назад, ДядяВован сказал:

Если мне нужен простейший цикл, то я пишу rjmp PC - 1 и получаю переход на адрес 124 (125 - 1)

    86: 000124   FF05  sbrs    rFlags, cNeedCalc_b ;
    87: 000125   CFFE  rjmp    PC - 1              ;

По Вашему листингу мне бы пришлось написать PC - 2 ? Ерунда какая-то...

Это у Вас ерунда какая-то.  rjmp k  это команда перехода относительно счетчика команд (в нем РС+1) на константу k , по правилу PC <- (PC+1) + k.
Если Вы присвоите k = PC - 1 = 125-1 , то счетчик команд перейдет на   250-й адрес...

То, что Вы пишите, справедливо для команды jmp k, где  k - абсолютный адрес счетчика команд. Тогда если РС=125, то  jmp PC - 1 даст адрес 124.

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

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

Это у Вас ерунда какая-то

Ну-ну, продолжайте...
От кого уж, а от Вас я такого не ожидал.

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

То, что Вы пишите, справедливо для команды jmp k

Вы утверждаете, что для rjmp я не могу в ассемблере указать метку??? А должен использовать выражения типа "PC - метка" и "PC + метка" ??? Причем плюс или минус наверное я тоже должен сам определить?
Открою Вам секрет, всем этим занимается компилятор. Что jmp, что rjmp - везде пишется метка. А метка есть АДРЕС !
В листинге есть код для этого rjmp CFFE, можете его дизассемблировать и посмотреть какой там адрес перехода.

PS Эти фрагменты листинга от работающей программы.

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

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

Мои вчерашние потуги , недопиленные .

PIC.png.141ce659ec51d46367307eb4c64b94c6.png

 

Несколько соображений.

Команда sbi занимает два такта . Одним тактом можно грузить выход через out из кеша (R0-R31)

Много времени занимают строчки сдвига и счета  16,23,30 . Тоже требуется изменения (алгоритма)

По сути 1 и 0 передаются через ШИМ . Можно попробовать микросхему с PLL .

Но времени пока нет .

п.с. Ранее вопрос был про симулятор . Это 8-й proteus взятый "во временное пользование" . В нем же есть отладка .

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

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

Что jmp, что rjmp - везде пишется метка. А метка есть АДРЕС !

те Вы хотите сказать что проставив в  rjmp .124  Вы перейдете на абсолютный адрес 124 ?
Тогда почему отличие в описании команд rjmp и jmp ???

wert.jpg

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

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

перейдете на абсолютный адрес 124 ?

Да. Я могу менять в исходном тексте jmp на rjmp и наоборот без изменения меток (метка=адрес). Разумеется, для rjmp указанный адрес должен быть в необходимой близости, иначе компилятор выдаст ошибку.

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

Тогда почему отличие в описании

Потому что команды выполняется за разное количество тактов и занимают различное количество памяти программ. Ну и если кодировать вручную (без компилятора), то необходимо взять на себя задачу расчёта относительных переходов.

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

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

Попробуйте этот код:

main:
		rcall		send_pack	;отправка всего пакета данных
rjmp main
;===========================================================
;пакет состоит из 3-х байт (RGB) на один светодиод
send_pack:
		ldi		r23,0x55
		rcall		send_wire
		ldi		r23,0xAA
		rcall		send_wire
		ldi		r23,0xF0
		rcall		send_wire
		ret
;===========================================================
;отправка одного байта
send_wire:
		ldi		r16,8	;счетчик отправленных бит
cyc_send_wire:
		sbi		PORTB,0
		lsr		r23
		brcc		send_zero
send_one:
		nop
		nop
		nop
		nop
		nop
		cbi		PORTB,0
		dec		r16
		brne		cyc_send_wire	
		rjmp		exit_send_wire	
send_zero:
		cbi		PORTB,0
		nop
		nop
		nop				
control_full:
		dec		r16
		breq		exit_send_wire
		rjmp		cyc_send_wire
exit_send_wire:
		ret

Инициализацию периферии и сигнал TReset - на Ваше усмотрение. Основная попытка была привести сигнал к максимально приближенному виду по datasheet.

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

Не ругайтесь ребята. Может быть ваше ПО показывает по-другому. А тут, на сколько я понял, показывается всё кратное двум, так как команды занимают 2 байта. Вот и получается, чтобы прыгнуть на самого себя, нужно отойти назад на 2.

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

Да мы и не думали ругаться)) Просто хотим прояснить истину.

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

нужно отойти назад на 2.

Пытаюсь себя заставить этому поверить и не могу. Полное противоречие с организацией памяти программ в AVR. Счётчик команд (PC) считает словами, а не байтами.

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

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

Счётчик команд - это одно дело. А вот GCC - это другое. Вот фрагмент кода:

vectors:
	rjmp main
	rjmp vectors
	rjmp vectors
	rjmp vectors
	rjmp vectors
	rjmp vectors
	rjmp vectors
	rjmp vectors
	rjmp vectors
	rjmp vectors

main:

А вот результат:

   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

Как видно всё совпадает. Такая вещь, как .-4 указывает, что, если там было бы .-2, он бы прыгнул на самого себя, а он прыгает на .-4, то есть на инструкцию выше. А там как раз раз метка vectors.

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

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

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

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

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

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

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

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

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

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

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

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