Attiny45 SoftPWM

Gast #2931074
Lesenswert?

Hi Forum,

ich wollte den SoftPWM-Code vom Tutorial 
(http://www.mikrocontroller.net/articles/Soft-PWM) für den Attiny45 
umschreiben, jedoch tut sich bei den Ausgängen nichts. Als Ausgang hab 
ich 0,1 und 2 definiert. Die Änderungen die ich gemacht habe:
1
// Defines an den Controller und die Anwendung anpassen
2
#if !defined(F_CPU)
3
  #define F_CPU         8000000L       // Systemtakt in Hz
4
#endif
5
#define F_PWM         100L               // PWM-Frequenz in Hz
6
#define PWM_PRESCALER 8                  // Vorteiler für den Timer
7
#define PWM_STEPS     256                // PWM-Schritte pro Zyklus(1..256)
8
#define PWM_PORT      PORTB              // Port für PWM
9
#define PWM_DDR       DDRB               // Datenrichtungsregister für PWM
10
#define PWM_CHANNELS  3                  // Anzahl der PWM-Kanäle
11
...
12
ISR(TIMER0_COMPA_vect) {
13
    static uint8_t pwm_cnt;                     // ändern auf uint16_t für mehr als 8 Bit Auflösung
14
    uint8_t tmp;                                // ändern uint16_t oder uint32_t für mehr Kanäle
15

16
    OCR0A += isr_ptr_time[pwm_cnt];
17
    tmp    = isr_ptr_mask[pwm_cnt];
18

19
    if (pwm_cnt == 0) {
20
        PWM_PORT = tmp;                         // Ports setzen zu Begin der PWM
21
                                                // zusätzliche PWM-Ports hier setzen
22
        pwm_cnt++;
23
    }
24
    else {
25
        PWM_PORT &= tmp;                        // Ports löschen
26
                                                // zusätzliche PWM-Ports hier setzen
27
        if (pwm_cnt == pwm_cnt_max) {
28
            pwm_sync = 1;                       // Update jetzt möglich
29
            pwm_cnt  = 0;
30
        }
31
        else pwm_cnt++;
32
    }
33
}
34
...
35
int main(void) {
36
    // PWM Port einstellen
37
    PWM_DDR = 0x07;         // Port als Ausgang: 0,1,2 ->pin 5,6,7
38
    // zusätzliche PWM-Ports hier setzen
39

40
    TCCR0B = 2;             // Timer läuft mit Prescaler 8
41
    TIMSK |= (1<<OCIE0A);// Interrupt freischalten
42

43
    sei();                  // Interrupts global einschalten
44

45
    //startvariablen setzen
46
    const uint8_t t7[8]={0, 0, 0, 0, 0, 125, 125, 125};
47
    memcpy(pwm_setting, t7, 8);
48
    //pwm_setting[0]=255;
49
    pwm_update();
Ausgänge machen keinen mux, irgendwas hab ich glaub ich vergessen xD
Hoffe ihr könnt mir helfen.

Grüßle equi
Gast #2932091
Lesenswert?

hab den Fehler gefunden:
1
//                   pb0,pb1....
2
const uint8_t t7[8]={0, 0, 0, 0, 0, 125, 125, 125};
3
//muss dann so aussehen
4
const uint8_t t7[8]={125, 125, 125, 0, 0, 0, 0, 0};
Rheienfolge ist andersrum als gewohnt^^. Da der code nicht so zu meinen 
Projekt gepasst hat, hab ich selber ein Soft-PWM geschrieben. Bei 
mehreren Kanälen mit Unterschiedlichen Werten hat das angefangen zu 
flackern.

Grüßle equi

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren