mit Poti LEDs stufenlos ausgeben

Gast #3621114
Lesenswert?

Djerun schrieb:
> Die LED’s sollen anhand eines Potentiometer-Wertes leuchten.

Klar soweit.

Djerun schrieb:
> Dabei steht
> jedes LED für 12,5%. Das jeweils nächste LED soll stufenlos hoch, bzw.
> runtergedimmt werden.

Jede LED steht für 12,5% und dann "stufenlos" passt nicht zu 100% in 
meine Welt. Sehe ich das richtig, dass die 12,5% das Poti in 
entsprechende Bereiche einteilen und innerhalb des Bereiches die 
jeweilige LED heller bzw. dunkler werden soll? Also wenn quasi der 
maximale Helligkeitsweit on LED X erreicht ist dann startet beginnt die 
nächste LED mit ihrer minimalen Leuchtkraft?
#3621118
Lesenswert?

Djerun schrieb:
> die erste LED soll bei einem Poti stand von 12.5% voll leuchten.
> die zweite LED bei 25% des Potis stand voll leucht. usw.
>
> und zwischen diesen werten soll immer die nächste led heller werden.


Gut.
Dann kümmere dich mal darum, dass du deine unbekannte Anzahl von LED 
unabhängig voneinander dimmen kannst.

Das Zauberwort 'Soft-PWM' ist ja schon gefallen.
Und ja, du wirst einen Timer dazu brauchen.

FAQ: Timer
#3621130
Lesenswert?

Für eine LED an einem AVR könnte eine einfache Software-PWM zb so 
aussehen.
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3

4
#define LED_DDR   DDRB
5
#define LED_PORT  PORTB
6
#define LED1_PIN  PB1
7

8
volatile uint8_t dimmLed1;
9

10
ISR( TIMER0_OVF_vect )       // Overflow Interrupt Vector
11
{
12
  static uint8_t pwmCnt;
13

14
  pwmCnt++;
15

16
  if( dimmLed1 > pwmCnt )
17
    LED_PORT |= ( 1 << LED1_PIN );
18
  else
19
    LED_PORT &= ~( 1 << LED1_PIN );
20
}
21
 
22
int main()
23
{
24
  LED_DDR |= ( 1 << LED1_PIN );
25

26
  dimmLed1 = 128;  // Helligkeit der LED
27
 
28
  TIMSK |= (1<<TOIE0);  // den Overflow Interrupt des Timers freigeben
29
  TCCR0 = (1<<CS00);    // Vorteiler 1, jetzt zählt der Timer bereits
30
 
31
 
32
  sei();                // und Interrupts generell freigeben
33

34
 
35
  while( 1 )
36
  {                     // hier braucht nichts mehr gemacht werden.
37
  }                     // der Timer selbst sorgt dafür, dass die ISR Funktion
38
}                       // regelmäßig aufgerufen wird
Gast #3621284
Lesenswert?

1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3

4
uint16_t pwmtable[32]={
5

6
    0, 1, 2, 2, 2, 3, 3, 4, 5, 6, 7, 8, 10, 11, 13, 16, 19, 23,
7
    27, 32, 38, 45, 54, 64, 76, 91, 108, 128, 152, 181, 215, 255
8
};
9

10
unsigned char ADC_value=0;
11
char brightness;
12
char pwm_count=0;
13
char LED;
14

15

16

17

18
ISR(TIMER0_OVF_vect)
19
{
20

21
  pwm_count++;
22

23
  if(pwm_count<brightness)
24
  {
25
    PORTB  |=(1<<LED);
26
  }
27
  else
28
  {
29
    PORTB  &=  ~(1<<LED);
30
  }
31

32
}
33

34

35

36
int main(void)
37
{
38

39
ADMUX |=(1<<REFS0)|(1<<ADLAR)|(1<<MUX0);
40
ADCSRA |= (1<<ADEN)|(1<<ADSC)|(1<<ADFR)|(1<<ADPS0)|(1<<ADPS2)|(1<<ADIF);
41

42
TCCR0  |=  (1<<CS00);//|(CS02);
43
TIMSK  |=  (1<<TOIE0);
44

45
DDRB=0xff;
46

47
sei();
48

49
//ADC_value=97;
50
int x;
51

52
  while(1)
53
  {
54
    ADC_value=ADCH;
55
    
56
    if(ADC_value<32){  PORTB=0x00; LED=0;}
57
    if((ADC_value>=32)&&(ADC_value<32*2)){  PORTB=0x01;     LED=1;}
58
    if((ADC_value>=32*2)&&(ADC_value<32*3)){  PORTB|=0x03;    LED=2;}
59
    if((ADC_value>=32*3)&&(ADC_value<32*4)){  PORTB|=0x07;    LED=3;}
60
    if((ADC_value>=32*4)&&(ADC_value<32*5)){  PORTB|=0x0f;    LED=4;}
61
    if((ADC_value>=32*5)&&(ADC_value<32*6)){  PORTB|=0x1f;    LED=5;}
62
    if((ADC_value>=32*6)&&(ADC_value<32*7)){  PORTB|=0x3f;     LED=6;}
63
    if((ADC_value>=32*7)&&(ADC_value<32*8)){  PORTB|=0x7f;     LED=7;}
64

65
    x=ADC_value%32;
66
    
67
    brightness=pwmtable[x];//ADC_value%32;
68
    
69

70
    
71
    ADCSRA  |=  (1<<ADSC);
72

73
  }
74

75

76

77

78
}
Gast #3622562
Lesenswert?

1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3

4
uint16_t pwmtable[32]={
5

6
    0, 1, 2, 2, 2, 3, 3, 4, 5, 6, 7, 8, 10, 11, 13, 16, 19, 23,
7
    27, 32, 38, 45, 54, 64, 76, 91, 108, 128, 152, 181, 215, 255
8
};
9

10
char ADC_value=250;
11
char brightness;
12
char pwm_count;
13
char LED=7;
14
int x;
15

16

17

18
ISR(TIMER0_OVF_vect)
19
{
20

21
  pwm_count++;
22

23
  if(pwm_count<brightness)
24
  {
25
    PORTB  |=(1<<LED);
26
      
27
  }
28
  else
29
  {  
30
    PORTB&=~(255<<LED);
31
  }
32

33
}
34

35
ISR(ADC_vect)
36
{
37
    
38
  ADC_value=ADCH;
39
    
40
  LED=ADC_value/32;
41

42
    
43
  brightness=pwmtable[ADC_value%32];
44
  
45
  ADCSRA|=(1<<ADSC);
46
  
47

48
}
49

50
int main(void)
51
{
52

53
ADMUX |=(1<<REFS0)|(1<<ADLAR)|(1<<MUX0);
54
ADCSRA |= (1<<ADEN)|(1<<ADPS0)|(1<<ADPS2)|(1<<ADIE)|(1<<ADSC);
55

56

57
TCCR0  |=  (1<<CS00);
58
TIMSK  |=  (1<<TOIE0);
59

60

61
DDRB=0xff;
62

63
sei();
64

65

66
ADCSRA|=(1<<ADSC);
67

68
  while(1)
69

70
}
Gast #3622572
Lesenswert?

Djerun schrieb:

> Zum leuchten bringe ich sie. Nur nicht Stufenlos.

Tja, dann solltest du das vielleicht ändern, wenn "stufenlos" dein Ziel 
ist...

Früher (tm) nannte man die dazu nötige Tätigkeit "programmieren". 
Solltest du vielleicht auch mal versuchen...

Als Tipp: das ist was anderes, als fremden Quelltext per Copy&Paste zu 
übernehmen...

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