Assembly XMEGA-Programm, das einen länger als erwarteten Pin-Toggle erzeugt?

Ich versuche, den schnellstmöglichen Pin-Toggle auf einem XMEGA32E5 durchzuführen, der mit 32 MHz läuft. Mein Code ist wie folgt:

.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!

Laut Atmel sollten die Anweisungen, die geloopt werden, stsund rjmp, jeweils zwei Zyklen dauern. Wenn ich jedoch einen der beiden Pins prüfe, die umgeschaltet werden, beträgt die Wellenlänge 2 Mikrosekunden oder ein halbes MHz. Dies ist viel niedriger als der 32-MHz-Takt. Was vermisse ich? Gibt es einen besseren Weg, dies zu tun?

Ist das das ganze Programm? Oder gibt es einen anderen ASM-Code, der Setup-Sachen macht? Bitte alles posten (nur PLZ die vor MAIN geführt wird).

Antworten (1)

Es sieht so aus, als würde die XMEGA E-Familie standardmäßig den internen 2-MHz-Oszillator verwenden, der tatsächlich vom 8-MHz-Oszillator heruntergeteilt ist.

Aus Abschnitt 7.2 des Handbuchs :

Nach dem Zurücksetzen startet das Gerät immer mit dem 2-MHz-Ausgang des internen 8-MHz-Oszillators.

Um den internen 32-MHz-Oszillator zu verwenden, müssen Sie das Oszillator-Steuerregister CTRL explizit ändern:

Geben Sie hier die Bildbeschreibung ein