Forum: Mikrocontroller und Digitale Elektronik µC schnell mit Eclipse und lahm mit AVR Studio?


von Alexander T. (xronin)


Lesenswert?

Hallo zusammen,

dank Euch habe ich es endlich geschafft meinen ersten Controller zum 
Laufen zu bringen (ATTiny44 mit AVR Dragon).
Eine Sache finde ich allerdings äußerst merkwürdig.

Wenn ich das Programm (4 LEDs über Buttons steuern) mit Eclipse (WinAVR) 
kompiliere und starte, dann reagiert der Controller auf Tastendrücke 
ohne Verzögerung. Mache ich das ganze mit dem AVR Studio, dauert es 
mehrere Sekunden bis eine Reaktion erfolgt. Woran kann das liegen?? Der 
Quellcode ist der gleiche :(

Grüße,
Alex

von CC (Gast)


Lesenswert?

F_CPU anders gesetzt?

von Alexander T. (xronin)


Lesenswert?

Der Quellcode ist 1:1 der gleiche...

von Mirco (Gast)


Lesenswert?

Die F_CPU wird im meistens im Makefile angegeben. Die sind auch gleich?
Bzw. du hast den richtigen Wert im AtmelStudio eingetragen?

von Test (Gast)


Lesenswert?

Debug Mode im Studio aktiviert ? Fcpu in den projekteinstellungen falsch 
gesetzt (der Wert im quelltext ist egal)

von Sudo (Gast)


Lesenswert?

Wie soll dir den jemand helfen wenn du weder Quellcode noch irgend was 
anderes lieferst.

von Alexander T. (xronin)


Lesenswert?

Entschuldigung, hier ist schonmal der Quellcode. Ich erstelle das 
Projekt in der Release Version. Bei Eclipse ist die Frequenz in den 
Projekteinstellungen mit 1Mhz (1000000) angegeben. Bei AVR Studio finde 
ich nirgendwo einen Eintrag?
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
4
#ifndef F_CPU
5
#define F_CPU 20000000UL
6
#endif
7
8
#include <util/delay.h>
9
10
11
12
//////////////////////////////////////////////////////////////////////////
13
///////  Sleep function
14
//////////////////////////////////////////////////////////////////////////
15
void Sleep(unsigned int ms)
16
{
17
  for(; ms>0; ms--) _delay_ms(1);
18
}
19
20
21
//////////////////////////////////////////////////////////////////////////
22
///////  Debounce buttons
23
//////////////////////////////////////////////////////////////////////////
24
uint8_t Debounce( volatile uint8_t *port, uint8_t pin )
25
{
26
    if ( !(*port & (1 << pin)) )
27
    {
28
      _delay_ms(50);
29
      _delay_ms(50);
30
      if ( *port & (1 << pin) )
31
      {
32
        _delay_ms(50);
33
        _delay_ms(50);
34
        return 1;
35
      }
36
    }
37
    return 0;
38
}
39
40
41
int x = -1;
42
43
int main(void)
44
{
45
  //LEDs konfigurieren
46
  DDRA = (1 << PORTA0) | (1 << PORTA1) | (1 << PORTA2) | (1 << PORTA3);
47
  DDRB  = (1 << PORTB2);
48
49
  //Buttons konfigurieren
50
  DDRB  &= ~(1<<PORTB0);
51
  PORTB |= (1<<PORTB0);
52
  
53
  DDRB  &= ~(1<<PORTB1);
54
  PORTB |= (1<<PORTB1);
55
56
    while(1)
57
    {
58
      if(Debounce( &PINB, PINB0 ))
59
      {
60
        PORTA &= ~(1 << 0);
61
        PORTA &= ~(1 << 1);
62
        PORTA &= ~(1 << 2);
63
        PORTA &= ~(1 << 3);
64
65
        if (x > -2)
66
        {
67
          x--;
68
          if (x > -1)
69
          {
70
            PORTA |= (1 << x);
71
          }
72
        }
73
      }
74
75
      if(Debounce( &PINB, PINB1 ))
76
      {
77
        if (x < 4)
78
        {
79
          PORTA &= ~(1 << 0);
80
          PORTA &= ~(1 << 1);
81
          PORTA &= ~(1 << 2);
82
          PORTA &= ~(1 << 3);
83
84
          x++;
85
          if (x == 4)
86
          {
87
            PORTA |= (1 << 0);
88
            PORTA |= (1 << 1);
89
            PORTA |= (1 << 2);
90
            PORTA |= (1 << 3);
91
          }
92
          else if (x > -1)
93
          {
94
            PORTA |= (1 << x);
95
          }
96
        }
97
      }
98
    }
99
}

von Franz (Gast)


Lesenswert?

Alexander Thies schrieb:
> AVR Studio

welche Version?

von BitKracherl (Gast)


Lesenswert?

>Bei AVR Studio finde ich nirgendwo einen Eintrag?
1
#ifndef F_CPU
2
#define F_CPU 20000000UL
3
#endif

Nun, die Definition der Taktfrequenz kann auch mit dem Define im 
Quellcode geschehen. Das ist hier der Fall.

Mit Eclipse hast Du 1MHz eingestellt. Mit AVR mit 20MHz.

Das hat klarerweise Auswirkungen auf die delays.

von Hannes L. (hannes)


Lesenswert?

Alexander Thies schrieb:
> Bei AVR Studio finde
> ich nirgendwo einen Eintrag?

Und was ist das?

> #ifndef F_CPU
> #define F_CPU 20000000UL

20 MHz, wenn die CPU real mit 1 MHz löwt, dann dauern alle Delays 20 mal 
so lange...

...

von Alexander T. (xronin)


Lesenswert?

Es ist AVR Studio 6.1. Im Datenblatt stand, dass sie mit 20Mhz laufen 
kann. Welchen Wert sollte ich den benutzen, um den µC  nicht zu 
überfordern?

von Robin F. (gehacktes)


Lesenswert?

1MHz reichen vollkommen.

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


Lesenswert?

Alexander Thies schrieb:
> uint8_t Debounce(...)
Welch sinnlose Verschwendung von Rechenzeit...

> Bei Eclipse ist die Frequenz in den Projekteinstellungen mit 1Mhz
> (1000000) angegeben.
> ...
> #define F_CPU 20000000UL
Voll konsistent, dass du im Quelltext 20MHz angibst  :-o
BTW: welchen Takt hat dein uC?
Das sollte überall der selbe Wert sein...

: Bearbeitet durch Moderator
von Oliver (Gast)


Lesenswert?

Du solltest genau den Wert in der Software eintragen, mit der der 
Prozessor tatsächlich auch läuft.

Denn der F_CPU-Wert beeinflusst in keinster Weise die tatsächliche 
Taktfrequenz. Die hängt von den eingestellten Fuses und eines eventuell 
vorhandenen Quarz ab.

Oliver

von Maxx (Gast)


Lesenswert?

Alexander Thies schrieb:
> Es ist AVR Studio 6.1. Im Datenblatt stand, dass sie mit 20Mhz laufen
> kann. Welchen Wert sollte ich den benutzen, um den µC  nicht zu
> überfordern?

F_CPU bestimmt NICHT wie schnell der uC läuft
F_CPU gibt deinem Programm einen hinweis wie schnell du meinst, dass der 
uC läuft.


Die tatsächliche Geschwindigkeit hängt von deinen Fuses ab (intern, 
extern, Quarz, Oszillator, CLKDIV8, etc) und je nachdem von deiner 
Beschaltung.

von Alexander T. (xronin)


Lesenswert?

Lothar Miller schrieb:
> Alexander Thies schrieb:
>> uint8_t Debounce(...)
> Welch sinnlose Verschwendung von Rechenzeit...
Ich weiß es leider nicht besser...Tipps?

> Alexander Thies schrieb:
>> Wenn ich das Programm (4 LEDs über Buttons steuern) mit Eclipse (WinAVR)
>> kompiliere und starte,
> Worauf startest du das Programm?
ATTiny44A

> Alexander Thies schrieb:
>> Bei Eclipse ist die Frequenz in den Projekteinstellungen mit 1Mhz
>> (1000000) angegeben.
>> ...
>> #define F_CPU 20000000UL
> Voll konsistent, dass du im Quelltext 20MHz angibst  :-o
> BTW: welchen Takt hat dein uC?
> Das sollte überall der selbe Wert sein...
Die Einstellungen bei Eclipse stammen nicht von mir, die habe ich gerade 
eben gefunden. Ich habe lediglich die F_CPU Definition vorgenommen

von Alexander T. (xronin)


Lesenswert?

Maxx schrieb:
> Alexander Thies schrieb:
>> Es ist AVR Studio 6.1. Im Datenblatt stand, dass sie mit 20Mhz laufen
>> kann. Welchen Wert sollte ich den benutzen, um den µC  nicht zu
>> überfordern?
>
> F_CPU bestimmt NICHT wie schnell der uC läuft
> F_CPU gibt deinem Programm einen hinweis wie schnell du meinst, dass der
> uC läuft.
>
> Die tatsächliche Geschwindigkeit hängt von deinen Fuses ab (intern,
> extern, Quarz, Oszillator, CLKDIV8, etc) und je nachdem von deiner
> Beschaltung.

Also wenn der interne Oszillator mit 8Mhz läuft, und durch das Fusebit 
der Takt nochmal durch 8 geteilt wird, ist dann 1Mhz der richtige Takt 
für den µC?

von Falk B. (falk)


Lesenswert?

Optimierung eingeschaltet?

von Mirco (Gast)


Lesenswert?

Am besten ist du findest erstmal raus mit welcher Frequenz dein Chip 
läuft. Meistens sind die Grundeinstellungen 1Mhz oder 8Mhz, das steht im 
Datenblatt. Wenn du in den > 500 Seiten nicht suchen möchtest, ist es am 
einfachsten ein Blink-Programm zu schreiben und F_CPU zu variieren. Wenn 
die eingestellte Wartezeit mit der realen Zeit übereinstimmt hast du die 
richtige Frequenz gefunden.

von Alexander T. (xronin)


Lesenswert?

Falk Brunner schrieb:
> Optimierung eingeschaltet?

Optmierung steht auf O1..nachdem ich F_CPU auf 1Mhz gesetzt habe, läuft 
es besser :) Danke.

von Karl H. (kbuchegg)


Lesenswert?

Alexander Thies schrieb:

> Also wenn der interne Oszillator mit 8Mhz läuft, und durch das Fusebit
> der Takt nochmal durch 8 geteilt wird, ist dann 1Mhz der richtige Takt
> für den µC?

Ja, ist er.

Du kannst das auch ganz leicht testen
1
#ifndef F_CPU
2
#define F_CPU 1000000UL
3
#endif
4
5
#include <avr/io.h>
6
#include <util/delay.h>
7
8
int main(void)
9
{
10
  DDRA = (1 << PORTA0);
11
12
  while(1)
13
  {
14
    PORTA |= ( 1 << PORTA0 );
15
    _delay_ms( 1000 );
16
17
    PORTA &= ~( 1 << PORTA0 );
18
    _delay_ms( 1000 );
19
  }
20
}

Wenn der Wert für F_CPU korrekt ist, UND NUR DANN, dann blinkt deine LED 
mit 1 Sekunde an/aus. Sprich dann sind die 1000 Millisekunden in 
_delay_ms auch wirklich 1000 Millisekunden (1 Sekunde).

Würde dein µC tatsächlich 8 mal schneller laufen (mit 8Mhz) dann ist 
auch das Blinken 8 mal schneller. Das siehst du mit freiem Auge. Damit 
die 1000 Millisekunden wieder real 1 Sekunde dauern, müsstest du dann 
F_CPU auf 8000000 stellen, damit es wieder der Realität der Taktfrequenz 
deines µC entspricht. Stellst du umgekehrt die F_CPU auf 8000000, taktet 
der µC aber tatsächlich nur mit 1Mhz, dann ist das Blinken 8 mal 
langsamer. Anstatt alle 1 Sekunden, dauert es 8 Sekunden bis die LED aus 
geht bzw. wieder eingeschaltet wird. Und auch das sieht man mit freiem 
Auge.

Nur dann, wenn F_CPU tatsächlich mit dem übereinstimmt, wie schnell der 
µC wirklich getaktet wird, dann stimmen die Verzögerungen, die _delay_ms 
anhand des Wertes von F_CPU für eine Millisekunde berechnet auch 
(einigermassen) mit der Realität einer Millisekunde überein.

: Bearbeitet durch User
von Alexander T. (xronin)


Lesenswert?

Super. Vielen Dank!

von Karl H. (kbuchegg)


Lesenswert?

-> Es ist immer gut, wenn man auch versteht, was die einzelnen Dinge in 
einem Programm tun und wie sie zusammenhängen. Genau aus dem Grund sind 
die ersten Übungen mit dem µC diverse LED Blink Programme. Man kann mit 
ihnen viel mehr lernen als das da einfach nur eine LED blinkt. Ganz im 
Gegenteil, dass die LED was macht, ist eine nette Zugabe. In 
Wirklichkeit geht es bei all diesen Übungen um ganz andere Dinge, die 
LED (oder LEDs) sind nur der Aufhänger, damit man Spass am 
Experimentieren hat und sich was an der Schaltung tut.

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.