Hallo,
ich habe einen ATmega32 mit einem 16 MHz Quarz. Dieser schwinkt auch
richtig.
Sollte folgende Schleife dann nicht mehr als 1 MHz am Ausgang erzeugen?
1
#include<avr/io.h>
2
3
intmain(void)
4
{
5
DDRA=0xFF;
6
7
for(;;){
8
PORTA^=1<<PA0;
9
}
10
}
Mein Oszi sagt mit 999.822 kHz. Es wird doch zum Setzen des Ports nur 1
Takt benötigt und 2 Takte für den Rücksprung der Schleife. Das müsste
dann doch mehr als 1 MHz sein, oder?
Die angegebenen Zeiten(Takte) stimmen zwar für den Prozessor an sich,
aber stimmen die auch für dein Compilat?
Zeig doch mal was der Compiler daraus macht.
hast du dir denn schon mal den Assemblercode aungeschut, den der
Compiler erzeugt hat? Vielleicht sind es doch mehr als 3 Takte die die
for-Schleife insgesamt braucht... --> 16 Takte?
Wie kann ich es einstellen dass ich den Assembler Code bekomme, den der
Compiler erzeugt?
Nutzt den ggc von WinAVR.
Bekomme nur .o, .eep, .hex und .elf.
Natürlich sind es mehr als 3 Takte.
1 Takt IN
1 Takt EOR
1 Takt OUT
2 Takte Sprung
Außerdem sind für eine komplette Periode 2 Durchläufe nötig, macht also
mindestens 10 Takte, oder bei 16 MHz eine theoretische maximale
Ausgangsfrequenz von 1,6 MHz.
Hi
>Wie könnte ich denn am Besten eine möglichst schnelle Frequenz an einem>Ausgangspin erzeugen?
In Assembler.
ldi r17,0x01
in r16,PinA
aaa: eor r16,r17
out PortA,r16
rjmp aaa
MfG Spess
Aber das Problem mit dem Umschalten des Pins würde doch da immernoch
bestehen.
ldi = 1 Takt
lds = 2 Takte
eor = 1 Takt
sts = 2 Takte
Gesamt also 6 Takte um den Pin zu tooglen. Wie soll mir da ein Timer
helfen?
tobi schrieb:
> Gesamt also 6 Takte um den Pin zu tooglen. Wie soll mir da ein Timer> helfen?
OCR1A = 1;
T1-Modus: clear on compare
OC1A-Pin: toggle on compare
ergibt XTAL / 4
Peter
Na, ich winge Dir mal herzlich zu ;-).
PWM oder TIMER peripherals benutzen und im HW-Design Deine Anforderung
entsprechend berücksichtigen. Wieviel Megaherzen und in welcher
Genauigkeit hättest Du es denn überhaupt gerne, soll das veränderbar per
SW oder fix sein ?
Per portpin-toggle SW geht es dann am schnellsten in asm, aber dann kann
Dein uC auch nix anderes mehr machen als portpins ein+aus, damit es in
Echtzeit passt...
Möglichst single-cycle befehle für ein+ausknipsen der pins/ports
raussuchen und das in shcnellstem loop-konstrukt machen...
Tschüss und winge, winge aus Berling, Tom ;-).
Hallo,
Peter Dannegger schrieb:
> OCR1A = 1;> T1-Modus: clear on compare> OC1A-Pin: toggle on compare>> ergibt XTAL / 4
OCR1A = 0 ergibt XTAL/2...
Gruß aus Berlin
Michael