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?
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.
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
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.