AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
09.04.2015, 18:55
|
|
Вид на жительство
Регистрация: 29.03.2009
Адрес: Бровары, Украина
Сообщений: 326
Сказал спасибо: 1,404
Сказали Спасибо 82 раз(а) в 46 сообщении(ях)
|
Сравнивание 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
Тестирую в протеусе
|
|
|
|
09.04.2015, 22:44
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 6,923
Сказал спасибо: 2,985
Сказали Спасибо 3,163 раз(а) в 2,147 сообщении(ях)
|
Re: Сравнивание 3 байт в ассемблере, на WinAVR
1. А чё надо-то? "Любое из трёх больше 0x7F" или "Все больше 0x7F"? И что получается в протезе?
2. А чё не на Си? Думаете много выиграть на таком мелком куске?
|
|
|
|
09.04.2015, 23:03
|
|
Почётный гражданин KAZUS.RU
Регистрация: 29.12.2012
Адрес: Питер
Сообщений: 982
Сказал спасибо: 131
Сказали Спасибо 230 раз(а) в 157 сообщении(ях)
|
Re: Сравнивание 3 байт в ассемблере, на WinAVR
Сообщение от -vitalik-
|
необходимость сравнивать 3 байта с определенным числом
|
А результатом вы что хотите иметь на выходе ? Больше/меньше или тупо "равно" или нет ?
|
|
|
|
10.04.2015, 10:30
|
|
Вид на жительство
Регистрация: 29.03.2009
Адрес: Бровары, Украина
Сообщений: 326
Сказал спасибо: 1,404
Сказали Спасибо 82 раз(а) в 46 сообщении(ях)
|
Re: Сравнивание 3 байт в ассемблере, на WinAVR
val1, val2, val3 - в перспективе будут 3-мя байтами одного числа.
Переменная Value (%3) - тоже будет 3 байтным числом.
Задача будет прибавлять к числу value1:value2:value3 некоторее значение, пока value1:value2:value3 меньше некоего 3 байтного числа.
Но это сейчас не столь важно. почему же "cpc %2,%3" "\n\t" не учитывает значение флага С после предшествующих сравнений?
|
|
|
|
10.04.2015, 11:13
|
|
Супер-модератор
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,378
Сказал спасибо: 1,956
Сказали Спасибо 1,328 раз(а) в 578 сообщении(ях)
|
Re: Сравнивание 3 байт в ассемблере, на WinAVR
CPC предназначена для сравнения многобайтных ( ›1 байта ) чисел. В вашем случае признаки останутся от последнего сравнения, к тому же будут недостоверными из-за возможного вмешательства С бита.
К тому же не вижу синхронизации сравнения с окончанием преобразования (16 мс - первое, 16 мс - второе, 16 мс - третье, и тут можно сравнивать)
__________________
[ жизнь приятна и красива, если выпить литр пива ]
|
|
|
|
10.04.2015, 12:32
|
|
Вид на жительство
Регистрация: 29.03.2009
Адрес: Бровары, Украина
Сообщений: 326
Сказал спасибо: 1,404
Сказали Спасибо 82 раз(а) в 46 сообщении(ях)
|
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.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 13:34.
|
|