Forum: Mikrocontroller und Digitale Elektronik Mikrocontroller langsamer als erwartet


von Gert (Gast)


Lesenswert?

Guten Abend.

Hab hier einen Mega8 der mit einem internen Takt von 4MHz läuft.

Hab ein Programm geschrieben das immer den Port B.3 invertiert.
1
while(1){
2
3
PORTB.3=~PORTB.3
4
}

Am Oszi gemessen bekomme ich nur eine Rechecksignal mit ca. 63 kHz. Das 
wundert mich ein wenig, eigentlich hätte ich ja mit mindestens einem 
dreistellingen kHz-Wert gerechnet. So viele Befehle stecken doch da 
nicht dahinter, oder?

Gert

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


Lesenswert?

> Das wundert mich ein wenig, eigentlich hätte ich ja mit mindestens einem
> dreistellingen kHz-Wert gerechnet. So viele Befehle stecken doch da
> nicht dahinter, oder?
Wissen ist Macht!
Schau dir das Assembler-Listing an.

von Gert (Gast)


Lesenswert?

Ist das eigentlich neuerdings Mode, in Rätseln zu sprechen?

von JUPP (Gast)


Lesenswert?

wer weiß, wer weiß :P

von spess53 (Gast)


Lesenswert?

Hi

>Ist das eigentlich neuerdings Mode, in Rätseln zu sprechen?

Welchen Teil hast du nicht verstanden?

MfG Spess

P.S. CKDIV8 noch gesetzt?

von Tim T. (tim_taylor) Benutzerseite


Lesenswert?

spess53 wrote:
> Welchen Teil hast du nicht verstanden?

Ich tippe auf:

Lothar Miller wrote:
> Schau dir das Assembler-Listing an.

bin mir aber noch nicht ganz sicher...

von Falk B. (falk)


Lesenswert?

@Gert (Gast)

>dreistellingen kHz-Wert gerechnet. So viele Befehle stecken doch da
>nicht dahinter, oder?

Wenn der Compiler was taugt dauert die Schleife 5 Takte, macht effektiv 
einen Teiler durch 10 = 400 kHz.
Und du bist sicher, dass dein AVR auf 4 MHz läuft? Die meisten laufen ab 
Werk mit 1MHz.
Poste mal VOLLSTÄNDIGEN Code.

MFG
Falk

von Gert (Gast)


Lesenswert?

Jupp ... der lief nicht auf 4MHz. Danke für den Tipp.
Hab's jetzt

CKSEL3=0
CKSEL2=0
CKSEL1=1
CKSEL0=1

eingestellt. Das sollten ja 4MHz sein, wenn ich das im Datenblatt 
richtig verstanden habe.
Messe jetzt ca 260 kHZ...

von Tim T. (tim_taylor) Benutzerseite


Lesenswert?

Ist aber immer noch nicht das Optimum, zeig mal das Assembler Listing.

bzw. schau mal wie schnell das hier bei dir ist:
1
#include <avr/io.h>
2
3
int main(void){
4
 DDRB |= (1<<DDB3);
5
 while(1){
6
  if (PORTB & (1<<PB3)) PORTB &= ~(1<<PB3);
7
  else PORTB |= (1<<PB3);
8
 }
9
 return 0;
10
}

von Klaus (Gast)


Lesenswert?

Falk  wrote:

>Wenn der Compiler was taugt dauert die Schleife 5 Takte

Gert wrote:

>Messe jetzt ca 260 kHZ...

ups... da ist noch ein 6ter. ;)

Marke:
  cbi xx     ;1 Takt
  sbi xx     ;1 Takt
  rjmp Marke ;2 Takte

es geht auch mit 4 Takten -> 1MHz/2 =500KHz

von Tim T. (tim_taylor) Benutzerseite


Lesenswert?

Aus meinem Beispiel oben macht der Compiler auch nur 3 bis 4 Takte:

6:          if (PORTB & (1<<PB3)) PORTB &= ~(1<<PB3);
+00000030:   9BC3        SBIS    0x18,3
+00000031:   C002        RJMP    PC+0x0003

+00000032:   98C3        CBI     0x18,3
+00000033:   CFFC        RJMP    PC-0x0003

7:          else PORTB |= (1<<PB3);
+00000034:   9AC3        SBI     0x18,3
+00000035:   CFFA        RJMP    PC-0x0005

also entweder 30, 32, 33 oder 30, 31, 34, 35...

von eProfi (Gast)


Lesenswert?

Leute, wenn es um das schnelle Toggeln eine Ports geht, gibt es bei den 
neueren AVRs einen Befehl dafür: das Schreiben eines 1-Bits ins 
PIN-Register (glaub ich zumindest, bitte selbst nachschauen: Toggle).
Dann sollte es in 2 oder 3 Zyklen gehen.

von (prx) A. K. (prx)


Lesenswert?

Nur dass Gert offenkundig keinen GCC verwendet. Bleibt abzuwarten, was 
sein Compiler draus gemacht hat. Und ob die Optimierung überhaupt 
eingeschaltet war.

von (prx) A. K. (prx)


Lesenswert?

Tim T. wrote:

> also entweder 30, 32, 33 oder 30, 31, 34, 35...

Was auf 6 bzw. 7 Takte rausläuft (CBI,SBI,RJMP=2).

von Tim T. (tim_taylor) Benutzerseite


Lesenswert?

A. K. wrote:
> Was auf 6 bzw. 7 Takte rausläuft (CBI,SBI,RJMP=2).

Stimmt, da hast du recht. Es sind 7 Takte für einen Zyklus ergo 
irgendwas um 571 kHz und damit etwas mehr als doppelt soviel wie vom OP 
gemessen...

von (prx) A. K. (prx)


Lesenswert?

eProfi wrote:

> Leute, wenn es um das schnelle Toggeln eine Ports geht, gibt es bei den
> neueren AVRs einen Befehl dafür: das Schreiben eines 1-Bits ins
> PIN-Register (glaub ich zumindest, bitte selbst nachschauen: Toggle).

Nützt aber nix beim Mega8. Ausserdem dürfte es hier nicht um Wettrennen 
gehen, sondern um ein Missverhältnis zwischen Erwartung und Realität.

von (prx) A. K. (prx)


Lesenswert?

Tim T. wrote:

> Stimmt, da hast du recht. Es sind 7 Takte für einen Zyklus ergo
> irgendwas um 571 kHz und damit etwas mehr als doppelt soviel wie vom OP
> gemessen...

Nö. Der Gesamtzyklus sind 6+7=13 Takte, also rund 300KHz am Pin.

von Klaus (Gast)


Lesenswert?

ich korregiere mich lieber selber

Marke:
  cbi xx     ;2 Takt
  sbi xx     ;2 Takt
  rjmp Marke ;2 Takte

=6 Takte  sorry Klaus ;(

von Tim T. (tim_taylor) Benutzerseite


Lesenswert?

A. K. wrote:
> Tim T. wrote:
>
>> Stimmt, da hast du recht. Es sind 7 Takte für einen Zyklus ergo
>> irgendwas um 571 kHz und damit etwas mehr als doppelt soviel wie vom OP
>> gemessen...
>
> Nö. Der Gesamtzyklus sind 6+7=13 Takte, also rund 300KHz am Pin.

Stimmt, ich hab da bei den 2 Taktern gepennt, es sind natürlich 13 Takte 
und 307 kHz am Pin :)

von Klaus (Gast)


Lesenswert?

Da eine "L" + eine "H" Periode zuerzeugen ist.

gild

(nach meiner Rechnung) (4MTakte/6Takte) / 2 rund 333KHz

von Gert (Gast)


Lesenswert?

Benutze CodeVisionAVR ...
1
#include <avr/io.h>
2
3
int main(void){
4
 DDRB |= (1<<DDB3);
5
 while(1){
6
  if (PORTB & (1<<PB3)) PORTB &= ~(1<<PB3);
7
  else PORTB |= (1<<PB3);
8
 }
9
 return 0;
10
}

... es werden lauter Feldermeldungen angezeigt

von Forenbeobachter (Gast)


Lesenswert?

> ... es werden lauter Feldermeldungen angezeigt

Das ist ja schön. Google mal nach "Fehlermeldung". Die Lösung deines 
Problems sollte sich relativ weit oben unter den Suchergebnissen 
befinden, denk ich mal.

von AmFeld (Gast)


Lesenswert?

"Feldermeldungen"en sind doch üblich.

... von ungefähr 4.540.000 für Feldermeldung

Bist du nicht anpassungsfähig oder ein Erbsenzähler ;-)

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.