Delay no winavr

Software e Hardware para ATMEL

Moderadores: 51, guest2003, brasilma

Delay no winavr

Mensagempor sandrini » 01 Ago 2007 22:20

Caros colegas,

Há algum tempo venho tentando buscar alternativas para implementar uma rotina de atraso onde eu consiga 1 microsegundo em clock de 4MHz com o winavr... e até agora não consegui nada... o mínimo que consegui foi 3,5us utilizando a biblioteca delay_basic.h.
Estive verificando outros compiladores, CodeVision, Bascom e MikroPascal e em todos eles eu consigo esse tempo de 1us....

Bem gostaria de saber se alguém tem idéia de como fazer este delay no winavr... se é possível mesmo....

Grato pela atenção....
sandrini
Nibble
 
Mensagens: 65
Registrado em: 12 Out 2006 10:16

Mensagempor RobL » 01 Ago 2007 22:43

Problema!!!
Uma instrução ret leva 4 ciclos 1us em máquinas com PC com 16bits (até 64K) e 5 ciclos em máquinas com 22bits.

Uma instrução rjmp 2 ciclos (0,5 us).

O jeito seria fazer uma chamada em assembler, caso esteja em C com uma instrução ret somente:
# asm
ret
Mas somente se seu PC não é maior que 16bits.

Ou um goto (rjmp) para um endereço e outro rjmp voltando para a linha abaixo da chamada para asm.

Sem chamada (rcall), tentar na sequência do código 4 instruções nop (1us).

Outra forma somente aumentando a freqüência do clock.
Deve ser por isso que o compilador esteja com dificuldade.
RobL
Dword
 
Mensagens: 1546
Registrado em: 20 Fev 2007 17:56

Mensagempor RobL » 01 Ago 2007 22:53

Lendo melhor, você só não conseguiu no WinAvr. Tente ler o código gerado nos outros compiladores e use em asm o que foi gerado para 1us. Suponho que não se consiga delay menor que 1us. Suponho, pois sempre alguém pode ter uma idéia melhor.
Veja se quando gerou esse código o micro selecionado era o mesmo modelo usado para o WinAvr, pois com 22 bits de PC, algumas instruções levam mais tempo e pode não ter como gerar 1us.

Desculpe o "é" no lugar do "for" no post anterior.
RobL
Dword
 
Mensagens: 1546
Registrado em: 20 Fev 2007 17:56

Mensagempor sandrini » 02 Ago 2007 08:46

Obrigado RobL,

Eu verifiquei e cuidei para que fosse sempre o mesmo micro (atmega16) em todos os compiladores e com a mesma frequência de clock (4MHz)...

Eu estou pensando em até mudar de compilador... gastar um pouco e comprar um compilador onde eu possa executar sem problemas algumas rotinas de tempo.

Vou tentar fazer uma chamada em assembler... mas mesmo assim acho que vai ser difícil, pois quando você desvia (faz uma chamada a outra função, tipo delay_us(1)), já são gastos 1,5us.

Se eu conseguir melhorar este delay, vou postar aqui, ok?
sandrini
Nibble
 
Mensagens: 65
Registrado em: 12 Out 2006 10:16

Mensagempor Maurício » 02 Ago 2007 15:43

Quatro NOPs não resolvem?

[]'s
"Não leve a vida tão à sério, afinal, nenhum de nós sairá vivo, dela!"
Avatar do usuário
Maurício
Word
 
Mensagens: 678
Registrado em: 14 Out 2006 17:23
Localização: São Paulo - SP

Mensagempor styg » 03 Ago 2007 19:59

a base das minhas rotinas de delay para avr eh esse codigo que catei nuns codigos do avr gcc.

void avr_delay_us(unsigned char us)
{
__asm__ volatile (
"1: dec %0" "\n\t"
"brne 1b"
: "=r" (us)
: "0" (us)
);
}
Lucas
Avatar do usuário
styg
Word
 
Mensagens: 799
Registrado em: 16 Out 2006 08:24
Localização: Floripa abaixo de zero.


Voltar para AVR

Quem está online

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

x