Wie Controller "warten" lassen?

OP Persönliche Seite #909255
Lesenswert?

Hallo,
ich beginne gerade mit dem Programmieren vom ATMEGA8. Das ISP- Flashen 
mit dem USBprog , und so funktioniert auch alles, und eine LED leuchtet 
auch schon. Nun will ich diese LED zum Blinken bringen. Dazu muss ich 
den ATMEGA8 irgendwie kurz warten lassen, bis er den Port wieder 
anschaltet, bzw. ausschaltet. Ich hab im Internet nur Lösungen gefunden, 
die mit einem Timer arbeiten, und das ist noch ein wenig zu schwierig 
für mich. Kann man den Controller auch irgendwie anders warten lassen?
Weiß jemand ein einfaches Beispiel dazu, oder ein Tutorial?
Ach ja: Ich programmiere in C, und benutze AVR Studio mit dem WinGCC- 
Plugin.
Vielen Dank schon einmal im Voraus.
Gruß, Steffen
OP Persönliche Seite #909282
Lesenswert?

Vielen Dank für die schnellen Antorten, hat mir schon sehr 
weitergeholfen!!!!!

J.R wrote:
> Wie schon angesprochen sind _delay_us oder _delay_ms deine
> Freunde.Weitere interessante Fragen und Antworten findes du hier :
>
> http://www.mikrocontroller.net/articles/AVR-Tutorial
>
> schönes Wochenende
> J.R

Ja, das Tutorial ist schon sehr gut, aber leider sind alle Beispiele in 
Assembler, und da versteh ich kein Wort ;-).

Ich hab mein Programm jetzt mal mit _delay_ms umgeschrieben, aber ich 
muss doch noch irgendwie die CPU Frequenz einstellen, damit alles 
korrekt funktioniert. Wie macht man das?

Vielen Dank schon einmal im Voraus.
Gruß, Steffen
OP Persönliche Seite #909296
Lesenswert?

Ok, inzwischen hab ichs herausgefunden. Es geht mit #define F_CPU. Das 
Programm läuft auch tadellos. Das einzigste, was mich wundert, ist dass 
mit dem kleinen Programm hier,
1
#include <avr/io.h>          // (1)
2
#include <util/delay.h>
3
#define F_CPU 1000000 
4
int main (void) {            // (2)
5
 
6
   DDRB  = 0xff;             // (3)
7
   while(1) {
8
   _delay_ms(1000);
9
   PORTB = 0x01;             // (4)
10
   _delay_ms(1000);
11
   PORTB = 0x00;
12
   }
13
   }
nach dem Builden folgende Meldung kommt:

Build started 27.6.2008 at 15:19:20
AVR Memory Usage
----------------
Device: atmega8
Program:    3376 bytes (41.2% Full)
(.text + .data + .bootloader)
Data:          8 bytes (0.8% Full)
(.data + .bss + .noinit)
Build succeeded with 0 Warnings...

Bedeutet das jetzt, das mit diesem kleinen Programm schon 41,2% des 
ATMEGA8 voll sind, oder erst 0,8%?
Vielen Dank schon einmal im Voraus.
Gruß, Steffen
Gast #909308
Lesenswert?

> Bedeutet das jetzt, das mit diesem kleinen Programm schon 41,2% des
> ATMEGA8 voll sind, oder erst 0,8%?

Ersteres :)

Das Programm wird aber gewaltig schrumpfen, wenn die die Optimierung
des Compilers aktivierst. Da das fast jeder, der zum ersten mal mit
den Delay-Funktionen hantiert, falsch macht, wird bei neueren
AVR-Libc-Versionen die Warnung

  "Compiler optimizations disabled; functions from <util/delay.h>
  won't work as designed"

ausgegeben.
Gast #909313
Lesenswert?

Du könntest auch die delay-Funktion durch folgendes ersetzten:


i=0;
while (i<1000){
 i++;
}




bzw. verschachtelt

i=c=0;
while (i<1000){
   while (c<1000){
      i++;
   }
   c++;
}

Ist dann zwar nicht auf die mikrosekuinde genau, aber für eine LED 
reicht es allemal aus!
OP Persönliche Seite #909328
Lesenswert?

Vielen Dank für die Antworten erstmal!!
holger wrote:
> Du könntest auch die delay-Funktion durch folgendes ersetzten:

> i=0;
> while (i<1000){
>  i++;
> }

> bzw. verschachtelt
>
> i=c=0;
> while (i<1000){
>    while (c<1000){
>       i++;
>    }
>    c++;
> }
>
> Ist dann zwar nicht auf die mikrosekuinde genau, aber für eine LED
> reicht es allemal aus!
Genau so dachte ich es mir am Anfang auch, das man einfach eine Schleife 
macht, die eine Weile braucht, bis sie komplett hochgehzählt hat, und 
dadurch Zeit verbrät. Allerdings ist das meiner Meinung nach ziemlich 
provisorisch, deswegen hab ich eben noch nach der "professionellen" 
Lösung gesucht.
@ yalu: Genau die Meldung, die du gepostet hast, kam bei mir auch. Als 
ich dann die CPU Frequenz eingegeben habe, hat er den Build dann ohne 
Warnung gemacht. Wie aktiviert man denn die Optmierung des Compilers???
Vielen Dank schon einmal im Voraus.
Gruß, Steffen
Gast #909378
Lesenswert?

Hallo,
@Stefan 3 ist nicht unbedingt das besten. Ich könnte mir vorstellen das 
die Delay.h für die Optimierung s geschrieben wurde da dies 
normalerweise Standert ist.
Wo der genaue Unterschied bei den Optimierungen ist kann ich dir leider 
nicht sagen. Vieleicht weis des einer von usneren Experten.
Gruß
Peter
Gast #909416
Lesenswert?

Die Optimierungsstufen 1, 2 und 3 optimieren die Geschwindigkeit, s
optimiert die Code-Größe, wobei bei 1, 2 und s das eine meist mit dem
anderen einher geht. Für AVRs sind deswegen 2 oder s meistens richtig,
sie liefern beide ähnlich kompakten und schnellen Code. Welche von
beiden man nimmt, ist eine Frage des Geschmacks bzw. des
Ausprobierens.

Die Stufe 3 versucht, ohne Rücksicht auf die Code-Größe noch ein paar
weitere Prozessorzyklen herauszuschinden. Da werden dann bspw.
Schleifen auseinandergewickelt (loop unrolling), d. h. mehrere
Schleifenrümpfe einfach hintereinanderkopiert. Das spart zwar etwas
Schleifenoverhead ein, dafür wird der Code u.U. deutlich länger. Wenn
man noch viel Flash-Speicher übrig hat, kann man ihn natürlich auf
diese Weise nutzen, anstatt ihn vergammeln zu lassen.

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