PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LED Knight Rider: Lauflicht Problem



thdrummer
07.04.2007, 18:53
Servus,

ich hab gerade ein Lauflicht geschrieben. Geht auch wunderbar. Aber es läuft immer nur in einer Richtung. Wenn ich nur "vorwärts" (siehe Code-Kommentar) laufen lasse, geht es. Wenn ich nur "rückwärts" laufen lasse, ebenso. Wenn ich erst vorwärts, dann rückwärts laufen lassen will, läuft es nur rückwärts. Warum?


#include <avr/io.h>
#ifndef F_CPU
#define F_CPU 16000000 /* Quarz mit 16 Mhz */
#endif
#include <util/delay.h>

void set(int PCX) {
DDRC = (1<<PCX);
PORTC ^= (1 <<PCX);
}

void wait() {
int i;
for (i=1; i<=48; i++) {
_delay_ms(62.5);
}
}

int main(void)
{
int PCX[8] = {PC0, PC1, PC2, PC3, PC4, PC5, PC6, PC7};

int i;

# Vorwärts
for (i=0; i<=7; i++) {
set(PCX[i]);
wait();
}

# Rückwärts
for (i=7; i>=0; i--) {
set(PCX[i]);
wait();
}

return 0;
}

Danke.

Hubert.G
07.04.2007, 20:21
Nachdem ich die Zeile PORTD = (1 <<PCX); so geändert habe ist es gelaufen.
Speziell für so einfache Sachen ist das AVR-Studio mit seiner Simulationsmöglichkeit etwas ganz tolles. Das solltest du mal ausprobieren. Es ist kostenlos.

Du musst es wieder auf PORTC ändern.

thdrummer
08.04.2007, 11:50
Hallo,

danke für die schnelle Antwort!
Gibt es das AVR-Studio oder Vergleichbares auch für MAC OS X? Für Windows ist das AVR-Studio ja echt super!

Danke schonmal,

Gruß
thdrummer

Hubert.G
08.04.2007, 13:15
Ich glaube nicht, zumindest steht auf der Atmel Seite nichts davon.

thdrummer
08.04.2007, 13:16
Alles klar, danke für die schnelle Antwort!

Superhirn
09.04.2007, 18:00
Hi,

muss DDRC = (1<<PCX); nicht als DDRC |= (1<<PCX); geschrieben werden?

avr-gdb und simulavr gibs auf Linux zum simulieren. zwar eigendlich nur kommandozeile aber geht auch wenn man sich eingearbeitet hat. obs eine mac version gibt weis ich nicht aber du kannst dir ja notfalls eine selber kompillieren. mac hat ja auch einen Linux kernel :)

Hubert.G
09.04.2007, 18:38
@Superhirn
In dem Fall ist es egal, man könnte die Zeile überhaupt weglassen und im main DDRC=0xff; schreiben.

Superhirn
09.04.2007, 19:15
Noch ein schönheitsfehler:
du verwendest int variablen. es reichen aber char variablen aus (gehen von -127 bis +127). oder unsigned char von 0-255. es braucht so weniger speicher und kann schneller ausgeführt werden. abe rist in deinem fall auch egal aber für die zukunft sicher gut zu wissen.