¿El programa XMEGA de ensamblado está creando un pin toggle más largo del esperado?

1

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?

    
pregunta erg

1 respuesta

4

Parece que la familia XMEGA E utiliza por defecto el oscilador interno de 2MHz, que en realidad está dividido desde el oscilador de 8MHz.

De la sección 7.2 de manual :

  

Después del reinicio, el dispositivo siempre comenzará a funcionar desde la salida de 2MHz del oscilador interno de 8MHz.

Para utilizar el oscilador interno de 32MHz, necesita modificar explícitamente el CTRL del registro de control del oscilador:

    
respondido por el Dan Laks

Lea otras preguntas en las etiquetas