mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LED blinken lassen mit AVR-GCC


Autor: Harald (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey,
will eine LED mit hilfe von AVR-GCC mit einem attiny2313 zum blinken 
bringen.Hab auch schon gegoogled aber nix passendes gefunden.Ist eig ein 
ganz simples problem .
Bin bisher soweit:
#include <avr/io.h>          

int main (void) {            
 
   DDRB  = 0xff;             
   PORTB = (1<<PB1);             
 
   while(1) {                
    
   }                         
 
  // will hier nen timer drin haben der 500ms wartet //


DDRB  = 0xff;             
   PORTB = (0<<PB1);
   return 0;                 
}

wie stell ich das nun an?

: Gesperrt durch Moderator
Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Indem du zb im
AVR-GCC-Tutorial
den Abschnitt über die delay Funktion liest.

Autor: tsag (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Stelle wo dein Kommentar steht wird nie erreicht, da davor eine 
Endlosschleife steht.
Lies dir doch mal das AVR-GCC-Tutorial hier durch, hat mir auch sehr 
geholfen.
Dort steht auch ein Codeschnipsel wie man den µC für einige Zeit 
anhalten, bzw nichts tun lassen kann: 
http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

Autor: Verwirrter Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#include <avr/io.h>          
int main (void) {            
  DDRB  = 0xff;             
  PORTB = (1<<PB1);             
  while(1) {                
    // Das hier ist eine Endlosschleife
  }                         
  // Der Code hier wird nie erreicht...
  
  DDRB  = 0xff;             
  PORTB = (0<<PB1);
  return 0;                 
}

Das hier sollte funktionieren:
#include <util/delay.h>
#include <avr/io.h>          
int main (void) {            
  DDRB  = 0xff;             
  while(1) {                
    PORTB |= (1<<PB1);    //Bit setzen
    _delay_ms(500);       // halbe sekunde warten
    PORTB &= ~(1<<PB1);   // Bit loeschen
    _delay_ms(500);       // halbe sekunde warten
  }                         
 return 0;                 
}

Autor: Harald (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aso danke :D wusste nich dass ich unter delay gucken muss :D
#include <avr/io.h>          
#ifndef F_CPU
#define F_CPU 3686400UL
#endif
#include <util/delay.h>

int main (void) {            
 
   DDRB  = 0xff;             
   PORTB = (1<<PB1);             
 
   while(1) {                
 
  _delay_ms(1000);
   }                         
 DDRB  = 0xff;             
   PORTB = (0<<PB1);
  
   return 0;                 
}

ist das so korrekt?

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> ist das so korrekt?

Jein. Der Compiler wird es ohne Mosern übersetzen. Aber es wird nicht 
das Erwartete machen. Was du übrigens auch in der AVR-Simulation 
leicht selbst prüfen kannst, wenn du mit dem AVR Studio arbeitest.

Autor: Lukas K. (carrotindustries)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Harald schrieb:
> aso danke :D wusste nich dass ich unter delay gucken muss :D
...
> ist das so korrekt?
Nein
Die LED geht an und nach einer Sekunde aus. Dennoch ist das PORTB = 
(0<<PB1); nicht richtig, informiere dich über Bitmanipulation

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Harald schrieb:

> ist das so korrekt?

Lass uns dein Programm erst mal sauber einrücken
#include <avr/io.h>
#ifndef F_CPU
#define F_CPU 3686400UL
#endif
#include <util/delay.h>
 
int main (void) {

  DDRB  = 0xff;
  PORTB = (1<<PB1);

  while(1) {
    _delay_ms(1000);
  }

  DDRB  = 0xff;
  PORTB = (0<<PB1);

  return 0;
}

Jetzt habe ich ein paar Fragen an dich:

* Warum willst du DDRB ein zweites mal setzen. 1 mal reicht. Wenn der
  Port auf Ausgang geschaltet ist, dann vergisst der das nicht.

* while( 1 )
  Das ist eine Schleife, die von einer Bedingung abhängig ist.
  Die Schleife wird solange wiederholt, wie die Bedingung wahr ist

  while( i > 5 )
  wäre zb eine Schleife, die solange wiederholt wird, wie eben i
  größer als 5 ist.

  Hier lautet die bedingung: 1
  1 ist ein Ausdruck, der immer wahr ist.

  Das bedeutet: Diese Schleife kann gar nicht verlassen werden. Eine
  sogenannte Endlosschleife.

  Das ist prinzipiell schon ok. Genau das wollen wir haben.

  Aber: Innerhalb der SChleife steht nur die _delay_ms
  Das heißt: Das Warten wird wiederholt. Wieder und immer wieder.
  Wie soll denn da also jemals eine LED ein oder aus geschaltet werden,
  was ja wohl notwendig ist, um ein Blinken zu erzeugen?

  Wenn die LED Blinken soll, dann würde man ja wohl erwarten, dass
  innerhalb der Endlosschleife die LED ein und auch wieder ausgeschaltet
  wird.

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Luk4s K. schrieb:
> Die LED geht an und nach einer Sekunde aus.

Die LED geht nur an, danach hängt er in der Endlosschleife.
Außerdem gibt bei den delays zeitliche Obergrenzen, die zu beachten 
sind.

Autor: Lukas K. (carrotindustries)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Floh schrieb:
> Luk4s K. schrieb:
>> Die LED geht an und nach einer Sekunde aus.
>
> Die LED geht nur an, danach hängt er in der Endlosschleife.
> Außerdem gibt bei den delays zeitliche Obergrenzen, die zu beachten
> sind.

Ich überlas wohl das while(1) :(

Autor: Hubert G. (hubertg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PORTB = (0<<PB1);

Glaubst du das sich damit was ändert?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hubert G. schrieb:
> PORTB = (0<<PB1);
>
> Glaubst du das sich damit was ändert?

Doch, das tut es.

Zwar nicht ganz das was beabsichtigt war, aber PORTB ändert den Zustand.

Beitrag #5004215 wurde von einem Moderator gelöscht.
Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.