Forum: Mikrocontroller und Digitale Elektronik atmega32 Frequenz am Ausgangspin


von tobi (Gast)


Lesenswert?

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
int main(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?

von Martin (Gast)


Lesenswert?

Nutzt du denn auch den externen Quarz?

von tobi (Gast)


Angehängte Dateien:

Lesenswert?

Denke schon.

Der interne wäre doch wohl nur 1 MHz und damit dann eine Frequenz von 1 
MHz erzeugen würde doch garnicht gehn, oder?

von Watn (Gast)


Lesenswert?

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.

von asm (Gast)


Lesenswert?

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?

von tobi (Gast)


Lesenswert?

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.

von tobi (Gast)


Lesenswert?

IDE ist AVR Studio.

von Stefan E. (sternst)


Lesenswert?

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.

von Stefan E. (sternst)


Lesenswert?

tobi schrieb:
> IDE ist AVR Studio.

Dann schau dir das lss-File unter "Other Files" an.

von tobi (Gast)


Lesenswert?

1
0000008e <main>:
2
#include <avr/io.h>
3
4
int main(void)
5
{
6
  8e:  cf e5         ldi  r28, 0x5F  ; 95
7
  90:  d8 e0         ldi  r29, 0x08  ; 8
8
  92:  de bf         out  0x3e, r29  ; 62
9
  94:  cd bf         out  0x3d, r28  ; 61
10
  DDRA = 0xFF;
11
  96:  8f ef         ldi  r24, 0xFF  ; 255
12
  98:  80 93 3a 00   sts  0x003A, r24
13
14
  for(;;) {
15
    PORTA ^= 1<<PA0;
16
  9c:  80 91 3b 00   lds  r24, 0x003B
17
  a0:  91 e0         ldi  r25, 0x01  ; 1
18
  a2:  89 27         eor  r24, r25
19
  a4:  80 93 3b 00   sts  0x003B, r24
20
  a8:  f9 cf         rjmp  .-14       ; 0x9c <main+0xe>

Wie könnte ich denn am Besten eine möglichst schnelle Frequenz an einem 
Ausgangspin erzeugen?

von Karl H. (kbuchegg)


Lesenswert?

tobi schrieb:

> Wie könnte ich denn am Besten eine möglichst schnelle Frequenz an einem
> Ausgangspin erzeugen?

Timer sind deine Freunde

von spess53 (Gast)


Lesenswert?

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

von tobi (Gast)


Lesenswert?

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?

von Peter D. (peda)


Lesenswert?

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

von tobi (Gast)


Lesenswert?

Das geht dann aber nur an OC9, OC1A, OC1B und OC2 oder? Die Pins wo ich 
eine relativ hohe Frequenz brauche wären alle an PORTA.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> Dieser schwinkt auch richtig.
WAS tut der? Schwinken?

Nein, g ist nicht neben k  SCNR ;-)

von tom (Gast)


Lesenswert?

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 ;-).

von oo (Gast)


Lesenswert?

Schnelle Frequenz?

von Michael U. (amiga)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.