mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Programmgeschwindigkeit bim XMEGA viel kleiner als Taktfrequenz?


Autor: Edimahler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, nun mal eine Frage an alle XMEGA-Experten:

Wenn ich folgendes Miniprogramm:
  cli();            // disable global Interrupts

  PORTCFG.CLKEVOUT = 0x02;
  while(1)
  {
    PORTE.OUT |= 0x02;
    PORTE.OUT &= 0xFD;
  }

auf meinen XMEGA32A4 lade, bekomme ich bei einem Systemtakt von 32MHz 
(intern oder extern egal) nur gerade ein Ausgangssignal mit ca. 2.6MHz 
auf PORTE.
- Der Code wurde in AVR Studio mit -Os optimiert, sollte demnach sehr 
schnell sein.
- Clock Prescaler sind alle ausgeschaltet.
- Die "Ein-" Phase vom Portpin dauert 6 Taktzyklen, die "Aus-" Phase 8 
Taktzyklen (durch den Rücksprung im while(1) bedingt).
- An PORTD7 lasse ich das Taktsignal des CPUs ausgeben, dieses beträgt 
32MHz, wie es sein sollte.

Was zum Geier mache ich bloss falsch? Thanks für jede Hilfe!
Simon

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine C Zeile entspricht immer mehreren Maschinenbefehlen.
Du kannst :
- Den Assembler-Code anschauen und für die einzelnen Befehle die 
benötigten Taktzyklen laut Datenblatt zusammenzählen.
- Du lädst das Programm in AVR Studio und simulierst das Programm Step 
by Step. Der Simulator zeigt Dir die abgelaufenen Taktzkylen an.

Autor: Daniel V. (danvet)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt hast du dir selbstein Bein gestellt:

32MHz /14Zyklen = 2,3MHz

Voila. Stimmt doch..??!!

Autor: R. M. (exp)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
passt doch

T = 1 / 32000000  [s]

Fport = 1 / (14 * T) = 2 285 714.286 [1/s] = 2.28 MHz

Autor: Maik Werner (werner01)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hihihi

Autor: Udo R. S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du musst mit der Compileroption -assembler übersetzen, dann ists 
schneller :-)

Autor: Udo R. S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder die neuen Prozessoren mit dem 'C'-Stepping nehmen. Die können 
direkt C-Befehle in einem Taktzyklus ausführen.

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oder statt direkt auf das Ausgangsregister zu schreiben:
>PORTE.OUT |= 0x02;
Das Register zum setzen des Ausgangs beschreiben. Dann muss das 
Ausgangsregister nicht geladen und verodert werden.

PORTE.OUTSET = 0x02;

Beim löschen des Bits entsprechend

PORTE.OUTCLR = 0x02

oder gleich Toggeln

PORTE.OUTTGL = 0x02

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ach ja:
Die Register .OUTSET , .OUTCLR usw. schreiben sich selbstständig nach 
dem Ausführen des Befehls auf 0x00 zurück. Liest man diese Register, 
entspricht das glaube ich dem Wert des .IN Registers.

Wenn du das so machst, wird dein Programm etwa doppelt so schnell sein.

Autor: Edimahler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wow, thanks für die vielen Hinweise!

Daniel V. schrieb:
> Jetzt hast du dir selbstein Bein gestellt:
>
> 32MHz /14Zyklen = 2,3MHz
>
> Voila. Stimmt doch..??!!

Ja, ist mir bewusst, mir gehts mehr darum, weshalb wo viele Taktzyklen 
verbraucht werden für eine Veroderung und Signalausgabe. Bei den 
AVR-Typen entsprechen ja die meisten (Assembler-)Befehle einem Takt. Und 
ich war erstaunt, dass der Unterschied zwiscehn C und Assembler trotz 
Optimierung und so einfachem Programm solch riesige Unterschiede bringen 
soll...



Maik Werner schrieb:
> hihihi

Dies war besonders geist- und hilfreich, danke! ;-)



Danke für die Hinweise mit dem "-assembler" und dem "PORTE.OUTSET" etc.!



Udo R. S. schrieb:
> Oder die neuen Prozessoren mit dem 'C'-Stepping nehmen. Die können
> direkt C-Befehle in einem Taktzyklus ausführen.

Dies klingt ebenfalls sehr interessant, wird aber von den XMEGAs nicht 
unterstützt, oder liege ich falsch?

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Edimahler schrieb:
> Dies klingt ebenfalls sehr interessant, wird aber von den XMEGAs nicht
> unterstützt, oder liege ich falsch?

du weisst, welcher Tag heute ist?

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>ich war erstaunt, dass der Unterschied zwiscehn C und Assembler trotz
>Optimierung und so einfachem Programm solch riesige Unterschiede bringen
>soll...

In Assembler bist du, so wie du das Programm geschrieben hast, nicht 
schneller.

Autor: Edimahler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Justus Skorps schrieb:
> du weisst, welcher Tag heute ist?

Upps... ;-) Schade eigentlich...



"ich" schrieb:
> In Assembler bist du, so wie du das Programm geschrieben hast, nicht
> schneller.
>
>
>
>

Hmm, liesse sich dies doch so einfache Progrämmchen tatsächlich noch 
vereinfachen? Wie denn?

Autor: Edimahler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...aha ja, eben, .OUTSET / .OUTCLR usw.

Die Takte haben sich auf 3 und 5 (inkl. Programmrücksprung) reduziert, 
thanks!

Werde mich dann mal in Assembler in WinAVR einlesen müssen, habe dies 
bisher immer nur eigenstänig benutzt, ohne Einbindung in C.

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Hmm, liesse sich dies doch so einfache Progrämmchen tatsächlich noch
>vereinfachen? Wie denn?

Das hab ich nicht behauptet. Mit DIESEN (Ausgang laden, verodern, 
rückschreiben) Befehlen gehts wohl nicht schneller. Ich meinte nur dass 
der Compiler hier schon das maximale (für diese Befehle) rausgeholt hat.

Wenn man natürlich Befehle wie PORTE.OUTSET bzw. PORTE.OUTCLR verwendet, 
geht das ganze etwa doppelt so schnell. Aber es ist dann eben ein 
anderes Programm. Trotz gleicher Funktion.

Autor: Edimahler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gibts irgendwo eine schöne Übersicht über genau solche Befehle wie 
OUTSET, OUTCLR etc? Habe bisher immer das Include-File des XMEGA 
durchsucht, meist ist aber nicht ganz klar, was die entsprechenden 
Befehle auch wirklich tun...

Assembler hat noch nicht funktioniert, na, da muss ich dann selber 
nochmals durch.

So und dann wünsche ich schonmal schöne Ostern, und vielen Dank für die 
vielen tollen Hints und Ideen, echt Klasse!


Beste Grüsse und Gut-Ostereier-find
Simon

Autor: bensch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Gibts irgendwo eine schöne Übersicht

Schade, dass es keine Datenblätter gibt- und in diesen auch keine Liste 
aller Befehle....

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OUTSET/OUTCLR sind keine Befehle, sondern Register. Die findest du im 
Datenblatt. Aber viel wichtiger: Deren Namen unter AVR-GCC findest du im 
entsprechenden Header File im WinAVR inc Verzeichnis. ioxYZ.h

Autor: swen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
damit komme ich auf 2.38mhz (lt. oszi) mitm atmega8 16mhz
DDRB  = 0x01;

while (1)
{    
  DDRB = (1 << DDB0);
  DDRB = (0 << DDB0);
}

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Probier mal:
DDRB  = 0x01;

while (1)
{
  PINB = (1 << PB0);
}

Zumindest bei "neueren" AVRs geht das.

Autor: swen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Simon K. schrieb:
> Zumindest bei "neueren" AVRs geht das.

klappt beim atmega8(16) nicht....

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>klappt beim atmega8(16) nicht....

Die sind ja auch alles andere als neu.

MfG Spess

Autor: Swen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
spess53 schrieb:
> Die sind ja auch alles andere als neu.

ach ne... neu sind die nicht iss schon klar. wollt nur mitteilen das es 
beim testen dessen am atmega8 bzw. 16 so nicht ging

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>ach ne... neu sind die nicht iss schon klar. wollt nur mitteilen das es
>beim testen dessen am atmega8 bzw. 16 so nicht ging

Dazu hätte ein Blick ins Datenblatt gereicht.

MfG Spess

Autor: eklige Tunke (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Simon K. schrieb:
> Probier mal:
>
DDRB  = 0x01;
> 
> while (1)
> {
>   PINB = (1 << PB0);
> }
>
> Zumindest bei "neueren" AVRs geht das.
Muss man das verstehen?
Ich zumindest stehe gerade auffem Schlauch!

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Muss man das verstehen?
>Ich zumindest stehe gerade auffem Schlauch!

The Port Input Pins I/O location is read only, while the Data Register 
and
the Data Direction Register are read/write. However, writing a logic one 
to a bit in the PINx Register, will result in a toggle in the 
corresponding
bit in the Data Register.

MfG Spess

Autor: eklige Tunke (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
spess53 schrieb:
>>Muss man das verstehen?
>>Ich zumindest stehe gerade auffem Schlauch!
> The Port Input Pins I/O location is read only, while the Data Register
> and
> the Data Direction Register are read/write. However, writing a logic one
> to a bit in the PINx Register, will result in a toggle in the
> corresponding
> bit in the Data Register.
Danke, wieder was gelernt.

Autor: Edimahler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Simon K. schrieb:
> Aber viel wichtiger: Deren Namen unter AVR-GCC findest du im
> entsprechenden Header File im WinAVR inc Verzeichnis. ioxYZ.h

Danke für den Tipp. Dachte bloss, es gäbe vielleicht noch etwas 
"Geordneteres", wo die Zusammengehörigkeiten bzw. der Aufbau der structs 
etwas übersichtlicher zusammengestellt ist. Geht aber auch so.


Vielen Dank euch allen erneut und beste Grüsse aus der Schweiz,
Simon

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.