реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Инкремент 2 пин в порте, цикл по таблице истенности
TamTam
сообщение Mar 15 2006, 08:11
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 293
Регистрация: 14-03-06
Пользователь №: 15 254



вопрос ка зделать так

есть 2 пина к примеру PORTB.2 и PORTB.3

надо в одну строчьку уложиться

примерно так если сумма пинов 00 увеличить до 01 если 10 увеличить до 11 если 11 то 00
Go to the top of the page
 
+Quote Post
Petka
сообщение Mar 15 2006, 08:34
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 453
Регистрация: 23-08-05
Пользователь №: 7 886



Цитата(TamTam @ Mar 15 2006, 11:11) *
вопрос ка зделать так

есть 2 пина к примеру PORTB.2 и PORTB.3

надо в одну строчьку уложиться

примерно так если сумма пинов 00 увеличить до 01 если 10 увеличить до 11 если 11 то 00


// вариант 1
PORTB+=4; // это минимальным количеством инструкций

// вариант 2
PORTB=(( (PORTB+1<<2) & (3<<2) )) | (PORTB& ~(3<<2)); // более правильно, без порчи других пинов

Сообщение отредактировал Petka - Mar 15 2006, 08:40
Go to the top of the page
 
+Quote Post
defunct
сообщение Mar 15 2006, 08:49
Сообщение #3


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(TamTam @ Mar 15 2006, 10:11) *
вопрос ка зделать так

есть 2 пина к примеру PORTB.2 и PORTB.3

надо в одну строчьку уложиться


на ассемблере пришло в голову следующее решение, может быть можно и за меньшее число команд.. однако, одной командой точно такое не сделать.

Код
.def AL = R16

.macro IncBits23OfPortB
    in   AL, PortB
    bst  AL, 4; сохранить bit4
    andi AL, ~(1 << 4); погасить bit4 (чтобы не было переполнения при инкременте
    subi AL, -4  ; прибавить 4
    bld  AL, 4; восстановить bit4
    out  PortB, AL
.endmacro


Казалось бы простенькая задачка, ан нет.. чтобы получить решение в общем виде целая куча команд нужна и 2 вспомогательных регистра.

Код
.def  AL = R16
.def  AH = R17

.macro IncBits23OfPortB2
    in   AL, PortB
    mov  AH, AL
    subi AL, -4
    andi AH, ~( (1 << 2)|(1 << 3) )
    andi AL,    (1 << 2)|(1 << 3)
    or   AL, AH
    out  PortB, AL
.endmacro


Сообщение отредактировал defunct - Mar 15 2006, 22:21
Go to the top of the page
 
+Quote Post
vet
сообщение Mar 15 2006, 08:50
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



(!(PORTB.2 = ~PORTB.2))? PORTB.3 = ~PORTB.3;
CodeVision, однако smile.gif


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
TamTam
сообщение Mar 15 2006, 09:05
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 293
Регистрация: 14-03-06
Пользователь №: 15 254



Цитата(Petka @ Mar 15 2006, 11:34) *
Цитата(TamTam @ Mar 15 2006, 11:11) *

вопрос ка зделать так

есть 2 пина к примеру PORTB.2 и PORTB.3

надо в одну строчьку уложиться

примерно так если сумма пинов 00 увеличить до 01 если 10 увеличить до 11 если 11 то 00


// вариант 1
PORTB+=4; // это минимальным количеством инструкций

// вариант 2
PORTB=(( (PORTB+1<<2) & (3<<2) )) | (PORTB& ~(3<<2)); // более правильно, без порчи других пинов


а можно второй вариант расписать, у меня он почемуто не работает.

Цитата(vet @ Mar 15 2006, 11:50) *
(!(PORTB.2 = ~PORTB.2))? PORTB.3 = ~PORTB.3;
CodeVision, однако smile.gif

чето оно не компилиться
Go to the top of the page
 
+Quote Post
vet
сообщение Mar 15 2006, 09:13
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



Цитата(TamTam @ Mar 15 2006, 12:05) *
чето оно не компилиться

Да, это я с сишным синтаксисом напутал. Перепишем так:
if (!(PORTB.2 = ~PORTB.2)) PORTB.3 = ~PORTB.3;

ну, или если if не считать одной строчкой smile.gif то перепишу исходный вариант:

(!(PORTB.2 = ~PORTB.2))? (PORTB.3 = ~PORTB.3) : 0;


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
Petka
сообщение Mar 15 2006, 09:15
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 453
Регистрация: 23-08-05
Пользователь №: 7 886



Цитата(Petka @ Mar 15 2006, 11:34) *
// вариант 2
PORTB=(( (PORTB+1<<2) & (3<<2) )) | (PORTB& ~(3<<2)); // более правильно, без порчи других пинов


лень разбираться с приоритетами. попробуй так

PORTB=(( (PORTB+(1<<2)) & (3<<2) )) | (PORTB& (~(3<<2))); // более правильно, без порчи других пинов

или без выпендрёжей:
PORTB=((PORTB+0b100) & 0b1100 ) | (PORTB & 0b11110011);

Сообщение отредактировал Petka - Mar 15 2006, 09:17
Go to the top of the page
 
+Quote Post
TamTam
сообщение Mar 15 2006, 09:34
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 293
Регистрация: 14-03-06
Пользователь №: 15 254



[/quote]

лень разбираться с приоритетами. попробуй так

PORTB=(( (PORTB+(1<<2)) & (3<<2) )) | (PORTB& (~(3<<2))); // более правильно, без порчи других пинов

или без выпендрёжей:
PORTB=((PORTB+0b100) & 0b1100 ) | (PORTB & 0b11110011);
[/quote]


вот последнее заработало, ОГРОМНОЕ СЕНЬКС
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 09:48
Рейтинг@Mail.ru


Страница сгенерированна за 0.0142 секунд с 7
ELECTRONIX ©2004-2016