Forum: Mikrocontroller und Digitale Elektronik Attiny45 SoftPWM


von equi (Gast)


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

von Falk B. (falk)


Lesenswert?

Was ist mit TCCR0A?

von equi (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.