Hallo,
im Anhang habe ich ein C Programm für den AVR ATmega8.
Ich möchte in dem main() Programm eine for- Schleife verwenden, die ein
mehrdimensionalen Vektor durchläuft und dessen Werte als Bitmuster auf
den PortC und PortD ausgibt.
In der Prozedur dimLED ist eine Zählschleife eingebaut, die eine
Zeitverzögerung bewirkt.
Folgendes Problem:
Wenn ich ohne for Schleife die Prozedur aufrufe kommen leuchten nur die
ausgewählten LEDs.
Bei der Verwendung der for Schleife, die eigentlich den Vektor
durchlaufen soll und dann die Bitmuster ausgeben soll, leuchten auf
einmal ALLE LEDs.
Was kann ich da unternehmen?
MfG
HUE
Hallo,
die LEDs leuchten bei der Ausgabe von 0xff auf den PortD. Und ebenso auf
den PortC.
Das Problem liegt aber an der for Schleife.
Wenn diese weggelassen wird, dann habe ich das Bitmuster für die
Leuchtdauer. Wie gewünscht!
Will ich aber die 15 Werte im Vektor mit der for Schleife durchlaufen,
dann SPINNEN die LED.
Ich habe den Verdacht, dass die Verzögerung in dimmLED nicht mehr
funktioniert.
????
HUE
A. K. schrieb:> Was passiert bei einem µC, wenn main beendet wird?
Der avr-gcc sorgt standardmäßig dafür, dass ein AVR dann in einer
Endlosschleife hängen bleibt.
Edit: Also unterm Strich passiert im oben geposteten Code gar nichts
mehr.
Gruß Oliver
Hue \a schrieb:> Bei der Verwendung der for Schleife, die eigentlich den Vektor> durchlaufen soll und dann die Bitmuster ausgeben soll, leuchten auf> einmal ALLE LEDs.
Scheinbar leuchten alle LEDs. Ist ja auch richtig so....
>> Was kann ich da unternehmen?
Augen upgraden auf eine Zeitauflösung von 2ms, dann sollte das klappen
:-)
Änder doch mal die Zeile
Hue \a schrieb:> Ich habe den Verdacht, dass die Verzögerung in dimmLED nicht mehr> funktioniert.
Das kann gut sein.
Rechne dir doch mal aus, in welchem Tempo das alles abgearbeitet wird.
(wenn deine Zeiten klappen)
Ein _delay_us mit einem Wert von 2 innerhalb der Schleife, so wie du das
hast, ist nicht sehr sinnvoll bei einer Taktfrequenz von 1Mhz.
Das us steht für Mykro-Sekunden, also Millionstel Sekunden. Man kann es
auch so sagen: Bei 1Mhz Taktfrequnz ist eine Verzögerung von 1µs genau 1
Takt.
Deine ganze Schleifensteuerung drummherum braucht ein Vielfaches davon!
Hallo,
ich scheine das Problem gefunden zu haben: die Laufvariable der for
Schleife kann nicht als Index im Vektor benutzt werden. Die Ergebnisse
kommen irgendwo her und werden ausgegeben.
Wie kann ich den Vektor noch benutzen, um die ein sequenziellen
Zugreifen auf dessen Werte zu realisieren?
MfG
HUE
Hue \a schrieb:> Hallo,>> ich scheine das Problem gefunden zu haben: die Laufvariable der for> Schleife kann nicht als Index im Vektor benutzt werden.
Blödsinn
Deine ganze Dimmfunktion ist nicht koscher mit dem Timing.
Probier mal diese vereinfachte Version.
1
voiddimmLED(charc,chard,intlongcounterMax)
2
{
3
PORTC=c;
4
PORTD=d;
5
_delay_ms(500);
6
}
jedes deiner Einzel-Muster wird 1/2 Sekunde lang angezeigt. Und dann
überprüf mal, ob deine LED wirklich so eingeschaltet werden, wie du dir
das vorstellst. Wenn deine LED wirklich bei einem 1-Bit eingeschaltet
sind, dann dürfen die höchstens glimmen. Von Brennen kann bei einem
Tastverhältnis von 500 zu 1 keine Rede mehr sein.
Samuel K. schrieb:> Die Wait geht ohne Hilfsvariable:void wait ( int i )> {> while ( i-- )> _delay_us( 2 );> }
Ne Hilfsvariable hats trotzdem, nämlich aufm Stack: call by value
Hallo,
folgender Aufruf macht das von mir gewünschte:
dimmLED( starsOn[0][0], starsOn[1][0], cycleDuration );
dimmLED( starsOn[0][1], starsOn[1][1], cycleDuration );
Die Umschaltung erfolgt ordnungsgemäss und auch die Leuchtdauer von ca.
1 Sekunde ist OK.
Folgende Anweisung ergibt Blödsinn:
for ( i =0; i < 2; i++)
{
dimmLED( starsOn[0][i], starsOn[1][i], cycleDuration );
}
Was ist denn da los?
klugscheissender Erbsenzähler schrieb:> Samuel K. schrieb:>> Die Wait geht ohne Hilfsvariable:void wait ( int i )>> {>> while ( i-- )>> _delay_us( 2 );>> }>> Ne Hilfsvariable hats trotzdem, nämlich aufm Stack: call by value
Und was hat call-by-value mit Stack zu tun?
Gemäß ABI wird i nicht auf dem Stapel übergeben.