Problem mit Schleife für LED-Fading

Gast #2576996
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
Gast #2577082
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

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