Software PWM Lösungsansatz

OP #3329802
Lesenswert?

Guten Tag,

ich hänge bei einem alten, wieder hervorgebrachten Projekt. Mein 
Thermometer mit 10 RGB LEDs, von 10-30°C, je 2°C eine LED. Je kälter 
desto mehr blau, je wärmer, desto mehr rot sollen die LEDs leuchten.

Ich habe daher eine Matrix, welche die Ansteuerung der Einzelfarben 
erlaubt.

Nun hänge ich aber an folgendem Problem. Wenn ich den Code wie im Anhang 
mal testweise geschrieben auf den µC brenne:
1
int main() {
2
  while(1) {
3
    
4
    LightUpLed(0x01, 0x01, 30);
5
    LightUpLed(0x01, 0x02, 30);
6
    LightUpLed(0x01, 0x04, 30);
7
    LightUpLed(0x02, 0x01, 30);
8
    LightUpLed(0x02, 0x02, 30);
9
    LightUpLed(0x02, 0x04, 30);
10
    LightUpLed(0x04, 0x01, 30);
11
    LightUpLed(0x04, 0x02, 30);
12
    LightUpLed(0x04, 0x04, 30);
13
    
14
  };
15
};
16

17
void LightUpLed(uint8_t uRow, uint8_t uCol, int Brightness)
18
{
19
  int diff = (100 - Brightness) * 10;
20
    
21
    PORTC = ~uRow;
22
    PORTD = uCol;
23

24
    for (int i = 0; i < Brightness; i++) {
25
      _delay_us(1);
26
    };
27

28
    PORTC = ~0x00;
29
    PORTD = 0x00;
30
    
31
    for (int i = 0; i < diff; i++)
32
    {
33
      _delay_us(1);
34
    };
35
}

Dann hab ich auf den LEDs ein unwahrscheinliches Flackern drauf. Bei 
1MHz internem Oszillator ist das wohl viel zu langsam. Allerdings möchte 
ich den Takt niedrig halten, da das Teil hinterher an einem 9V Block 
läuft, und mir 10mA Stromaufnahme eigentlich eh schon viel zu viel sind.

Habt ihr irgendwelche Ideen?

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