Ассемблер (ASM) для AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Ответить
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18793
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

кнопочка там ничего такого не делает, тупо рвет питание МК.
а вот программа МК уже весьма и весьма хитро сделана: в активном режиме "заряжается" встроенный конденсатор схемы выборки-хранения АЦП путем выдачи на один из портов высокого уровня.
если питание выключается ненадолго - этот конденсатор разрядиться не успевает, и АЦП на этом входе что-то намеряет. если питание отключить на несколько секунд - конденсатор разрядится и АЦП покажет 0.
алгоритм переключения режима таков: после подачи питания включается сохраненный ранее в EEPROM. если просто выключить питание - так все и останется. а вот если выключить-включить питание быстро, то МК это обнаруживает по вышеописанному алгоритму и переключает режим, сохраняя его в EEPROM.
можно еще использовать аналогичный эффект емкости выводов питания - нескольких пикофарад хватает, чтобы за долю секунды содержимое ОЗУ не усело попортиться... но это игра на грани фола.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Встал на лапы
Сообщения: 124
Зарегистрирован: Пн мар 22, 2010 18:07:52

Сообщение vit007 »

У меня будет в качестве питания танталовый кондер и керамика от Step-up'а. А констант у меня не много, поэтому в пихну проверку содержимого - не соответствует - сброс в начало выбора...

Да, хотел поиграться с watchdog, чтоб таймер отключить, так в симуляторе, что avr, что в протеусе не срабатывает. Использую attiny85, в WDT включил единицу на прерывание и включение (wde), так после 2048 циклов, флаг не поднимается...
Реклама
Друг Кота
Аватара пользователя
Сообщения: 15798
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Так опять же вариант с управляемым силовым ключем и/или раздельным питанием нагрузки и МК напрашивается...
В смысле такового уже ЗА кнопкой...
А там и чего по типу ионистора... да диодика шоттки...
:roll:
Периферия в симуляторах требует внимательного ознакомления с соответствующими разделами хелпа - что-то поддерживается , что-то нет и все относительно каждого из конкретного кристалла по-своему...
Читать надо...
:(
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

2048 циклов чего? у WDT свой тактовый генератор никак не связанный с тактированием МК.
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Встал на лапы
Сообщения: 124
Зарегистрирован: Пн мар 22, 2010 18:07:52

Сообщение vit007 »

Выставляется битами WDP. Ими реализована, когда произойдет прерывание.
Реклама
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Это хорошо что выставляется. А сам WDT включен? А эти 2048 циклов вы где отсчитали?
Контактная информация:
Реклама
Встал на лапы
Сообщения: 124
Зарегистрирован: Пн мар 22, 2010 18:07:52

Сообщение vit007 »

в мануале: Number of WDT Oscillator Cycles - 2K (2048) cycles. В протеуси фьюз ставил.

разобрался, осциллятор собаки в attiny25,45,85 работает на 128kHz, думал, 1 MHz.

Все равно не понятно, как посчитать время до прерывание в авр. У меня 1 MHz, Number of WDT Oscillator Cycles - 2K (2048) cycles и срабатывает прерывание на 1050 ms.... :dont_know:
Это не хвост, это антенна
Сообщения: 1495
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Сторожевой таймер работает от независимого внутреннего генератора мк. С кварцем и внешним тактовым входом никак не связан. Время срабатывания настраивается специальным регистром.
Контактная информация:
Друг Кота
Сообщения: 3342
Зарегистрирован: Ср янв 02, 2013 08:37:35

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

[uquote="vit007",url="/forum/viewtopic.php?p=3423720#p3423720"]Все равно не понятно, как посчитать время до прерывание в авр. У меня 1 MHz[/uquote]
Изображение
WDT_tim.png
(3.66 КБ) 535 скачиваний
Встал на лапы
Сообщения: 124
Зарегистрирован: Пн мар 22, 2010 18:07:52

Сообщение vit007 »

С мануалом сходится... :)) , но почему на симуляторе не видно. Только в железе можно увидеть?
akl
Друг Кота
Сообщения: 4474
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Цитата из Help симулятора Студии 4.19
Notes for ATtiny25/45/85
The Watchdog is not simulated.
Похоже что так.
Родился
Сообщения: 19
Зарегистрирован: Вс сен 09, 2018 06:42:27

Сообщение neitrino777 »

Всем Привет ! учу ассемблер avr, выполняю очередное задание. Сложить два массива и создать на их основе третий. Всё было хорошо с двумя массивами данных. Но когда понадобилось
создать третий в озу и я воспользовался третьей регистровой парой x , atmel sudio 7 (attiny13) стала ругаться на плохой номер или операнд при чтение байта в регистр. Есть какие то ограничения на эту регистровую пару ? в даташите на тиньку ничего нет об этом
вот код
LDI XL,low(data*2) ; заносим младший байт адреса, в регистровую пару
LDI XH,high(data*2) ; заносим старший байт адреса, в регистровую пару
LPM R17,X
data: .db $10,$7

Добавлено after 35 minutes 55 seconds:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
СОРРИ, ЗА БЕСПОКОЙСТВО. Уже разобрался, команда lpm работает только с Z
Работа - продажа электронных компонентов. А для души - есть Ассемблер, дочка и сын.
Друг Кота
Аватара пользователя
Сообщения: 15798
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

LPM работает НЕ С ОЗУ, А с ПЗУ!!!!!
Вы чего хотите - массивы в ОЗУ изменить или автоперепрошивкой МК заняться?
8)
Если оба исходных массива в ПЗУ
то сначала читаем в буфер А одно значение, затем делаем быстрый обмен содержимого регистровой пары второго адреса (MOVW zl,r2 к примеру), заранее сохраненной в регистровом банке (r2-r15), затем читаем второе значение в буфер В, делаем над данными необходимую операцию и помещаем результат в ОЗУ.
Кроме прочего для однобайтовых данных у тини 13 имеется возможность применения LPM Rd,Z+ с постинкрементом указателя.
:roll:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2022
Зарегистрирован: Вт фев 09, 2010 02:04:53
Откуда: Санкт-Петербург

Сообщение Гефестион »

Сейчас разбираюсь с динамическим опросом кнопок, сделал так для экономии портов - кнопки сканируются одновременно с анодами индикаторов (см. схему)
Сканирование сделал просто логическим сдвигом влево. Когда единичка вылезает во флаг С, записываю в регистр Anodes изначальное состояние.
Спойлер...
ldi Anodes,0b00010000
out portD,Anodes
lsl Anodes
brcc Next
ldi Anodes,0b00001000
...
Собственно, здесь всё понятно. А вот как опрашивать кнопки? Если нажата любая из четырёх кнопок, на PortB,0 появляется единичка. Чтобы понять, какая именно кнопка нажата, у меня только одна идея: cpi Anodes,0b00010000 и так четыре раза для всех четырёх возможных состояний. Может, есть какой-то более изящный способ, чем тупо перебирать все возможные состояния путём сравнения с константой?
Кнопки.jpg
(74.32 КБ) 434 скачивания
Фак, кот грызёт провод! Сейчас его ударит либо током, либо тапком! ))
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Как-то заморочено сильно и не универсально. Я как-то делал по другому, заводишь массив с масками анодов, перебираешь индекс массива, выставляешь маску засвета анодов и опрашиваешь порт общего провода кнопок(через 100...500мкс, дабы не попасть на переходный процесс и не получить ложняк от емкостной наводки), появится активный уровень - НОМЕР КНОПКИ равен индексу. Можно без задержки, но считывать порт кнопки ДО того как меняешь анод, но там надо будет вычислять предыдущее значение индекса... и что-то сделать с первым считанным значением т.к. оно точно будет мусором - лишняя морока. Если частота опроса анода будет 200Гц, то считаешь до 5 и если номер кнопки не меняется - регистрируешь нажатие.
Контактная информация:
akl
Друг Кота
Сообщения: 4474
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Можно заменить диоды резисторами 1кОм, посадить общую точку кнопок на общий и избавиться от PB0. В конце каждого периода индикации переводить текущую лапу на ввод с подтяжкой и опрашивать кнопку.
СпойлерИзображение
[uquote="Гефестион",url="/forum/viewtopic.php?p=3464065#p3464065"]А вот как опрашивать кнопки?[/uquote]Как вариант
Спойлер

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

.include "tn2313Adef.inc"

.def	R_KEY=R0
.def	R_ANODE=R19

.cseg
.org 0
	RJMP	START
TB_ANODE:
	.DB	0b10000000,0b01000000,0b00100000,0b00010000
;*******Инициализация*****************************
START:
	LDI	R16,RAMEND
	OUT	SPL,R16		; инициализация стека

	CLR	R_ANODE

	SER	R16
	OUT	DDRD,R16	; настройка порта D
	OUT	DDRA,R16	; настройка порта A
	OUT	DDRB,R16	; настройка порта B
;*************************************************
TEST_ANODE_KEY:
	CLR	ZH
	LDI	ZL,LOW(TB_ANODE*2)
	ADD	ZL,R_ANODE
	LPM	R22,Z
	OUT	PORTB,R22
	COM	R22
	OUT	DDRB,R22
	RCALL	PAUSE

	IN	R_KEY,PINB	; 
	OUT	DDRB,R16
	INC	R_ANODE
	ANDI	R_ANODE,0b00000011

	RJMP	TEST_ANODE_KEY

PAUSE:
	RET
.EXIT
Вложения
KEY.jpg
(37.9 КБ) 505 скачиваний
Друг Кота
Аватара пользователя
Сообщения: 15798
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

В программе обязательно присутствует счетчик знакомест и маска активации знакоместа.
Вот значение первого встречного из нажатых и фиксируется (код согласно счетчика).
На следующем проходе развертки повторно сравниваем статус входной линии - ежли совпало
значит исполняем, ежли нет - пропускаем опрос до конца текущего цикла развертки.
А в следующем - все заново.
Правда при таком варианте "одновременное нажатие нескольких кнопок" отследить затруднительно
- процедура значительно по-сложнее.
:tea:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2022
Зарегистрирован: Вт фев 09, 2010 02:04:53
Откуда: Санкт-Петербург

Сообщение Гефестион »

Ещё такой вопрос - допустимы ли прерывания в прерываниях? У меня используется прерывание по таймеру с частотой 500 Гц для динамической индикации и внешнее прерывание от часовой микросхемы с частотой 1 Гц. По внешнему прерыванию происходит чтение секунд, минут, часов, даты по I2C, и в этот момент динамическая индикация дёргается. Тогда я в обработчике этого прерывания прописал SEI, чтобы разрешить прерывание от таймера. Вроде всё работает, но иногда (раз в несколько часов, иногда раз в сутки) часы начинают глючить. Подозреваю, что это какая-то "коллизия" между прерываниями происходит.
Фак, кот грызёт провод! Сейчас его ударит либо током, либо тапком! ))
Друг Кота
Аватара пользователя
Сообщения: 4906
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Низкоприоритетному прерыванию (секунды) можно включить флаг ISR_NOBLOCK, тогда оно будет прерываться другими. Фактически, то же самое, что Вы сделали, но, что ли, чуть правильнее.

А самый правильный вариант - в прерывании секунд просто взводить какой-нибудь флажок, а уже секунды по I²C вычитывать в основном цикле программы, по наличию этого флага. А по окончании вычитки - сбрасывать этот флаг.
Контактная информация:
Встал на лапы
Сообщения: 106
Зарегистрирован: Чт сен 10, 2015 06:59:03
Откуда: Гродно, BY

Сообщение trofim2 »

И не надо вообще входить в прерывание по секунде, а просто опрашивать его в фоне, и вычитывать по I²C и сбрасывать запрос на прерывание.
Ответить

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