Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR...

 
Опции темы
Непрочитано 09.04.2015, 18:55  
-vitalik-
Вид на жительство
 
Аватар для -vitalik-
 
Регистрация: 29.03.2009
Адрес: Бровары, Украина
Сообщений: 326
Сказал спасибо: 1,404
Сказали Спасибо 82 раз(а) в 46 сообщении(ях)
-vitalik- на пути к лучшему
Вопрос Сравнивание 3 байт в ассемблере, на WinAVR

Добрый день,
имею необходимость сравнивать 3 байта с определенным числом, причем сделать это на ассемблере.
Вот текст основной программы:
Цитата:
Display_refresh(); //redraw display
assembler(Val1,Val2,Val3,127);
Помимо этого, каждые 16мс переполняется таймер, и запускает АЦП, а по его прерывании, поочередно заполняются переменные Val1,Val2,Val3 размером по 1 байту. (берутся старшые 8 бит от результата преобразования с 3-х потенциометров). Display_refresh() - просто вывод этих переменных на LCD.
Вот ассемблерная вставка:
Цитата:
void static inline assembler(uint8_t reg1, uint8_t reg2, uint8_t reg3, uint8_t value)
{
asm volatile( "cp %0,%3" "\n\t"
"cpc %1,%3" "\n\t"
"cpc %2,%3" "\n\t"
"brlo setoff" "\n\t"
"sbi %4,5" "\n\t"
"rjmp end" "\n\t"
"setoff:" "\n\t"
"cbi %4,5" "\n\t"
"end:" "\n\t"
"nop" "\n\t"
:
:"r" (reg1), "r" (reg2), "r" (reg3), "r" (value), "I" (_SFR_IO_ADDR(PORTC))
);
}
к 5 пину порта С подключен светодиод.
Проблема в том, что сравнивается только значение Val3 ("cpc %2,%3").
Значение val1 и val2 никоим образом не влияют на светодиод.

Собственно, очень интересно, почему так

Проц: Атмега8
Тестирую в протеусе
Реклама:
-vitalik- вне форума  
Непрочитано 09.04.2015, 22:44  
ForcePoint
Почётный гражданин KAZUS.RU
 
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 6,923
Сказал спасибо: 2,985
Сказали Спасибо 3,163 раз(а) в 2,147 сообщении(ях)
ForcePoint на пути к лучшему
По умолчанию Re: Сравнивание 3 байт в ассемблере, на WinAVR

1. А чё надо-то? "Любое из трёх больше 0x7F" или "Все больше 0x7F"? И что получается в протезе?
2. А чё не на Си? Думаете много выиграть на таком мелком куске?
ForcePoint на форуме  
Непрочитано 09.04.2015, 23:03  
Wiza_
Почётный гражданин KAZUS.RU
 
Регистрация: 29.12.2012
Адрес: Питер
Сообщений: 982
Сказал спасибо: 131
Сказали Спасибо 230 раз(а) в 157 сообщении(ях)
Wiza_ на пути к лучшему
По умолчанию Re: Сравнивание 3 байт в ассемблере, на WinAVR

Сообщение от -vitalik- Посмотреть сообщение
необходимость сравнивать 3 байта с определенным числом
А результатом вы что хотите иметь на выходе ? Больше/меньше или тупо "равно" или нет ?
Wiza_ вне форума  
Непрочитано 10.04.2015, 10:30  
-vitalik-
Вид на жительство
 
Аватар для -vitalik-
 
Регистрация: 29.03.2009
Адрес: Бровары, Украина
Сообщений: 326
Сказал спасибо: 1,404
Сказали Спасибо 82 раз(а) в 46 сообщении(ях)
-vitalik- на пути к лучшему
По умолчанию Re: Сравнивание 3 байт в ассемблере, на WinAVR

val1, val2, val3 - в перспективе будут 3-мя байтами одного числа.
Переменная Value (%3) - тоже будет 3 байтным числом.
Задача будет прибавлять к числу value1:value2:value3 некоторее значение, пока value1:value2:value3 меньше некоего 3 байтного числа.

Но это сейчас не столь важно. почему же "cpc %2,%3" "\n\t" не учитывает значение флага С после предшествующих сравнений?
-vitalik- вне форума  
Непрочитано 10.04.2015, 11:13  
nml
Супер-модератор
 
Аватар для nml
 
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,378
Сказал спасибо: 1,956
Сказали Спасибо 1,328 раз(а) в 578 сообщении(ях)
nml на пути к лучшему
По умолчанию Re: Сравнивание 3 байт в ассемблере, на WinAVR

CPC предназначена для сравнения многобайтных ( ›1 байта ) чисел. В вашем случае признаки останутся от последнего сравнения, к тому же будут недостоверными из-за возможного вмешательства С бита.

К тому же не вижу синхронизации сравнения с окончанием преобразования (16 мс - первое, 16 мс - второе, 16 мс - третье, и тут можно сравнивать)
__________________
[ жизнь приятна и красива, если выпить литр пива ]
nml вне форума  
Непрочитано 10.04.2015, 12:32  
-vitalik-
Вид на жительство
 
Аватар для -vitalik-
 
Регистрация: 29.03.2009
Адрес: Бровары, Украина
Сообщений: 326
Сказал спасибо: 1,404
Сказали Спасибо 82 раз(а) в 46 сообщении(ях)
-vitalik- на пути к лучшему
По умолчанию Re: Сравнивание 3 байт в ассемблере, на WinAVR

Разобрался.
Вызываю процедуру вот так:
Цитата:
assembler(Val1,Val2,Val3,255,127,0);
Трехбайтное число, каждый байт которого можно менять потенциометрами, сравнивается с 007FFF. Если оно больше, светодиод горит.
Ассемблерная процедурка:
Цитата:
void static inline assembler(uint8_t reg1, uint8_t reg2, uint8_t reg3, uint8_t value1, uint8_t value2, uint8_t value3)
{
asm volatile(
"cp %0,%3" "\n\t"
"cpc %1,%4" "\n\t"
"cpc %2,%5" "\n\t"
"brlo setoff" "\n\t"
"sbi %6,5" "\n\t"
"rjmp end" "\n\t"
"setoff:" "\n\t"
"cbi %6,5" "\n\t"
"end:" "\n\t"
"nop" "\n\t"
:
:"r" (reg1), "r" (reg2), "r" (reg3), "r" (value1), "r" (value2), "r" (value3), "I" (_SFR_IO_ADDR(PORTC))
);
}
А я просто сравнивал Val1,Val2,Val3 с 3F3F3F. Понятное дело, что если Val3 меньше 3F, то значения Val1,Val2 аж никак не зажгут светодиод.

Вот так вот, нужно больше спать

Последний раз редактировалось -vitalik-; 10.04.2015 в 12:41.
-vitalik- вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Самодельный круиз-контроль gnomon72 Электроника средств транспорта 5391 14.07.2024 15:47
Подниму тему WinAVR vs IAR oleg110592 Микроконтроллеры, АЦП, память и т.д 5 24.10.2015 14:06
Помогите с ЦАП AD7708/AD7718 или их аналогами ST_Senya Микроконтроллеры, АЦП, память и т.д 9 30.11.2009 19:03
Задание массива во Flash AVR на Си в AVRStudio + WinAVR zelen536 Микроконтроллеры, АЦП, память и т.д 14 07.09.2007 10:45
[Решено] Всем эмбеддерам посвящается... Decan Отвлекитесь, эмбеддеры! 0 24.10.2005 14:43


Часовой пояс GMT +4, время: 13:34.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot