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

Динамическая индикация на ассемблере


Юстас

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

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

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

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

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

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

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

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

А в прерывании вы выдаёте байты из "буфера экрана" сразу на индикатор, без дополнительных преобразований.

 

48 минут назад, dm37 сказал:

 


; *********вывод в порт B   ABCDEFGH ************
	ldi ZH,High(Array1*2)    ;загрузка начального адреса массива
	ldi ZL,Low(Array1*2)

	mov Temp, DigTemp        ;прибавление внутр. адреса
	add ZL, Temp
	ldi Temp, 0
	adc ZH, Temp
	lpm                      ;загрузка из ПЗУ

	mov Temp, R0             ;копирование в РОН

я про этот код - это чтение из Flash

должно быть как то так


	LDI	ZL,low(Digits)
	LDI	ZH,High(Digits)
 
 	add	ZL, DigNum
	clr	Temp
	adc	ZH, Temp
    
	LD	Temp, Z
	out	PortD, Temp

 

lpm - чтение символа из ПЗУ (flash), а LD - чтение из ОЗУ, верно? Как мне заменить чтение из ПЗУ чтением из ОЗУ? Не могу врубиться, что я делаю не так. Запутался я, не пойму, что я не так сделал)) Погодите, не подсказывайте, дайте повариться

 

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

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

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

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

Все у Вас было так. Вот только моего совета не послушались с реорганизацией программы. Теперь будете (по мере развития) увеличивать число сохраняемых регистров в стек и забивать тем самым и так не большую область RAM.

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

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

Теперь будете (по мере развития) увеличивать число сохраняемых регистров в стек и забивать тем самым и так не большую область RAM.

Мы не один новый регистр не добавили (поправьте, если я не прав). Вывод сегментов удобно выводить из RAM (храня в "буфере экрана" сегменты), выбор нужного разряда из flash можно сделать как предлагаете Вы, Геннадий.

Прерывание будет заниматься только выводом сегментов на экран, все преобразования будут производиться в main.

Геннадий, а как вы бы реализовали вывод на экран цифр от 0-9, символов a,b,c,d,e,f и дополнительно служебные символы, что то вроде 11-го символа ТС. Т.е. сделали бы одну таблицу символов и обращались к ней? Не удобнее ли организовать 3 разные таблицы, ведь коды этих символов идут по порядку (ASCII) (на служебные символы понятно нужны свои коды), а при написании программы получать сегменты из массива вычитанием константы (получаем порядковый номер в массиве). Не будете же вы напрягать прерывание разбором трёх таблиц.... Мы сейчас один раз напишем прерывание и оно не будет меняться, вне зависимости от выводимой информации на экран

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

5 часов назад, dm37 сказал:

вы используете в прерывании регистр R0 и регистровую пару Z, их тоже надо сохранять при входе в прерывание


	push	temp
	in	temp,SREG
	push	temp
	push	DigNum
	push	R0
	push	ZL
	push	ZH
...
	pop	ZH
	pop	ZL
	pop	R0
	pop	DigNum
	pop	temp
	out	SREG,temp
	pop	temp

 

Уже добавили.:)

Кто знает, какие еще "доработки" захочется внедрить в программу. Например, еще прерывание. А там опять push и pop...

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

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

Уже добавили

не придирайтесь, вы прекрасно знаете, что ТС забыл написать этот код в прерывании, иначе потом бы всё рухнуло. Если программа позволит выделить под переменные отдельные регистры, то можно оптимизировать код, пока мы не знаем, что будет в main

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

у меня на данный момент кварц на 4МГц, деление частоты на 8, итого 500кГц. Таймер переполняется 1953 раза в секунду, не учитывая времени на прерывание. На прерывание уходит 33 такта, еще если посчитать POP PUSH то получится 33+ 28. Верно я считаю?

 

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

Не придираюсь, но предупреждаю, что с таким подходом - грузить обработчики прерывания - чревато. Стек будет разрастаться. Путаница с регистрами, точнее с их именами, т.к. в одной задаче он DigitNum (еще понятно), а в другой (при нехватке регистров) он должен быть уже "Ваня Пупкин". Не запутаетесь?

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

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

Путаница с регистрами, точнее с их именами, т.к. в одной задаче он DigitNum (еще понятно), а в другой (при нехватке регистров) он должен быть уже "Ваня Пупкин". Не запутаетесь?

мой вариант, от вашего в этом отношении ничем и не отличается... Выход из этой ситуации у вас это не именовать регистры? Не запутаетесь?
По поводу регистров, даже в Си есть возможность задать переменным конкретные регистры, неужели в asm с этим проблемы будут. После написания программы будет ещё этап оптимизации.
К тому же ТС хочет попробовать оба варианта, это же хорошо, пусть поднатаскается и сам для себя решит. Ещё раз повторюсь, для меня проблемы с индикацией и клавиатурой неприемлемы (можно либо задать не то значение, либо показания на экране начнут зависать). Если у блока есть индикатор и клавиатура, то для кого вы тогда их делаете?

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

Отличия есть и они скажутся при усложнении программы. Например, у Cucumber-а уже заблокированы пара регистров DigNum и DigTemp, которые используются в прерывании и должны использоваться только для уже поставленных задач. Малейшая попытка их применения в другом месте (например, main) сразу собьет всю индикацию. Так же задействовать вход ICP для IR remote (ввести работу с пультом) уже не удастся, т.к. прерывания будут конфликтовать между собой. Возможно с протоколом 1Wire (DS18B20) возникнут проблемы, т.к. прерывание слишком растянуто. И много, много другого может еще всплыть. Так может сразу привыкать к порядку?

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

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

Отличия есть и они скажутся при усложнении программы

Мне кажутся ваши рассуждения немного странными:
- именуются регистры только те которые не меняются в программе (критичные участки, вроде прерываний, по возможности используют регистры), остальные переменные в RAM (уже не раз писал об этом!!!)
- прерывания, желающие иметь более высокий приоритет, будут прерывать прерывание индикации - и это нормально
- в main для критичных участков блокируются прерывания (как раз мы так и работаем с DS18B20), уже около 15 лет всё работает и никаких проблем

делал блок освещения на PIC18 там сигнал перехода фазы А поступал на INT, один таймер считал время между фазами, второй формировал пачку импульсов, третий занимался клавиатурой, индикацией и пр. и всё летало (конечно были приоритеты прерываний, у индикации был низший приоритет). Плюс было расписание работы блока на 50 дней, всё редактировалось из меню, был предусмотрен RS485. И пользователь не испытывал неудобства и всё прекрасно работало. По вашей структуре программы такое никогда бы не заработало, вы бы просто теряли события (взведённые флаги оставались бы без обработки).

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

К сожалению Вы ничего не поняли и никак не хотите понимать. Ну да ладно. Я лишь только предложил, но спорить и настаивать не имею желания. На этом и успокоимся. Пусть мои решения останутся со мной. Удачи Вам.
 

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

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

у меня на данный момент кварц на 4МГц, деление частоты на 8, итого 500кГц. Таймер переполняется 1953 раза в секунду, не учитывая времени на прерывание. На прерывание уходит 33 такта, еще если посчитать POP PUSH то получится 33+ 28. Верно я считаю?

при отладке Atmel Studio сам считает такты между точками останова

настройте прерывание на 1 или 2 млсек

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

получается, что сигнал будет в диапазоне 1...9999Гц на ножку INT1, как я планировал по-началу - организовываю прерывание по сигналу на INT1, и считаю такты таймера 0,  то для частоты 10кГц (это уже переполнение)  таймер насчитает всего 50 колебаний. Это очень мало для реализации точности +- хотя бы полгерца. Наверное, нужно пойти по-другому пути - организовывать замер количества импульсов измеряемого сигнала каждую секунду вне зависимости от частоты измеряемого сигнала. И только затем вычислять. Верно я рассуждаю? Только вот получается счетчик импульсов таймера будет 3-байтовым

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

Геннадий, ситуация запутанная:D Когда-то у меня был станок токарный, для него я хотел сделать тахометр. Мне тогда попалась готовая схема, заливать готовую прошивку мне не хотелось, хотелось написать самому на си. От станка к сожалению пришлось избавиться, а вот печатная плата осталась. Плюс жизнь заставляет развивать навыки программирования, которые у меня в зачаточном состоянии, плюс мне это интересно. Когда взялся за ассемблер, наконец начал кое-что понимать в Си.  Мне интересно, как работает и частотомер, и тахометр. Хотя сильно разницы не вижу -один считает импульсы в секунду, другой в минуту.    

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

6 часов назад, dm37 сказал:

при отладке Atmel Studio сам считает такты между точками останова

настройте прерывание на 1 или 2 млсек

сорри не понял - о чем речь про 1 или 2мсек. Вот в АВР студио поставил точки останова или брэйкпоинты, и посмотрел, сколько тактов уходит на прерывание - у меня получилось 63. Таймер0 (при частоте таймера 500кГц) переполняется каждые 256 тактов+63 на прерывание = 319, итого индикатор обновляется 500 000/319 =  1567 с копейками раз в секунду Верна моя арифметика?

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

6 часов назад, cucumber сказал:

получается, что сигнал будет в диапазоне 1...9999Гц...

Для тахометра 9999*60=599940 об/мин. не слишком ли много?

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

Извиняюсь, Геннадий, за неясности, я решил остановиться на том, что попробую подсчитать частоту на входе INT1 от 1 до 9999Гц. Пока просто частоту

 

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

В 13.01.2017 в 00:10, cucumber сказал:

сорри не понял - о чем речь про 1 или 2мсек

таймеры можно настроить на срабатывание через определённое вами количество тактов, т.е. можно заставить срабатывать таймер через определённые промежутки времени, например, через 1 млсек.
Получается, что код в прерывании будет выполняться раз в миллисекунду. Почитайте про инициализацию таймеров.

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

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

//========================================================================
.equ	ANOD_ONE		= 1<<5
.equ 	ANOD_TEN	  	= 1<<4
.equ 	ANOD_HANDRED  	= 1<<3
.equ 	ANOD_THOUSAND  	= 1<<2

.equ	A				= 1<<6
.equ	B				= 1<<7 //     A
.equ	C				= 1<<3 //   F   B
.equ	D				= 1<<2 //     G
.equ	E				= 1<<1 //   E   C
.equ	F				= 1<<5 //     D
.equ	G				= 1<<4
.equ	H				= 1<<0
//------------------------------------------------------------------------

//------------------------------------------------------------------------
.equ	ZERO			= A+B+C+D+E+F
.equ	ONE				= B+C
.equ	TWO				= A+B+D+E+G
.equ	THREE			= A+B+C+D+G
.equ	FOUR			= B+C+F+G
.equ	FIVE			= A+C+D+F+G
.equ	SIX				= A+C+D+E+F+G
.equ	SEVEN			= A+B+C
.equ	EIGHT			= A+B+C+D+E+F+G
.equ	NINE			= A+B+C+D+F+G
//========================================================================

.dseg

//========================================================================
DISPLAY_BUFFER:
.equ	DISPLAY_BUFFER_SIZE = 4
.byte	DISPLAY_BUFFER_SIZE
//========================================================================

.cseg

//========================================================================
.macro   Proc_7_Segm_Ind
	mov		CNT, CNT_7_SEGM_IND

	clr		ZH
	mov		ZL, CNT
	lsl		ZL
	subi	ZL, LOW(-(Table_7_Segm_Ind*2))
	sbci	ZH, HIGH(-(Table_7_Segm_Ind*2))

	lpm		CNT_7_SEGM_IND, Z+
	lpm		ANODS, Z

	ldz		DISPLAY_BUFFER
	addw	Z, CNT, RCLR
	ld		ZL, Z

	clr		ZH
	subi	ZL, LOW(-(Table_7_Segm_Char*2))
	sbci	ZH, HIGH(-(Table_7_Segm_Char*2))

	lpm		KATODS, Z
.endmacro
//------------------------------------------------------------------------

//------------------------------------------------------------------------
Table_7_Segm_Ind:
.db		0x01, ANOD_THOUSAND
.db		0x02, ANOD_HANDRED
.db		0x03, ANOD_TEN
.db		0x00, ANOD_ONE

Table_7_Segm_Char:	
.db		ZERO,    ONE
.db		TWO,     THREE
.db		FOUR,    FIVE
.db		SIX,     SEVEN
.db		EIGHT,   NINE
//========================================================================

 

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

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

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

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

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

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

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

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

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

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

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

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