Forum: Compiler & IDEs STK500 LED Schleife


von Mangosniper (Gast)


Lesenswert?

Hi,

vorab gesagt ich hab erst heute angefangen mit dem Ding zu arbeiten und 
mäßige C Kentnisse.
Ich möchte an meinem STK500 bestimmte Led´s im Abstand von 1 Sekunden 
aus und anschalten. Das ganze dann in einer Endlosschleife:

#include <avr/io.h>
int main( void )
{
while(1)
DDRB = (1 << DDB2) | (0 << DDB3);
_wait_ms(1000);
DDRB = (1 << DDB5) | (0 << DDB2);
_wait_ms(1000);
DDRB = (1 << DDB3) | (0 << DDB5);
_wait_ms(1000);
}

Vom Code wird aber lediglich das hier ausgeführt:

#include <avr/io.h>
int main( void )
{
DDRB = (1 << DDB2) | (0 << DDB3);

Kann mir wer sagen wo der Fehler liegt?

von Karl H. (kbuchegg)


Lesenswert?

Mangosniper schrieb:
> Hi,
>
> vorab gesagt ich hab erst heute angefangen mit dem Ding zu arbeiten und
> mäßige C Kentnisse.
> Ich möchte an meinem STK500 bestimmte Led´s im Abstand von 1 Sekunden
> aus und anschalten. Das ganze dann in einer Endlosschleife:
>
> #include <avr/io.h>
> int main( void )
> {
> while(1)
> DDRB = (1 << DDB2) | (0 << DDB3);
> _wait_ms(1000);
> DDRB = (1 << DDB5) | (0 << DDB2);
> _wait_ms(1000);
> DDRB = (1 << DDB3) | (0 << DDB5);
> _wait_ms(1000);
> }

Innerhalb des while(1) liegt nur die unmittelbar nächste Anweisung.

Willst du mehere Anweisungen unter Kontrolle vom while haben, dann musst 
du die Anweisungen zu einem Blockzusammenfassen
1
#include <avr/io.h>
2
3
int main( void )
4
{
5
  while(1)
6
  {
7
    DDRB = (1 << DDB2) | (0 << DDB3);
8
    _wait_ms(1000);
9
    DDRB = (1 << DDB5) | (0 << DDB2);
10
    _wait_ms(1000);
11
    DDRB = (1 << DDB3) | (0 << DDB5);
12
    _wait_ms(1000);
13
  }
14
}

PS: man kann einen Portpin nicht mit 0<<DDB3 löschen. Eine 0 kann man 
nach links schieben, sooft man will, sie bleibt immer eine 0

PS2: Du willst mit Sicherheit nicht ständig den Pin von Eingang auf 
Ausgang umkonfigurieren, sondern du willst:
  Einmalig die interessierenden Pins auf Ausgang konfigureieren.
  Durch entsprrechende Zugriffe auf das PORTB Register den auf Ausgang
  konfigurierten Pin von 0 auf 1 bzw. umgekehrt schalten.

von Mangosniper (Gast)


Angehängte Dateien:

Lesenswert?

zu
1
#include <avr/io.h>
2
3
int main( void )
4
{
5
  while(1)
6
  {
7
    DDRB = (1 << DDB2) | (0 << DDB3);
8
    _wait_ms(1000);
9
    DDRB = (1 << DDB5) | (0 << DDB2);
10
    _wait_ms(1000);
11
    DDRB = (1 << DDB3) | (0 << DDB5);
12
    _wait_ms(1000);
13
  }
14
}

Hier wird mir ein Fehler beim Compilieren mit der Makefile angezeigt (s. 
Screenshot im Anhang)

Zu PS: Wie gesagt^^ "vorab gesagt ich hab erst heute angefangen mit dem 
Ding zu arbeiten und mäßige C Kentnisse."

Ich werd das Kapitel mal wiederholen.

Zu PS2: exakt

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Die Fehlermeldung besagt, dass die Funktion _wait_ms() unbekannt ist. 
Das stimmt auch.

Lies dir die folgenden Abschnitte zur Funktion _delay_ms() mal durch und 
ändere deine Source entsprechend.
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Warteschleifen_.28delay.h.29
http://www.nongnu.org/avr-libc/user-manual/group__util__delay.html

von Route_66 (Gast)


Lesenswert?

DDRB ist das "data direction register of port B" und nicht der Port 
selbst. Man kann natürlich mit der Umschaltung von Ein- auf Ausgang 
ebenfalls Pegeländerungen hervorrufen, das ist meist aber nicht 
beabsichtigt.

von Mangosniper (Gast)


Lesenswert?

Danke das Problem hab ich mittlerweile gelöst.

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.