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, sts
und 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?
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:
gbulmer