Mikrocontroller langsamer als erwartet

Gast #1150863
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
#1150886
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
Gast #1150910
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...
Gast #1150920
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
}
Gast #1150932
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
Gast #1150941
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...
Gast #1150943
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.
Gast #1150961
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...
#1150962
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.
Gast #1150984
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 :)
Gast #1150997
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
Gast #1151044
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren