Forum: Mikrocontroller und Digitale Elektronik ATmega8 / 8-Bit LED Fading- Rhythmus / logik problem


von Tho W. (tommyprog)


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 :/

von Ch. K. (Gast)


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

von Eric B. (beric)


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
}

von Eric B. (beric)


Lesenswert?

Ch. Kim schrieb:
> und wenn du für die bedingung "position=GROESSE_PWM_WERTE"
> schreibst, wird dieser ausdruck nie false.

Was Ch. Kim ausgelassen hat:
1
position = GROESSE_PWM_WERTE
 ist nämlich eine Zuweisung, kein Vergleich!

von Karl H. (kbuchegg)


Lesenswert?

Eric B. schrieb:


> for( pos = GROESSE_PWM_WERTE - 1; pos >= 0; pos--)

das wird nicht klappen. Denn ein
1
uint8_t pos;

ist per Definition immer >= 0

Bei Runterzählschleifen muss man vorsichtig sein. Da fällt man mit der 
Abbruchbedingung schnell auf die Schnauze

von Dietrich L. (dietrichl)


Lesenswert?

Eric B. schrieb:
> Was Ch. Kim ausgelassen hat:position = GROESSE_PWM_WERTE ist nämlich
> eine Zuweisung, kein Vergleich!

Das ist ja auch der Startwert, daher richtig.

von Tho W. (tommyprog)


Lesenswert?

Ja, danke euch beiden, bin geistig nichtmehr in der Lage eine FOR- 
Schleife zu schreiben. (das mit den arrays habe ich auch sogar 
nummeriert gehabt..)

hab die Bedingung umgedreht :x

von Tho W. (tommyprog)


Lesenswert?

Bitte topic closed, hat sich erledigt. Danke euch.

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.