Короче, программка :
Код
#include <avr/io.h>
#include <inttypes.h>
#define Btn1 PB2
#define Btn2 PB3
#define KeyMask (1<<Btn1)|(1<<Btn2)
#define sbi(p,b) (p |= (1<<b)) //Установить бит
volatile register int8_t Cnt asm("r19"); // фоновый счетчик
volatile register int8_t a asm ("r16");
int main (void)
{
asm("nop");
a = 1;
while(1)
{
if (~(PINB)&(KeyMask))
{
a |= 0x01;
}
if ((--Cnt)==0)
{
if (a==1 )
{
a=0;
sbi (PINB,PB2);
}
}
}
}
#include <inttypes.h>
#define Btn1 PB2
#define Btn2 PB3
#define KeyMask (1<<Btn1)|(1<<Btn2)
#define sbi(p,b) (p |= (1<<b)) //Установить бит
volatile register int8_t Cnt asm("r19"); // фоновый счетчик
volatile register int8_t a asm ("r16");
int main (void)
{
asm("nop");
a = 1;
while(1)
{
if (~(PINB)&(KeyMask))
{
a |= 0x01;
}
if ((--Cnt)==0)
{
if (a==1 )
{
a=0;
sbi (PINB,PB2);
}
}
}
}
Соответственно , полученный код:
Код
a = 1;
ldi r16, 0x01
while(1)
{
[color="#FF00FF"]if (~(PINB)&(KeyMask))
in r24, 0x16
ldi r25, 0x00
com r24
com r25
andi r24, 0x0C
andi r25, 0x00
or r24, r25
breq .+2[/color]
{
a |= 0x01;
}
ori r16, 0x01
[color="#FF0000"]if ((--Cnt)==0)
mov r24, r19
subi r24, 0x01
mov r19, r24[/color]
brne .-26
{
if (a==1 )
cpi r16, 0x01
brne .-30
{
a=0;
ldi r16, 0x00
sbi (PINB,PB2);
sbi 0x16, 2
rjmp .-36
ldi r16, 0x01
while(1)
{
[color="#FF00FF"]if (~(PINB)&(KeyMask))
in r24, 0x16
ldi r25, 0x00
com r24
com r25
andi r24, 0x0C
andi r25, 0x00
or r24, r25
breq .+2[/color]
{
a |= 0x01;
}
ori r16, 0x01
[color="#FF0000"]if ((--Cnt)==0)
mov r24, r19
subi r24, 0x01
mov r19, r24[/color]
brne .-26
{
if (a==1 )
cpi r16, 0x01
brne .-30
{
a=0;
ldi r16, 0x00
sbi (PINB,PB2);
sbi 0x16, 2
rjmp .-36
Конструкцию if ((--Cnt)==0) выделенную крас.цветом может заменить всего одна машинная команда: dec r19!
Вопрос: как заставить компилятор это делать ?
Во втором случае: if (~(PINB)&(KeyMask)) , невижу смысла во втором парном регистре r25. Можно использовать "tst r24". Можно как нибудь с этим бороться ?!
Не хочеться чтобы потом код получался неоправданно раздутым!
Может быть стоит подождать другую версию компилятора (пользуюсь WinAVR-20100110) или уже пререходить на совсем другой ?