Hallo, da die Tage mal wieder kürzer werden und somit mehr Zeit zum Basteln bleibt, beschäftige ich mich zurzeit mal wieder mit den kleinen Käfern (Atmega8) und insbesondere dem AVR Fading Tutorial ( http://www.mikrocontroller.net/articles/LED-Fading ). Das normale Ansteuern der digitalen I/O Ports funktioniert schon mal recht gut (Dauerleuchten, Blinken, mit Taster abfragen was gesetzt werden soll, etc.). Jetzt wollte ich mal die 3 PWM Pins zum gleichzeitigen Faden von LEDs nutzen. Leider bekomme ich nicht die Verbindung wie ich in die Register(?) der zwei weiteren Anschlüsse (PB2 + PB3) schreibe, dass sie ebenfalls angesprochen werden. Im Moment läuft nur PB1 wie gewünscht. Die beiden Anderen machen gar nichts. 1) In der main() muss ich doch einfach nur wie unten getan die Ausgänge PB2 und PB3 aktivieren? 2) Sind die zusätzlich gemachten Einträge (gekennzeichnet mit "// ???") in der pwm_16_256() richtig oder totaler Quatsch? Irgendwie habe ich die Vermutung das irgend eine Verbindung zu den"TCCRx" fehlt... Die Suche hilft mir leider auch nach dutzenden von gelesenen Threads nicht weiter :-( Aufbau: Atmega8 (Betriebsspannung 5V) An PB1, 2 und 3 hängen jeweils eine LED mit Vorwiderstand an GND (Die LEDs haben untereinander keine Verbindung).
1 | /* Obere Codehälfte gekürzt -> Gleiche wie im Tutorial */
|
2 | void pwm_16_256(uint16_t delay){ |
3 | int16_t tmp; |
4 | #if STK500
|
5 | TCCR1A = 0xC2; // inverted PWM on OC1A, 16 Bit Fast PWM |
6 | #else
|
7 | TCCR1A = 0x82; // non-inverted PWM on OC1A, 16 Bit Fast PWM |
8 | #endif
|
9 | TCCR1B = 0x18; |
10 | ICR1 = 0xFFFF; // TOP for PWM, full 16 Bit |
11 | |
12 | TCCR1B &= ~0x7; // clear clk setting |
13 | TCCR1B |= 1; // precaler 1 -> ~122 Hz PWM frequency |
14 | |
15 | for(tmp=0; tmp<=255; tmp++){ |
16 | OCR1A = pgm_read_word(pwmtable_16+tmp); |
17 | OCR1B = OCR1A; // ??? |
18 | OCR2 = OCR1A; // ??? |
19 | my_delay(delay); |
20 | }
|
21 | |
22 | for(tmp=255; tmp>=0; tmp--){ |
23 | OCR1A = pgm_read_word(pwmtable_16+tmp); |
24 | OCR1B = OCR1A; // ??? |
25 | OCR2 = OCR1A; // ??? |
26 | my_delay(delay); |
27 | }
|
28 | }
|
29 | |
30 | int main(void) { |
31 | int16_t i; |
32 | int16_t step_time=400; |
33 | |
34 | DDRB |= (1<<PB1); // -> OC1A |
35 | DDRB |= (1<<PB2); // -> OC1B? |
36 | DDRB |= (1<<PB3); // -> OC2? |
37 | |
38 | while(1) { |
39 | for(i=0; i<3; i++) pwm_16_256(step_time/16); |
40 | };
|
41 | return 0; } |
Danke im Voraus :-)