Dica: Novas diretivas ANSI C para Assembly

Software e Hardware para ATMEL

Moderadores: 51, guest2003, brasilma

Dica: Novas diretivas ANSI C para Assembly

Mensagempor RobL » 08 Ago 2007 17:00

Para quem trabalha em asm, as diretivas ANSI C, mais recentes do AVRASM2, contempla facilidades à manipulação de bits.
Por exemplo, podemos definir bits com nomes adequados (tudo que eu queria), não havia encontrado e nem visto em exemplo de programas, antigos ou novos.
Nota, a diretiva, #define, só pode ser usada em minúsculo, mesmo se o seu IDE estiver setado para "case sensitive no".
Pode-se usar, para comentários, o mesmo que em C. Deve-se evitar o uso de ";" com as novas diretivas.
Exemplo 1
//Aplicação nas portas ou flags i/o
#define MOTOR_1 PORTB,0
//uso em programa
sbi MOTOR_1 // liga motor da bomba
cbi MOTOR_1 // desliga motor da bomba

Exemplo 2:
// aplicado na manipulação de flags dos bits em registros works.
#define BRILHO R16,(0x0 | 1<<2)
// uso em programa
sbr BRILHO ;seta flag BRILHO, no registro de trabalho
cbr BRILHO ;resseta flag BRILHO, no registro de trabalho

/* A vantagem do uso acima é grande, visto que a instrução sbr, na verdade é uma operação OR entre um registro e o byte de máscara. A instrução "cbr" é uma operação com a negação de AND com o byte de máscara. Essas diretivas evitam a montagem dessa operação a todo instante que se queira manipular bit, especialmente nos registros works.

Cabe observar que quase todos os programas encontrados para AVR ainda trabalham com AVRASM1 e os exemplos acima ficam:
Exemplo 1 com AVRASM1:
.equ MOTOR = 0
;em programa
sbi PORTB,MOTOR ;não é tão trabalhoso, mas é chato.

Exemplo 2 com AVRASM1, o mesmo exemplo acima com AVRASM2:
.equ BRILHO = 0x2 ;bit 2
.def Work = R16
; aplicação em programa
sbr Work, (0x0 | 1<<BRILHO) ;seta flag BRILHO no registro trabalho R16.
cbr Work, ~(0x0 | 1<<BRILHO) ;
;Nestes casos as diretivas ANSI C, do AVRASM2, são muito mais vantajosas.

Pode-se ainda definir com o AVRASM2:

#define A_Circulo(R) (3.14*R*R)
e no programa:
ldi R16, A_Circulo(R) //carregar diretamente R16, com a área do círculo com raio R.
RobL
Dword
 
Mensagens: 1546
Registrado em: 20 Fev 2007 17:56

Voltar para AVR

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

cron

x