Forum: Mikrocontroller und Digitale Elektronik LED Fading Atmega32


von eXaxt (Gast)


Lesenswert?

Guten Tag,

anhand des Tutorials von Mikrocontroller.net zum LED-Fading,
habe ich es mit dem Pollin-Board hinbekommen.
http://www.mikrocontroller.net/articles/LED-Fading

Jetzt möchte ich einen anderen Pin für die LED nutzen.
Zum Beispiel PD3 anstatt PD5.

Leider kapier ich es noch nicht und bin auf eure Hilfe angewiesen...
Evtl. kann es mir jemand anhand diesen Beitrags erklären, wie ich den 
Ausgang für die LED verändern kann:
Beitrag "Re: Zwischen 2 LEDs faden"

Hier der Code:
1
//*****************************************************************************
2
//*
3
//*  LED fading test
4
//*  uses exponential PWM settings to achive visual linear brightness
5
//*
6
//*  ATmega32 @ 8 MHz
7
//*  
8
//*                  
9
//*****************************************************************************
10
 
11
#define F_CPU 8000000L
12
 
13
#define true 1
14
#define false 0
15
 
16
#define STK500 false
17
 
18
#include <inttypes.h>
19
#include <avr/io.h>
20
#include <util/delay.h>
21
#include <avr/pgmspace.h>
22
 
23
// global variables
24
 
25
uint16_t pwmtable_8A[4]   PROGMEM = {0, 16, 64, 255};
26
uint16_t pwmtable_8B[8]   PROGMEM = {0, 4,  8, 16, 32, 64,  128, 255};
27
uint16_t pwmtable_8C[16]  PROGMEM = {0, 2, 3, 4, 6, 8, 11, 16, 23, 32, 45, 64,
28
                                    90, 128, 181, 255};
29
uint16_t pwmtable_8D[32]  PROGMEM = {0, 1, 2, 2, 2, 3, 3, 4, 5, 6, 7, 8, 10, 11,
30
                                    13, 16, 19, 23, 27, 32, 38, 45, 54, 64, 76,
31
                                    91, 108, 128, 152, 181, 215, 255};
32
 
33
uint16_t pwmtable_10[64]  PROGMEM = {0, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5,
34
                                    5, 6, 6, 7, 8, 9, 10, 11, 12, 13, 15, 17,
35
                                    19, 21, 23, 26, 29, 32, 36, 40, 44, 49, 55,
36
                                    61, 68, 76, 85, 94, 105, 117, 131, 146, 162,
37
                                    181, 202, 225, 250, 279, 311, 346, 386, 430,
38
                                    479, 534, 595, 663, 739, 824, 918, 1023};
39
 
40
uint16_t pwmtable_16[256] PROGMEM = {0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2,
41
                                     2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3,
42
                                     4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6,
43
                                     6, 7, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 11,
44
                                     11, 12, 12, 13, 13, 14, 15, 15, 16, 17, 17,
45
                                     18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28,
46
                                     29, 31, 32, 33, 35, 36, 38, 40, 41, 43, 45,
47
                                     47, 49, 52, 54, 56, 59, 61, 64, 67, 70, 73,
48
                                     76, 79, 83, 87, 91, 95, 99, 103, 108, 112,
49
                                     117, 123, 128, 134, 140, 146, 152, 159, 166,
50
                                     173, 181, 189, 197, 206, 215, 225, 235, 245,
51
                                     256, 267, 279, 292, 304, 318, 332, 347, 362,
52
                                     378, 395, 412, 431, 450, 470, 490, 512, 535,
53
                                     558, 583, 609, 636, 664, 693, 724, 756, 790,
54
                                     825, 861, 899, 939, 981, 1024, 1069, 1117,
55
                                     1166, 1218, 1272, 1328, 1387, 1448, 1512,
56
                                     1579, 1649, 1722, 1798, 1878, 1961, 2048,
57
                                     2139, 2233, 2332, 2435, 2543, 2656, 2773,
58
                                     2896, 3025, 3158, 3298, 3444, 3597, 3756,
59
                                     3922, 4096, 4277, 4467, 4664, 4871, 5087,
60
                                     5312, 5547, 5793, 6049, 6317, 6596, 6889,
61
                                     7194, 7512, 7845, 8192, 8555, 8933, 9329,
62
                                     9742, 10173, 10624, 11094, 11585, 12098,
63
                                     12634, 13193, 13777, 14387, 15024, 15689,
64
                                     16384, 17109, 17867, 18658, 19484, 20346,
65
                                     21247, 22188, 23170, 24196, 25267, 26386,
66
                                     27554, 28774, 30048, 31378, 32768, 34218,
67
                                     35733, 37315, 38967, 40693, 42494, 44376,
68
                                     46340, 48392, 50534, 52772, 55108, 57548,
69
                                     60096, 62757, 65535};
70
 
71
// long delays
72
 
73
void my_delay(uint16_t milliseconds) {
74
    for(; milliseconds>0; milliseconds--) _delay_ms(1);
75
}
76
 
77
// 8-Bit PWM with only 4 different settings
78
 
79
void pwm_8_4(uint16_t delay){
80
 
81
    int16_t tmp;
82
 
83
#if STK500
84
    TCCR1A = 0xC1;          // inverted PWM on OC1A, 8 Bit Fast PWM
85
#else
86
    TCCR1A = 0x81;          // non-inverted PWM on OC1A, 8 Bit Fast PWM
87
#endif
88
    TCCR1B = 0x08;
89
 
90
    TCCR1B &= ~0x7;         // clear clk setting
91
    TCCR1B |= 4;            // precaler 256 -> ~122 Hz PWM frequency
92
 
93
    for(tmp=0; tmp<=3; tmp++){
94
      OCR1A =  pgm_read_word(pwmtable_8A+tmp);
95
      my_delay(delay);
96
    }
97
 
98
    for(tmp=3; tmp>=0; tmp--){
99
      OCR1A = pgm_read_word(pwmtable_8A+tmp);
100
      my_delay(delay);
101
    }
102
}
103
 
104
// 8-Bit PWM with 8 different settings
105
 
106
void pwm_8_8(uint16_t delay){
107
 
108
    int16_t tmp;
109
 
110
#if STK500
111
    TCCR1A = 0xC1;          // inverted PWM on OC1A, 8 Bit Fast PWM
112
#else
113
    TCCR1A = 0x81;          // non-inverted PWM on OC1A, 8 Bit Fast PWM
114
#endif
115
    TCCR1B = 0x08;
116
 
117
    TCCR1B &= ~0x7;         // clear clk setting
118
    TCCR1B |= 4;            // precaler 256 -> ~122 Hz PWM frequency
119
 
120
    for(tmp=0; tmp<=7; tmp++){
121
      OCR1A = pgm_read_word(pwmtable_8B+tmp);
122
      my_delay(delay);
123
    };
124
 
125
    for(tmp=7; tmp>=0; tmp--){
126
      OCR1A = pgm_read_word(pwmtable_8B+tmp);
127
      my_delay(delay);
128
    }
129
}
130
 
131
// 8-Bit PWM with 16 different settings
132
 
133
void pwm_8_16(uint16_t delay){
134
 
135
    int16_t tmp;
136
 
137
#if STK500
138
    TCCR1A = 0xC1;          // inverted PWM on OC1A, 8 Bit Fast PWM
139
#else
140
    TCCR1A = 0x81;          // non-inverted PWM on OC1A, 8 Bit Fast PWM
141
#endif
142
    TCCR1B = 0x08;
143
 
144
    TCCR1B &= ~0x7;         // clear clk setting
145
    TCCR1B |= 4;            // precaler 256 -> ~122 Hz PWM frequency
146
 
147
    for(tmp=0; tmp<=15; tmp++){
148
      OCR1A = pgm_read_word(pwmtable_8C+tmp);
149
      my_delay(delay);
150
    }
151
 
152
    for(tmp=15; tmp>=0; tmp--){
153
      OCR1A = pgm_read_word(pwmtable_8C+tmp);
154
      my_delay(delay);
155
    }
156
}
157
 
158
// 8-Bit PWM with 32 different settings
159
 
160
void pwm_8_32(uint16_t delay){
161
 
162
    int16_t tmp;
163
 
164
#if STK500
165
    TCCR1A = 0xC1;          // inverted PWM on OC1A, 8 Bit Fast PWM
166
#else
167
    TCCR1A = 0x81;          // non-inverted PWM on OC1A, 8 Bit Fast PWM
168
#endif
169
    TCCR1B = 0x08;
170
 
171
    TCCR1B &= ~0x7;         // clear clk setting
172
    TCCR1B |= 4;            // precaler 256 -> ~122 Hz PWM frequency 
173
 
174
    for(tmp=0; tmp<=31; tmp++){
175
      OCR1A = pgm_read_word(pwmtable_8D+tmp);
176
      my_delay(delay);
177
    }
178
 
179
    for(tmp=31; tmp>=0; tmp--){
180
      OCR1A = pgm_read_word(pwmtable_8D+tmp);
181
      my_delay(delay);
182
    }
183
}
184
 
185
// 10-Bit PWM with 64 different settings
186
 
187
void pwm_10_64(uint16_t delay){
188
 
189
    int16_t tmp;
190
 
191
#if STK500
192
    TCCR1A = 0xC3;          // inverted PWM on OC1A, 10 Bit Fast PWM
193
#else
194
    TCCR1A = 0x83;          // non-inverted PWM on OC1A, 10 Bit Fast PWM
195
#endif
196
    TCCR1B = 0x08;
197
 
198
    TCCR1B &= ~0x7;         // clear clk setting
199
    TCCR1B |= 3;            // precaler 64 -> ~122 Hz PWM frequency
200
 
201
    for(tmp=0; tmp<=63; tmp++){
202
      OCR1A = pgm_read_word(pwmtable_10+tmp);
203
      my_delay(delay);
204
    }
205
 
206
    for(tmp=63; tmp>=0; tmp--){
207
      OCR1A = pgm_read_word(pwmtable_10+tmp);
208
      my_delay(delay);
209
    }
210
}
211
 
212
// 16-Bit PWM with 256 different settings
213
 
214
void pwm_16_256(uint16_t delay){
215
 
216
    int16_t tmp;
217
 
218
#if STK500
219
    TCCR1A = 0xC2;          // inverted PWM on OC1A, 16 Bit Fast PWM
220
#else
221
    TCCR1A = 0x82;          // non-inverted PWM on OC1A, 16 Bit Fast PWM
222
#endif
223
    TCCR1B = 0x18;
224
    ICR1 = 0xFFFF;          // TOP for PWM, full 16 Bit
225
 
226
    TCCR1B &= ~0x7;         // clear clk setting
227
    TCCR1B |= 1;            // precaler 1 -> ~122 Hz PWM frequency
228
 
229
    for(tmp=0; tmp<=255; tmp++){
230
      OCR1A = pgm_read_word(pwmtable_16+tmp);
231
      my_delay(delay);
232
    }
233
 
234
    for(tmp=255; tmp>=0; tmp--){
235
      OCR1A = pgm_read_word(pwmtable_16+tmp);
236
      my_delay(delay);
237
    }
238
}
239
 
240
int main(void)
241
{
242
    int16_t i;
243
    int16_t step_time=400;      // delay in millisecond for one fading step
244
 
245
    DDRD |= (1<<PD5);           // LED uses OC1A
246
 
247
    // test all fading routines
248
 
249
    while(1) {
250
 
251
      for(i=0; i<3; i++) pwm_8_4(step_time);
252
      my_delay(1000);
253
      for(i=0; i<3; i++) pwm_8_8(step_time/2);
254
      my_delay(1000);    
255
      for(i=0; i<3; i++) pwm_8_16(step_time/4);
256
      my_delay(1000);
257
      for(i=0; i<3; i++) pwm_8_32(step_time/8);
258
      my_delay(1000);
259
      for(i=0; i<3; i++) pwm_10_64(step_time/16);
260
      my_delay(1000);
261
      for(i=0; i<3; i++) pwm_16_256(step_time/16);
262
      my_delay(1000);
263
 
264
    };
265
 
266
    return 0;
267
}

Gruß
eXaxt

von Karl H. (kbuchegg)


Lesenswert?

eXaxt schrieb:

> Leider kapier ich es noch nicht und bin auf eure Hilfe angewiesen...
> Evtl. kann es mir jemand anhand diesen Beitrags erklären, wie ich den
> Ausgang für die LED verändern kann:

Dieser Beitrag ist ganz schlecht dafür geeignet.
Der benutzt Hardware PWM. Und dort bist du auf die Pins festgenagelt.

von eXaxt (Gast)


Lesenswert?

danke...

heißt es, ich kann es bei meinem code nicht einfach ändern?
hast du evtl. ein anderes tutorial für pwm für leds?

von Falk B. (falk)


Lesenswert?

@  eXaxt (Gast)

Lies mal was über Netiquette. Lange Quelltexte gehören in den 
Anhang! Und im Falle des Tutorial reicht ein Link.

MFG
Falk

von Falk B. (falk)


Lesenswert?

@  eXaxt (Gast)

>heißt es, ich kann es bei meinem code nicht einfach ändern?
>hast du evtl. ein anderes tutorial für pwm für leds?

Ja, Soft-PWM. Kann man mit LED-Fading kombinieren, aber mehr als 
10 Bit PWM-Auflösung sind da nicht drin.

MfG
Falk

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.