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

Обсуждаем контроллеры компании Atmel.
Ответить
Друг Кота
Аватара пользователя
Сообщения: 4964
Зарегистрирован: Сб май 05, 2012 20:19:55
Откуда: Минск

Сообщение Seriyvolk »

Тагды так
LDI r16, 255-((1<<Bit1)|(1<<Bit2))
И всё равно указанные биты запишутся нулями.
Прибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 20093
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

Seriyvolk писал(а):LDI r16, 255-((1<<Bit1)|(1<<Bit2))
Наверное, проще так LDI r16, ~((1<<Bit1)|(1<<Bit2))
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4964
Зарегистрирован: Сб май 05, 2012 20:19:55
Откуда: Минск

Сообщение Seriyvolk »

Да, способов масса, и все хороши! :))
Между тем, есть ещё вопрос по работе с датчиком температуры 18В20.
Принципы отправки и приёма информации по шине мне в принципе понятны, вот непонятно как именно с этим датчиком работать. Даташит большой, инфа в нём структурирована плохо, поэтому самостоятельно разобраться не получилось.
Итак, проц стартует... Нужна ли датчику начальная инициализация (допустим как, например, дисплею 44780)? Если нужна, то что ему слать и в какой последовательности?
И второй вопрос: какая должна быть последовательность команд для простого считывания температуры? (датчик один)
Спасибо заранее!
Прибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.
Мучитель микросхем
Аватара пользователя
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Сообщение unalex »

Seriyvolk писал(а):по работе с датчиком температуры 18В20
http://chipenable.ru/index.php/programm ... ast-1.html
http://chipenable.ru/index.php/programm ... ast-2.html
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Реклама
Эиком - электронные компоненты и радиодетали
akl
Друг Кота
Сообщения: 4450
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Seriyvolk писал(а):... Нужна ли датчику начальная инициализация... какая должна быть последовательность команд для простого считывания температуры? (датчик один)
Сброс датчика низким уровнем на шине на время >480мкс -> отпускание линии -> через 60 мкс опрос низкого уровня от датчика при его наличии -> если низкого уровня нет, то нет и датчика; если есть, то дождаться когда датчик отпустит линию -> выдать команду SKIP ROM (0xCC) -> выдать команду начала измерения температуры Convert T (0x44); при паразитном питании подключить линию к питанию и выдержать паузу; при постоянном питании окончание преобразования можно контролировать появлением 1 на шине -> сбросить датчик -> выдать команду SKIP ROM (0xCC) -> выдать команду чтения памяти (0xBE) -> прочитав 2 байта температуры сбросить датчик. Обмен ведётся байтами младшими битами вперёд.
Реклама
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Seriyvolk, прикладываю фай программы с моими часами. Всё раскомментировано, работу с датчиком тоже хорошо видно (начинается со строки 1300).
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4964
Зарегистрирован: Сб май 05, 2012 20:19:55
Откуда: Минск

Сообщение Seriyvolk »

Спасибо всем! Насколько мне понятно - никакой предварительной инициализации датчику не нужно.
Сначала ресет-скип ром-запустить конверт темп, потом подождать и ресет-скип ром- считать темп. Так будет правильно?
ploop, а с чем у тебя в коде связано формирование такой точной задержки в 1uS? Только с тем, что из неё формируются все остальные? Датчику ведь даже между битами не нужны такие точные интервалы, там вродя от 1 до 12 uS окно :dont_know:
Прибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Seriyvolk писал(а):Датчику ведь даже между битами не нужны такие точные интервалы, там вродя от 1 до 12 uS окно
Не помню уже, но вроде при передаче бита. Да и код работы с ним не весь мой, сам алгоритм слизан у ARV
Во всяком случае датчик замечательно работает 2 года на 30-метровой лапше рядом с силовыми проводами :)
Друг Кота
Аватара пользователя
Сообщения: 20093
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

Кстати, по идее можно извратиться и использовать UART для 1-wire :)
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Друг Кота
Аватара пользователя
Сообщения: 4964
Зарегистрирован: Сб май 05, 2012 20:19:55
Откуда: Минск

Сообщение Seriyvolk »

Да, мне говорили. Вот только для этой затеи не было у меня 2 свободные ноги МК.
Прибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.
Друг Кота
Аватара пользователя
Сообщения: 4964
Зарегистрирован: Сб май 05, 2012 20:19:55
Откуда: Минск

Сообщение Seriyvolk »

Всем привет опять! Уж простите, что так плотно данную тему оккупировал :oops: , но иных вариантов нет :)) И за второй пост тож простите, но если я поправлю предыдущий - его никто не почитает...
Бросьте в меня идеей пожалуйста, если не сложно... В общем, ща мучаюсь как бы правильней организовать алгоритм опроса кнопок с дальнейшим альтернативным действием по удержанию.
К примеру хочется, чтобы при нажатии на "+" сначала плюсовалась одна секунда, потом секунды начинали тикать в плюс всё быстрее и быстрее. Аналогично и с минусом.
Есть таймер, который тикает каждую секунду, думаю можно его для этого приспособить. У самого идеи кончились, надеюсь на помощь более опытных товарищей...
Алгоритм опроса кнопок выглядит так:
Спойлер

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

//------------------------------------------------------------------------------
;-----------------------------------------------
; PUSH_KEY - процедура чтения клавиатуры
;-----------------------------------------------

PUSH_KEY:
		IN		R16,PIND
		ANDI	R16,0b00011111
		PUSH	R16
		ldi		DelayBuf,255			;формируем задержку времени 640 мкс
		rcall	delay
		IN		R16,PIND
		ANDI	R16,0b00011111
		POP		R17
		CPSE	R16,R17
		RET
		CPI		R16,0b00011111
		BREQ	EXIT
		SBRS	R16,Plus
		RCALL	TimePlus
		SBRS	R16,Minus
		RCALL	TimeMinus
		SBRS	R16,Enter
		RJMP	Run_Stop
		SBRS	R16,Preset
		RJMP	Preset_Load_Store
EXIT:	CBR 	FLAG,1<<PushedKey
		CLR		HoldCount
EndPK:	RET

TimePlus:
		SBRC	FLAG,Run		; Если мы попали сюда и таймер запущен
		RET						; то просто выходим
		CPI	HTime,99
		BRSH	EndTP
		ADIW	HTime:LTime,1
		CPI	LTime,60
		BRLO	EndTP
		LDI	LTime,255
		ADIW	HTime:LTime,1
EndTP:	SBR 	FLAG,(1<<TimeUpdate)|(1<<PushedKey)
		
RET

TimeMinus:
		SBRC	FLAG,Run		; Если мы попали сюда и таймер запущен
		RET						; то просто выходим
		CPSE	LTime,Zero
		RJMP	TimeMinusINT	
		CPSE	HTime,Zero
		RJMP	TimeMinusINT
		RJMP	EndTM	
TimeMinusINT:
		SBIW	HTime:LTime,1
		CPI	LTime,60
		BRLO	EndTM
		LDI	LTime,59
EndTM:	SBR 	FLAG,(1<<TimeUpdate)|(1<<PushedKey)
RET
Прибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.
Друг Кота
Аватара пользователя
Сообщения: 20093
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

Seriyvolk писал(а):но если я поправлю предыдущий - его никто не почитает...
Можно скопировать текст сообщения, удалить его и написать новое, вставив туда текст старого и добавив нового текста.
А про кнопку есть отдельная тема: http://radiokot.ru/forum/viewtopic.php?f=61&t=79801
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Друг Кота
Аватара пользователя
Сообщения: 4964
Зарегистрирован: Сб май 05, 2012 20:19:55
Откуда: Минск

Сообщение Seriyvolk »

За ссыль спасибо :beer: , а вот кнопка удаления если у тебя не пропадает никогда, то у меня она через часок исчезает. Вот такая каверзная ситуация. :dont_know:
Прибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.
Родился
Сообщения: 1
Зарегистрирован: Пн фев 10, 2014 11:32:52

Сообщение grinya »

не могу найти команду xor (исключающее ИЛИ) под ATmega8
Мучитель микросхем
Аватара пользователя
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Сообщение unalex »

grinya писал(а):(исключающее ИЛИ) под ATmega8
EOR
http://www.gaw.ru/html.cgi/txt/doc/micr ... sm/eor.htm
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Первый раз сказал Мяу!
Сообщения: 26
Зарегистрирован: Ср дек 09, 2009 15:07:13

Сообщение vik1977ck »

Прошу помощи опытных котов- а то уже сам себя запутал.. :o
Значит пишу программку под МЕГУ8- терморегулятор для электроплитки - и вот засада- температура будет от 0- до 420 градусов.. посоветуйте как лучше обрабатывать числа больше 256.. Старший байт,младший байт и смещение? Данные будут хранится в трех байтных переменных ..
Друг Кота
Аватара пользователя
Сообщения: 20093
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

vik1977ck писал(а):Старший байт,младший байт и смещение?
Эээ, какое смещение? 9 бит = 512 градусов, 9-й бит в старшем байте, остальные 8 — в младшем.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Нужно складывать это значение в переменную, размерность которой превышает байтовую величину. Например integer. На у если на ассемблере (на что очень смахивает запрос), то ручками/лапками.
Docendo discimus
Контактная информация:
Первый раз сказал Мяу!
Сообщения: 26
Зарегистрирован: Ср дек 09, 2009 15:07:13

Сообщение vik1977ck »

Gudd-Head писал(а):
vik1977ck писал(а):Старший байт,младший байт и смещение?
Эээ, какое смещение? 9 бит = 512 градусов, 9-й бит в старшем байте, остальные 8 — в младшем.
Да... вот смотрите- измерил я с помощью АЦП температуру - например 2,507 вольт -там термопара через ОУ- и вот теперь мне нужно сделать из этого числа температуру- перевести в градусы - я знаю что при 2,507 -это 366 градусов по Цельсию- сравнить с константой которая внесена в ОЗУ- типа ограничение при котором выключиться симистор и вывести показания на 4-рядный семи сегментный дисплей- вот тут и попал в засаду- умственную.. :)) Как это все организовать- например загоняем показания АЦП в регистры R16 старший байт -R17- младший байт - и начинаем преобразовывать? вот этого я не могу понять.. :cry:
Первый раз сказал Мяу!
Сообщения: 26
Зарегистрирован: Ср дек 09, 2009 15:07:13

Сообщение vik1977ck »

pyzhman писал(а):Нужно складывать это значение в переменную, размерность которой превышает байтовую величину. Например integer. На у если на ассемблере (на что очень смахивает запрос), то ручками/лапками.
Да на ассемблере пишу- как-то с самого начала у меня с СИ и с PIC не срослось... :) Вот создал я переменную например 3 -байтную.. а как ее сравнивать? вот тут не могу понять- как ее пихать в регистры? Вы уж не пинайте сильно- элементарные вещи спрашиваю- но не могу понять..
Ответить

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