ich sitze jetzt schon den ganzen nachmittag dran, aber bekomme es
einfach nicht hin. in der artikelsammlung gibt es ein beispiel für soft
pwm auf einem mega32.
der code sieht wie folgt aus:
1
/*
2
Eine 8-kanalige PWM mit einfachem Lösungsansatz
3
4
ATmega32 @ 8 MHz
5
6
*/
7
8
// Defines an den Controller und die Anwendung anpassen
9
10
#define F_CPU 8000000L // Systemtakt in Hz
11
#define F_PWM 100 // PWM-Frequenz in Hz
12
#define PWM_STEPS 256 // PWM-Schritte pro Zyklus(1..256)
13
#define PWM_PORT PORTD // Port für PWM
14
#define PWM_DDR DDRD // Datenrichtungsregister für PWM
15
16
// ab hier nichts ändern, wird alles berechnet
17
18
#define T_PWM (F_CPU/(F_PWM*PWM_STEPS)) // Systemtakte pro PWM-Takt
19
20
#if (T_PWM<(152+5))
21
#error T_PWM zu klein, F_CPU muss vergrösst werden oder F_PWM oder PWM_STEPS verkleinert werden
22
#endif
23
24
// includes
25
26
#include<stdint.h>
27
#include<string.h>
28
#include<avr/io.h>
29
#include<avr/interrupt.h>
30
31
// globale Variablen
32
33
volatileuint8_tpwm_setting[8];// Einstellungen für die einzelnen PWM-Kanäle
ich habe eigentlich alles unverändert gelassen, bis auf wenige stellen.
1) der cpu takt. mein atmega168 wird mit einem externen quarz auf 16Mhz
betrieben, deshalb:
1
#define F_CPU 16000000L // Systemtakt in Hz
2) die aktivierung des interrupts:
1
TCCR1B=1;// Timer läuft mit vollem Systemtakt
2
TIMSK1|=(1<<OCIE1A);// Interrupt freischalten
leider funktioniert es garnicht. die leds bleiben einfach dunkel... was
übersehe ich? da ich davon ausgehe, dass der code stimmt, wenn er so in
der artikelsammlung abgeheftet ist, wird es wohl nicht an dem liegen was
ich vermuten würde. (habe es auch ausprobiert, aber es hat auch nicht
geholfen...)
1) zum zeitpunkt, wenn der interrupt aktiviert wied ist OCR1A noch
garnicht definiert?
2) die helligkeitswerte müssten doch an irgendeiner stelle im programm
in das array pwm_setting geschrieben werden?
vielen dank für eure hilfe,
hans
@ Honsey Kk (honsey)
>#define F_CPU 16000000L // Systemtakt in Hz
Kein Problem, das ist der Sinn der Sache.
> TCCR1B = 1; // Timer läuft mit vollem Systemtakt> TIMSK1 |= (1<<OCIE1A); // Interrupt freischalten
Hab das Datenblatt im Moment nicht hier.
>1) zum zeitpunkt, wenn der interrupt aktiviert wied ist OCR1A noch>garnicht definiert?
Ist auch unwichtig, das regelt sich allein.
>2) die helligkeitswerte müssten doch an irgendeiner stelle im programm>in das array pwm_setting geschrieben werden?
Das machen die Zeilen