Estoy intentando hacer el cambio de pin más rápido posible en un XMEGA32E5 que se ejecuta a 32MHz. Mi código es el siguiente:
.include "ATxmega32E5def.inc"
.ORG 0x0000 ;Code starts running from address 0x0000.
rjmp MAIN ;Relative jump to start of program.
.ORG 0x0100 ;Start program at 0x0100 so we don't overwrite vectors that are at 0x0000-0x00FD
MAIN:
ldi R17, 0x3 ;set R17 to 11
sts PORTA_DIRSET, R17 ;set all the GPIO's in the four bit PORTA as outputs
LOOP:
sts PORTA_OUTTGL, R17 ;toggle the state of all the pins in PORTA
rjmp LOOP ;repeat forever!
Según Atmel, las instrucciones que están en bucle, sts
y rjmp
, deben tomar dos ciclos cada una. Sin embargo, cuando pruebo cualquiera de los dos pines que se están alternando, la longitud de onda es de 2 microsegundos, o medio MHz. Esto es mucho más bajo que el reloj de 32MHz. ¿Qué me estoy perdiendo? ¿Hay una mejor manera de hacer esto?