µC schnell mit Eclipse und lahm mit AVR Studio?

OP #3429192
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
OP #3429451
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
}
Gast #3429465
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.
Moderator (Firma: Titel) Persönliche Seite #3429477
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...
Gast #3429483
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
Gast #3429485
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.
OP #3429486
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
OP #3429487
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?
Gast #3429493
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.
#3429501
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.
#3429511
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.

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