ATmega8 / 8-Bit LED Fading- Rhythmus / logik problem

#3871289
Lesenswert?

Grüß euch,

so, habe meine erste 8-Bit LED Fadingschaltung per ATmega8 und Timer2 
realisiert (s. code), die funktioniert.
1
#define GROESSE_PWM_WERTE 29
2

3
const uint16_t pwm_werte[GROESSE_PWM_WERTE]= { 0,1,2,3, 4,5,6,7,8,10,11,13,16,19,23,27,32,38,45,54,64,76,91,108,128,152,181,215,255};
4
uint8_t pwm_wert;
5
//********************************************Hauptprogramm START*******************************************
6

7

8
int main()
9
{
10
  generell_port_init();
11
  timer_2_init();
12
  while(1)
13
  {
14
      for(int position=0; position<=GROESSE_PWM_WERTE; position++)        //zählt von der nullten bis auf die 29te Position
15
      {
16
        _delay_ms(100);                              //wartet etwas, 
17
        pwm_wert= pwm_werte[position];                      //und übergibt jemand den 
18
        OCR2 = pwm_wert;
19
      }
20
      for(int position=GROESSE_PWM_WERTE; position>=0; position--)
21
      {
22
        _delay_ms(100);
23
        pwm_wert= pwm_werte[position];
24
        OCR2 = pwm_wert;
25
      }
26
    
27
  }
28
  
29
  
30
  
31
}

jedoch versteh ich nicht, warum ich bis "position<=GROESSE_PWM_WERTE" 
zählen muss, wenn ich HOCHZÄHLE.
eigentlich muss er doch solange zählen, bis die maximale Position 
erreicht ist, und dann runter zählen, von der maximalen Position.

Bei mir ist es irgendwie katastrophal.
Selbst, wenn ich position=GROESSE_PWM_WERTE schreibe, also er solange 
zählt, bis er ganz rechts angekommen ist, läuft garnichts mehr.


Wie im obrigen Code läuft alles einwandfrei, aber für mich nicht logisch 
nachvollziehbar.

2. Frage: Wenn ich wie im Tutorial LED Fading ein const uint16_t in 
const uint8_t bei den pwmtable umbennene, warum blinkt er dann zum 
schluss beim hochzählen? Liegt das daran, dass er den Wert erst 
umwandeln muss?

P.S. hatte in der Nacht wenig Schlaf, vielleicht habe ich was grobes 
übersehen :/
Gast #3871316
Lesenswert?

hmm... bin mir nicht sicher was du meinst.

Tho Wes schrieb:
> jedoch versteh ich nicht, warum ich bis "position<=GROESSE_PWM_WERTE"
> zählen muss, wenn ich HOCHZÄHLE.

eigentlich musst du bis "position<GROESSE_PWM_WERTE" zählen. denn der 
letzte eintrag im array steht an 28ster stelle und nicht an 29ster, weil 
die indexe des arrays bei 0 anfangen zu zählen (nummerier mal die 
einträge des arrays durch dann siehst du es)

wenn du also "position<=GROESSE_PWM_WERTE" schreibst greifst du bis 
hinter dein array und da steht irgendeine zufallszahl drin


Tho Wes schrieb:
> Selbst, wenn ich position=GROESSE_PWM_WERTE schreibe, also er solange
> zählt, bis er ganz rechts angekommen ist, läuft garnichts mehr.

ja, die for schleife hört dann nie auf, denn dann gibt es keine 
abbruchbedingung.  die for schleife dreht ja so lange ihre runden bis 
der ausdruck für die bedingung in "for(init;bedingung;zähle)" false 
wird. und wenn du für die bedingung "position=GROESSE_PWM_WERTE" 
schreibst, wird dieser ausdruck nie false.

Tho Wes schrieb:
> 2. Frage:

korriegier mal den anfang... vielleicht tritt dann dieser blink fehler 
nicht mehr auf
#3871332
Lesenswert?

1. Soll eigentlich funktionieren mit
1
position < GROESSE_PWM_WERTE
. Mit <= läufst du ja aus deinem Array raus.

2. Weil du mit dem <= aus dem Array rausläufst und dann irgendeine 
undefinierte wert liest.

Probier's mal so innerhalb der while(1)-Schleife:
1
uint8_t pos;
2

3
for(pos = 0; pos < GROESSE_PWM_WERTE; pos++)
4
{
5
  OCR2 = pwm_werte[pos];
6
  _delay_ms(100);
7
}
8
for( pos = GROESSE_PWM_WERTE - 1; pos >= 0; pos--)
9
{
10
  OCR2 = pwm_werte[pos];
11
  _delay_ms(100);
12
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren