Код: Выделить всё
asm("sei");
asm("cli");
asm("nop");Но кода пытаюсь написать типа
Код: Выделить всё
asm(" sbi PORTB, 5")Помогите пожалуйста договориться с компилятором
Код: Выделить всё
asm("sei");
asm("cli");
asm("nop");Код: Выделить всё
asm(" sbi PORTB, 5")Ну вы загнули! Посмотрите, что делает компилятор и ахнете. Я сам порой сдираю компиляторовские решения.jordan писал(а):все конструкции на СИ для изменения состояния одной ножки порта не сбивая остальные состояния ножек порта, занимаю в разы а то и в десятки машинных тактов больше
Код: Выделить всё
SBI 0x18, 5- спасибо!Engineer_Keen писал(а):(или окно I|O View студии) и скатать оттуда HEX-адрес регистра.
pyzhman писал(а):Ну вы загнули!
Код: Выделить всё
#define cbi(reg, bit) (reg&=~(1<<bit))
#define sbi(reg, bit) (reg|= (1<<bit)) Не знаю, что у Вас с WinAVR и какой ключик оптимизации в makefile. Вот что компилятор сгенерил мне:jordan писал(а):pyzhman и Engineer_Keen Спасибо!- спасибо!Engineer_Keen писал(а):(или окно I|O View студии) и скатать оттуда HEX-адрес регистра.
pyzhman писал(а):Ну вы загнули!
не согласен,Код: Выделить всё
#define cbi(reg, bit) (reg&=~(1<<bit)) #define sbi(reg, bit) (reg|= (1<<bit))
Вот распространенный способ изменения состояния ножки среди радиолюбителей-программистов, и если я не ошибаюсь этот способ приведен в документации WinAvr, но он использует НАМНОГО больше машинных тактов чем тот что я предложил!
Таких способов можно придумать кучу, но быстрее 2 машинных тактов не придумать!
а в общем за ответ спасибо!
PS: что то я не нашёл адреса портов в даташите на atmega32зато в i/o view есть адреса
Код: Выделить всё
PORTD &= ~(1<<PD7);
12a: 5f 98 cbi 0x0b, 7 ; 11
DDRD |= (1<<PD7);
12c: 57 9a sbi 0x0a, 7 ; 10
Если так то тогда конечно это одно и тоже, просто меня сбило с толку куча логических операций в этом выраженииjordan писал(а): PORTD &= ~(1<<PD7);
12a: 5f 98 cbi 0x0b, 7 ; 11
DDRD |= (1<<PD7);
12c: 57 9a sbi 0x0a, 7 ; 10