von
eXaxt (Gast)
29.04.2010 17:11
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
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)
29.04.2010 17:17
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?
@ eXaxt (Gast)
Lies mal was über Netiquette . Lange Quelltexte gehören in den
Anhang! Und im Falle des Tutorial reicht ein Link.
MFG
Falk
@ 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.