Forum: Compiler & IDEs AVR ATMEGA 8


von AVR Studio problem (Gast)


Lesenswert?

Wir haben in der Schule mit AVR-Studio angefangen, das Projekt war eine 
LED am board zum leuchten zu bringen.

Ich habs geschrieben, jedoch werden die while Befehle übersprungen.

DANKE

Quellcode:

#include <avr/io.h>

int main(void)
{
  DDRC = 1;
  unsigned long i;


  for(;;)
  {



      PORTC = PORTC & 254;

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


      PORTC = PORTC | 1;

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


  } return 0;

}

von ... .. (docean) Benutzerseite


Lesenswert?

logisch deine schleife tut ja nix...

daher schmeißt der compiler das raus..

schau mal nach delay_ms( und F_CPU nciht vergessen)

von AVR Studio problem (Gast)


Lesenswert?

aber unser lehrer hat uns das so erklärt,


Das soll als verzögerung dienen:

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




Damit es mehrmals blinkt:

while(i<=5000)
   {
      i++;
   }

von Stefan (Gast)


Lesenswert?

Das liegt daran, dass der Compiler die while-Schleifen wegoptimiert, 
weil da ja nix weiter passiert. Mach einfach mal ein "volatile" vor 
unsigned long i; Ein richtiges volatile bewirkt Wunder! ;-)

von P. S. (Gast)


Lesenswert?

AVR Studio problem schrieb:

> aber unser lehrer hat uns das so erklärt,

Dann soll er mal das Tutorial lesen...

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Bei alten Compilerversionen hat das ja auch funktioniert. Mittlerweile 
ist der Compiler so optimiert, dass offensichtlich funktionsloser Code 
entfernt wird. Wenn man das Warten braucht, muss man entsprechend 
programmieren:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Warteschleifen_.28delay.h.29

von AVR Studio problem (Gast)


Lesenswert?

VIELEN VIELEN DANK :D

von Oliver (Gast)


Lesenswert?

Du kannst ja mal deinen Lehrer fragen, warum das hier funktioniert:
1
volatile unsigned long i;
2
3
////
4
5
while(i<=1000)
6
{
7
   i++;
8
}


Oliver

von AVR Studio problem (Gast)


Lesenswert?

wie mach ich das die 2te LED anfangt zu blinken?? also wie muss ichs 
ändern damit ich eine beliebige diode zum blinken bringen kann?

von MeinerEiner (Gast)


Lesenswert?

Normalerweise schreibt man die Portzugriffe etwas übersichtlicher.
Statt DDRC = 1 nimmt man z.B. DDRC |= (1 << 0), d.h. Bit 0 wird ein 
Ausgang, ohne die anderen Bits in DDRC zu ändern.

Pins Ein/Ausschalten macht man auch eher nicht mit  PORTC = PORTC | 1 
und PORTC = PORTC & 254. Wenn ein Pin eingeschaltet werden soll: PORTC 
|= (1 << n), wobei n zwischen 0 und 7 liegt. Zum Ausschalten: PORTC &= 
~(1 << n).

Macht das ganze etwas übersichtlicher und man braucht nicht lang 
rumrechnen, wenn andere Pins des Ports unangetastet bleiben sollen.

von AVR Studio problem (Gast)


Lesenswert?

Wie würde das mit dem herumrechnen gehen?? Bitte eine kurze erklärung

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Bitmanipulation

Noch kürzer schaffe ich es nicht ;-)

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.