Forum: Mikrocontroller und Digitale Elektronik Problem mit Schleife für LED-Fading


von Marcel (Gast)


Lesenswert?

Hallo liebe Gemeinde,

ich hab ein klitzekleines Problem mit einer Routine für ein LED-Fading 
und hoffe, mir kann hier jemand einen Rat dazu geben.

Hier der Ausschnitt:
1
#define nBtnModeTimeout 60      // Timeout-Wert für das 'key_press'-Ereignis
2
#define nFadingTime 200          // Ein-/Ausblendzeit(in ~ms)
3
#define DIMM_TIMEOUT 10       // Zählerschritte(keine s!), bevor von 100% wieder heruntergedimmt wird
4
5
int16_t bRelaisSignal = 0;
6
int32_t nRelaisCount = 0;
7
uint8_t nBtnMode = 0;            // Programm-Modus des Tasters
8
uint8_t nBtnModeCount = 0;       // Zähler für das 'key_press'-Ereignis
9
int16_t nDimmCount = 0;         // Zähler für 
10
uint8_t bDimmDirection = 1;      // Dimmungrichtung(1:EIN;0:AUS)
11
uint8_t bFadingSignal = 0;
12
uint8_t nFadingCount = 0;        // Zähler für die Ein-/Ausblendfunktion(Fading)
13
uint8_t nSavedPWM = 255;          // Variable zur Speicherung des letzten PWM- bzw. Helligkeitswertes
14
15
ISR(TIMER1_OVF_vect)
16
{
17
  /***************************************************************************************************/
18
  if(nBtnMode != 0) // sobald irgendein Programm-Modus(s. Tasterabfragen) ausgewählt wurde,...
19
  {
20
    nBtnModeCount++; // ... Start des Zählers für die 'key'-Events(Timeout)
21
22
    if(KEY_PIN & (1<<KEY1))
23
    {
24
      if(nBtnModeCount > nBtnModeTimeout && nBtnModeCount < nBtnModeTimeout*3)
25
      {
26
        switch(nBtnMode)
27
        {
28
          /*---------------------------------------------------------------------------------*/
29
          case(1): dataCAN1 = 50;
30
               dataCAN2 = 0;
31
               dataCAN3 = 0;
32
               break;
33
          /*---------------------------------------------------------------------------------*/
34
          case(2): dataCAN1 = 0;
35
               dataCAN2 = 0;
36
37
               if(dataCAN3 < 2) //(!(PINB & (1<<PINB1)))
38
                 bFadingSignal = 1; // Signal:FadeIN
39
               else
40
                 bFadingSignal = 2; // Signal:FadeOUT
41
               break;
42
          /*---------------------------------------------------------------------------------*/
43
        }
44
        sendCAN();       // Senden der neuen PWM-Werte über das CAN-Netzwerk
45
        nBtnMode = 0;      // Zurücksetzung des Programm-Modus
46
        nBtnModeCount = 0; // Zurücksetzung des Zählers
47
      }
48
      if(nBtnModeCount >= nBtnModeTimeout*3)
49
      {
50
        nBtnMode = 0;      // Zurücksetzung des Programm-Modus
51
        nBtnModeCount = 0; // Zurücksetzung des Zählers
52
      }
53
    }
54
  }
55
  /***************************************************************************************************/
56
  if(bFadingSignal != 0)
57
  {
58
    nFadingCount++;
59
    
60
    if(nFadingCount <= nFadingTime)
61
    {
62
      if(bFadingSignal == 1) // bFadingSignal:1=FadeIN,2=FadeOUT
63
        // da 'nFadingCount*(nSavedPWM/nFadingTime)' nur int-Werte verarbeiten kann, wird
64
        // hier durch Benutzung einer temporären größeren 32Bit-Variable UND der
65
        // LEFT-Shift-Operation in einem 'Vielfachen' der Ausgangswerte weitergerechnet
66
        dataCAN3 = (nFadingCount*(((int32_t)nSavedPWM << 16)/nFadingTime)) >> 16;
67
      else
68
        // mit 'nSavedPWM-Zählerfaktor(s.o.)' wird hier der Zähler rückwärts ausgewertet
69
        dataCAN3 = nSavedPWM-((nFadingCount*(((int32_t)nSavedPWM << 16)/nFadingTime)) >> 16);
70
71
      sendCAN();
72
    }
73
    else
74
    {
75
      bFadingSignal = 0;
76
      nFadingCount = 0;
77
      
78
      USART_SEND_BYTE(dataCAN3);
79
      //dataCAN3 = 0;
80
    }
81
  }
82
}

Das Problem liegt eigentlich nur darin, dass die Routine zwar bestens 
arbeitet, aber der Fading-Endwert jeweils immer um eins höher bzw. 
niedriger als der gespeicherte Soll-Wert ist. Also bei FadeIN=254 statt 
255 und bei FadeOUT=1 statt 0.
Ich komme einfach nicht auf den Fehler:(.

Liebe Grüße

von Hartmut W. (killozap)


Lesenswert?

Die Variable nFadingCount wird am Anfang der Fading-Auswertung 
inkrementiert. Sie ist also immer mindestens 1.

 Ich vermute, dass wenn man das Inkrement erst nach der Auswertung 
durchführt das Problem behoben ist.

von Marcel (Gast)


Lesenswert?

Hallo Hartmut,

danke für die schnelle Antwort. Leider geht es aber trotzdem nicht. Sie 
bleibt weiterhin bei 1 stehen.:(

Lg

von Marcel (Gast)


Lesenswert?

Ps.:

Hab's jetzt so gelöst, dass ich jeweils einfach den fehlenden Einer-Wert 
mit in die Gleichungen reinrechne:

dataCAN3 = ((nFadingCount*(((int32_t)nSavedPWM3 << 16)/nFadingTime)) >> 
16)+1;

dataCAN3 = (nSavedPWM3-((nFadingCount*(((int32_t)nSavedPWM3 << 
16)/nFadingTime)) >> 16))-1;

Liebe Grüße

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.