ATtiny25 и встроенный термодатчик

Обсуждаем контроллеры компании Atmel.
Ответить
Друг Кота
Сообщения: 3342
Зарегистрирован: Ср янв 02, 2013 08:37:35

Сообщение АСУ »

[uquote="Demiurg",url="/forum/viewtopic.php?p=3286440#p3286440"]Вы написали, что копируете ADC сразу в регистры X Y Z, а речь шла о[/uquote]
Да так и есть, ты просто не понял о чём идёт речь. :) Я пишу одну строку в программе (что и подтверждает скрин), а действия компилятора могут быть какими угодно… :wink: это так же как производить запись двухбайтной переменной SRAM в двухбайтный регистр Y. Запись в программе имеет одну строку, а реальное выполнение 4 слова.
Реклама
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Понял, но в следующий раз уточняйте. Мы в теме "Ассемблер".
Контактная информация:
Реклама
Друг Кота
Сообщения: 3342
Зарегистрирован: Ср янв 02, 2013 08:37:35

Сообщение АСУ »

Дык и я про ассемблер только графический - Algorithm Builder. :))
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

[uquote="АСУ",url="/forum/viewtopic.php?p=3286680#p3286680"]Дык и я про ассемблер только графический - Algorithm Builder. :))[/uquote]
Не совсем так. Это компилятор. Кстати, как у пользователя буилдера спрошу: возможно ли в нем реализовать конечный автомат. И как.
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Сообщения: 3342
Зарегистрирован: Ср янв 02, 2013 08:37:35

Сообщение АСУ »

[uquote="Demiurg",url="/forum/viewtopic.php?p=3286683#p3286683"]Не совсем так. Это компилятор.[/uquote]
Точнее среда... http://algrom.net/russian.html
Demiurg писал(а):возможно ли в нем реализовать конечный автомат. И как.
Что это такое "конечный автомат"? Я не понял о чём речь. :)
Реклама
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Ммм... Статья. В конце архив. Рекомендую изучить. Основные принципы в программировании я применяю как раз из статей Татарчевского. Сам когда-то хотел похожую статью написать. Но опередили. :)
Спойлер

Код: Выделить всё

.cseg

//==================
.macro Proc_FSM
	ldz		@0*2
	rjmp	_Proc_FSM
.endmacro

_Proc_FSM:
	lpm		XH, Z+ ; Считывание старшего байта адреса параметров автомата.
	lpm		XL, Z+ ; Считывание младшего байта адреса параметров автомата.
	ld		r16, X ; Считывание состояния автомата. Индекс таблицы.
	lpm		r17, Z+ ; Считывание количества состояний автомата.
	cp		r16, r17
	brsh	Process_Errors_FSM
	lpm		XH, Z+ ; Начало таблицы адресов.
	lpm		XL, Z ; Начало таблицы адресов.
	movw	ZH:ZL, XH:XL
	add		ZL, r16 ; Смещение по индексу-состоянию автомата.
	adc		ZH, RCLR
	shiftlwz
	lpm		r17, Z+ ; Считывание адреса по индексу.
	lpm		r16, Z
	movw	ZH:ZL, r17:r16
	ijmp
Process_Errors_FSM:
	cli
	adiw	ZL, 2
	lpm		r16, Z
	rjmp	Proc_Errors
//==================

//==================
Set_FSM_State:
	st			Y, FSM_STATE
	ret
//==================

//==================
//Proc_FSM_Exit:
//	st			Y, FSM_FLAGS
//	std			Y+1, FSM_STATE
//	ret
//==================

//==================
Proc_Heater_Save_Val:
	std		Y+DISP_PROC_HEAT, FSM_STATE
	std		Y+DISP_PROC_HEAT_FLAGS, FSM_FLAGS
	ret
//==================

//==================
Proc_Heater:
	pushiwl		Proc_Heater_Save_Val ; Смещение стека на Proc_Heater_Save_Val, после выхода из подпрограммы будет выход из конечного автомата.

	ldy			_PROC_HEAT
	ldd			FSM_STATE, Y+DISP_PROC_HEAT
	ldd			FSM_FLAGS, Y+DISP_PROC_HEAT_FLAGS

Proc_FSM_Heater:
	Proc_FSM		Table_FSM_Proc_Heat

//------------------------------------------------------------------------
Proc_Heat_Init_1: // Инициализация портов ввода-вывода.
	cbi			RED_LED_PORT, RED_LED
	sbi			RED_LED_DDR, RED_LED

	cbi			GREEN_LED_PORT, GREEN_LED
	sbi			GREEN_LED_DDR, GREEN_LED

	cbi			PLUG_PORT, PLUG
	sbi			PLUG_DDR, PLUG
	Set_Timer	Par_Timer_Proc_Heat_Init
	Set_State	_PROC_HEAT_INIT_2
	ret

//==================
Table_FSM_Proc_Heat:
.db		tab_h(_PROC_HEAT), MAX_PROC_HEAT_STATES,tab_h(Table_Jmp_Proc_Heat), ERR_ID_PROC_HEAT

Table_Jmp_Proc_Heat:
.equ	MAX_PROC_HEAT_STATES				= 18

.equ	_PROC_HEAT_INIT_1					= 0
.db		tab_h(Proc_Heat_Init_1)

.equ	_PROC_HEAT_INIT_2					= 1
.db		tab_h(Proc_Heat_Init_2)

.equ	_PROC_HEAT_WAIT_ON					= 2
.db		tab_h(Empty_Action)

.equ	_PROC_HEAT_BLOW_1					= 3
.db		tab_h(Proc_Heat_Blow_1)

.equ	_PROC_HEAT_SET_WAIT_FIRE_SENS		= 4
.db		tab_h(Proc_Heat_Set_Wait_Fire_Sens)

.equ	_PROC_HEAT_WAIT_FIRE_SENS			= 5
.db		tab_h(Proc_Heat_Wait_Fire_Sens)

.equ	_PROC_HEAT_WAIT_FIRE_SENS_DONE		= 6
.db		tab_h(Empty_Action)

.equ	_PROC_HEAT_WORK						= 7
.db		tab_h(Empty_Action)

.equ	_PROC_HEAT_BLOW_2					= 8
.db		tab_h(Proc_Heat_Blow_2)

.equ	_PROC_HEAT_WAIT_FIRE_SENS_COLD		= 9
.db		tab_h(Proc_Heat_Wait_Fire_Sens_Cold)

.equ	_PROC_HEAT_WAIT_FAN_OFF				= 10
.db		tab_h(Proc_Heat_Wait_Fan_Off)

.equ	_PROC_EMERG_LOW_VOLT_SENS_1					= 11
.db		tab_h(Empty_Action)

.equ	_PROC_EMERG_FIRE_SENS_1						= 12
.db		tab_h(Empty_Action)

.equ	_PROC_EMERG_OVERHEAT_SENS_1					= 13
.db		tab_h(Empty_Action)

.equ	_PROC_EMERG_FIRE_LOW_VOLT_SENS_1			= 14
.db		tab_h(Empty_Action)

.equ	_PROC_EMERG_OVERHEAT_LOW_VOLT_SENS_1		= 15
.db		tab_h(Empty_Action)

.equ	_PROC_EMERG_OVERHEAT_FIRE_SENS_1			= 16
.db		tab_h(Empty_Action)

.equ	_PROC_EMERG_OVERHEAT_FIRE_LOW_VOLT_SENS_1	= 17
.db		tab_h(Empty_Action)
//==================
Контактная информация:
Реклама
Друг Кота
Сообщения: 3342
Зарегистрирован: Ср янв 02, 2013 08:37:35

Сообщение АСУ »

Если камень AVR (tiny, mega) способен это сделать, то в среде Algorithm Builder можно написать любой алгоритм для этого камня.
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

[uquote="АСУ",url="/forum/viewtopic.php?p=3286737#p3286737"]Если камень AVR способен это сделать, то в среде Algorithm Builder можно написать любой алгоритм для этого камня.[/uquote]
Плиз, пример конечного автомата. Есть два способа: таблица адресов подпрограмм - обработчиков состояний. Пример я показал выше. Или так называемый switch-case.

Код: Выделить всё

.macro	Read_State
	lds		r16,@0
.endmacro

.macro	Case
	cpi		r16,@0
	brlo	Case_Exit // Макрос именно такой, потому что диапазон breq +- 64 байта.
	rjmp	@1
Case_Exit:
.endmacro

Read_State

case 0, FUNC_1
case 1, FUNC_2

FUNC_1:
ret

FUNC_2:
ret
Контактная информация:
Друг Кота
Сообщения: 3342
Зарегистрирован: Ср янв 02, 2013 08:37:35

Сообщение АСУ »

Хочешь, чтобы я воспроизвёл это в АВ? Если так, то мне нужно будет время для разобраться в данном коде… так как я не программист и классический ассемблер плохо знаю. :)
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Вам в коде и не нужно разбираться. Есть переменная состояние. В зависимости от значения делаются телодвижения. Не важно какие. Главное, что если ноль, то делается одно, если 1, то другое. И так далее.
Контактная информация:
Друг Кота
Сообщения: 3342
Зарегистрирован: Ср янв 02, 2013 08:37:35

Сообщение АСУ »

[uquote="Demiurg",url="/forum/viewtopic.php?p=3286762#p3286762"]Главное, что если ноль, то делается одно, если 1, то другое. И так далее.[/uquote]
Ну если не разбираться то вот...
Темр - это переменная в SRAM: если туда записать "0" - выполнится подпрограмма Func_1, если записать "1" - выполнится подпрограмма Func_2.
1.png
(4.29 КБ) 270 скачиваний
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Ух ты! А свитч кейс не могли бы развернуть?
Контактная информация:
Друг Кота
Сообщения: 3342
Зарегистрирован: Ср янв 02, 2013 08:37:35

Сообщение АСУ »

Или такой вариант: константа задаётся в скобках к макрасу… где в скобках указан (0) – выполнится условие Func_1, где в скобках указан (1) – выполнится условие Func_2.
2.png
(4.57 КБ) 300 скачиваний
Добавлено after 3 minutes 57 seconds:
[uquote="Demiurg",url="/forum/viewtopic.php?p=3286791#p3286791"]А свитч кейс не могли бы развернуть?[/uquote]
Я не программист… «если эти слова ругательные, прошу ко мне не применять» (С) :))) Объясни на пальцах свою хотелку… :oops:
Опытный кот
Аватара пользователя
Сообщения: 708
Зарегистрирован: Пт ноя 30, 2007 14:40:44

Сообщение Серый_ »

А по теме, можно ещё 1 вопрос? Спасибо. :) Как я понимаю, в tiny25 удешевлённый ADC хоть и может фактическое "1024", но шагает через 1. Т. е. имеем "зернистость 512". Но как бы не совсем суть. Предусмотрено ли там забратие °Целься как-нибудь ровненько, по 1 или по 2°C. Без перемножения ADC на дробное?
(А то в тексте, стр. 133 даташита "Temperature Measurement" - написано, что вроде как 1 LSB на °C, а по таблице ниже, в положительную сторону 0,85°C, а ADC перескакивет через 1. Вот и пойми в чём правда).
Последний раз редактировалось Серый_ Пт янв 19, 2018 09:11:13, всего редактировалось 2 раза.
Друг Кота
Сообщения: 3342
Зарегистрирован: Ср янв 02, 2013 08:37:35

Сообщение АСУ »

The measured voltage has a linear relationship to the temperature as described in Table 17-2 The sensitivity is approximately 1 LSB / °C and the accuracy depends on the method of user calibration. Typically, the measurement accuracy after a single temperature calibration is ±10°C, assuming calibration at room temperature. Better accuracies are achieved by using two temperature points for calibration.
Написано, что чувствительность составляет приблизительно 1 LSB / °C... :) данные датчики не для точности измерений температуры. :)

К тому же пишут, что таблица 17-2 не есть панацея… от камня к камню значения разнятся… и чтобы иметь более точные значения необходимо калибровать показания по нескольким точкам применяя формулу для корректировки.
Опытный кот
Аватара пользователя
Сообщения: 708
Зарегистрирован: Пт ноя 30, 2007 14:40:44

Сообщение Серый_ »

"Кароч, я всё зделал около того, что - правильно!" 0,85x2x3=5,1 где тройка взята за 5°C, и в общем-то работает (для вкл/выкл вентилятора достаточно). Но ради спортивного - надо поананировать..., что в их формуле предлагается делать с ADCH: [(ADCH << 8) | ADCL] Что это, сдвиг-умножение или левость результата?

P. s. посовав схему вместе с градусником на паяльник, выплыло, что значение 1-ца на °C более правдивое. Но... из-за шага ADC х2 = шкалу лучше делать через 6, а не через 5. (34-40-46-52 °C).
Последний раз редактировалось Серый_ Пт янв 19, 2018 15:04:17, всего редактировалось 1 раз.
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

это для С, указывает (при раздельном чтении) что байт ADCH надо на 8 бит сдвинуть влево (умножить на 256) чтобы он попал в Н байт двухбайтной переменной.

Добавлено after 2 minutes 32 seconds:
в ассемблере ADCL и ADCH просто читай в соседние регистры, их пара и будет равна 16 битному ADC

Добавлено after 43 minutes 57 seconds:
[uquote="Demiurg",url="/forum/viewtopic.php?p=3286791#p3286791"]А свитч кейс не могли бы развернуть?[/uquote]легко разворачивается и хранение массива констант во флеш (например для знакогенератора), а если константы заменить на переходы по меткам - будет свитч кейс. (только отдельно нужно проверить диапазон, иначе можно куданибудь вылететь)

Добавлено after 34 minutes 14 seconds:
Т.е. я вижу вариант реализации свитч кейс 2мя способами 1-перебором условий, 2-через массив адресов переходов, оба способа реализуемы в АБ, первый стабильнее (безопаснее), второй быстрее.

Добавлено after 6 hours 23 minutes 32 seconds:
Тут ваял в АБ свич разветвитель и понадобилось константу (адрес начала массива переходов) в Z записать, так вот, чтобы это заработало нужно или в опциях проекта (вкладка компилятор) пункт: Интерпретация #->Z выбрать нижний вариант, или выделить строку как макрооператор (кнопка F2) (выделится жирным шрифтом).

Добавлено after 4 minutes 30 seconds:
если понадобится во флеш запилить массивы данных их надо пометить квадратиком (Shift+F3) или спереди приписать db:

Добавлено after 6 hours 30 minutes 41 second:
1й вариант можно макросами облагородить, как сделаю - выложу оба варианта.

Добавлено after 2 minutes 20 seconds:
правда для этого с макросами АБ разобраться надо :)

Добавлено after 1 hour 51 minute 48 seconds:
ну вот и разобрался: слева 1 метод, справа 2й, посредине - общее - запуск и подпрограммы (пустые)

Добавлено after 8 hours 54 minutes 23 seconds:
второй метод тоже макросом сделал.
метки переходов не обязательно вершины, могут быть и просто метки внутри кода

Добавлено after 47 minutes 13 seconds:
провел замеры по времени: кол-во тактов от номера вызванного кейса (0,1,2,3,4,5,DEF) метод1(5,7,9,11,13,15,16), метод2(14,14,14,14,14,14,14)
по флешу: метод1 - 1 слово для свитча и по 2 на каждый кейс; метод2 - 10 слов свитч, 1 кейс.
вывод: метод1 компактнее до 9 кейсов и быстрее до 6, "плюс" второму - за стабильность времени исполнения.
Вложения
switch-case.gif
(10.83 КБ) 202 скачивания
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Ответить

Вернуться в «AVR»