Hallo,
ich habe gestern schon wenig erfolgreich versucht den Soft-PWM
Codeschnippsel aus der Artikelsammlung auf einem Attiny461 zum laufen zu
bringen.
(http://www.mikrocontroller.net/articles/Soft-PWM#Intelligenter_L.C3.B6sungsansatz)
Das Problem ist, dass die PWM nicht über 255 Werte skaliert, sondern nur
über etwa 8. (0=Dunkel, 8=100%) Dann geht es weiter 9=0% 18=100%
Dabei habe ich den Code an diesen Stellen verändert:
1 | // Defines an den Controller und die Anwendung anpassen
|
2 |
|
3 | #define F_CPU 8000000L // Systemtakt in Hz
|
4 | #define F_PWM 100L // PWM-Frequenz in Hz
|
5 | #define PWM_PRESCALER 8 // Vorteiler für den Timer
|
6 | #define PWM_STEPS 256 // PWM-Schritte pro Zyklus(1..256)
|
7 | #define PWM_PORT PORTA // Port für PWM
|
8 | #define PWM_DDR DDRA // Datenrichtungsregister für PWM
|
9 | #define PWM_CHANNELS 5 // Anzahl der PWM-Kanäle
|
ich habe den Timer 0 genutzt:
1 | // Timer 0 Output COMPARE A Interrupt
|
2 |
|
3 | ISR(TIMER0_COMPA_vect) {
|
4 | static uint8_t pwm_cnt; // ändern auf uint16_t für mehr als 8 Bit Auflösung
|
5 | uint8_t tmp; // ändern uint16_t oder uint32_t für mehr Kanäle
|
6 |
|
7 | OCR0A += isr_ptr_time[pwm_cnt];
|
8 | tmp = isr_ptr_mask[pwm_cnt];
|
9 | |
10 | (...)
|
und noch der Aufruf:
1 | int main(void) {
|
2 |
|
3 | // PWM Port einstellen
|
4 | io_init();
|
5 |
|
6 | // Timer 0 OCRA0, als variablen Timer nutzen
|
7 |
|
8 |
|
9 | TCCR0B |= (1 << CS02);
|
10 | TIMSK |= (1 << OCIE0A);
|
11 | TCNT0L = 0;
|
12 |
|
13 | sei(); // Interrupts global einschalten
|
14 |
|
15 |
|
16 | |
17 | pwm_setting[1] = 100;
|
18 | pwm_update();
|
19 | |
20 | while(1) {
|
21 | }
|
22 | return 0;
|
23 | }
|
Hat jemand ne schnelle Idee? An den Timern habe ich schon etwas gedreht,
das Fehlerbild bleibt das selbe..
Danke!