m328 pwm + timer

Gast #5229848
Lesenswert?

ich versuche mich mit pwm + isr:
1
static void pwm_timer_init(void)
2
{
3
    ICR1 = 0xFF; // set TOP to 16bit
4
 
5
    // set none-inverting mode
6
    TCCR1A |= (1 << COM1A1)|(1 << COM1B1);
7

8
    // set Fast PWM mode using ICR1 as TOP
9
    TCCR1A |= (1 << WGM11);
10
    TCCR1B |= (1 << WGM12)|(1 << WGM13);
11
    
12

13
    TCCR0A |= (1 << COM0A1)|(1 << COM0B1);
14
    // set none-inverting mode
15
    TCCR0A |= (1 << WGM01) | (1 << WGM00);
16
    // set fast PWM Mode
17

18

19

20
    TCCR2A |= (1 << COM2A1)|(1 << COM2B1);
21
    // set none-inverting mode
22
    TCCR2A |= (1 << WGM21) | (1 << WGM20);
23
    // set fast PWM Mode
24
 
25
 
26
TCCR0B |= ti_prescaler_8;//1
27
TCCR2B |= ti_prescaler_8;//1
28
TCCR1B |= ti_prescaler_8;//1
29

30
    OCR1A = 60;
31
    OCR1B = 60;
32
  OCR0A = 60;
33
   OCR0B = 60;
34
  OCR2A = 60;
35
  OCR2B = 60;
36
  
37
 
38
  DDRB |= (1 << 3); DDRD |= (1 << 3);
39
  DDRB |= (1 << 1) | (1 << 2);
40
  DDRD |= (1 << 5) | (1 << 6);
41
  
42
  // Enable Timer1 capture event interrupt.
43
 // TIFR0 = _BV(ICF1) | _BV(OCF1B) | _BV(OCF1A) | _BV(TOV1) ;
44
//  TIMSK0 = 
45
//  TCCR0A |= (1 << WGM01);
46

47
  TIMSK0 |= (1 << OCIE0A);    //Set the ISR COMPA vect
48
 //  TIMSK0 |= (1 << TOIE0);    //Set the ISR ovf vect
49
 // Enable Timer1 capture event interrupt.
50

51
//  TIFR1 = (1<<ICF1) | (1<<OCF1B) | (1<<OCF1A) | (1<<TOV1) ;
52
//  TIMSK1 = (1<<ICIE1);
53

54
sei();
55
}
56

57
v u16 tim;
58

59
ISR(TIMER0_COMPA_vect)
60
{
61
tim++;
62
if(tim>10){
63
  tim=0;
64
  led1_tog;
65
  }
66
}

pwm funktioniert, die isr wird aber nur einmal angesprungen.

Was ist falsch?
(Firma: matzetronics) #5229860
Lesenswert?

Arduino F. schrieb:
> Warum ist tim nicht volatile?

grundschüler schrieb:
> v u16 tim;

Solls wohl sein, aber der Rest der Welt weiss nicht, ob v wirklich für 
volatile steht. Da tim aber ausserhalb der ISR nicht genutzt wird, kann 
man besser eine static innerhalb der ISR nehmen, damit entsteht die 
Verwirrung gar nicht.
Lustige Sachen passieren bei sowas, wenn noch irgendwo anders ein 'v' 
benutzt wird... Da es die Lesbarkeit auch nicht erhöht, halte ich 
persönlich solche defines für Blödsinn.
Wirklich sinnvoll wären defines für die PWM Ausgänge, stattdessen steht 
da:
  DDRB |= (1 << 3); DDRD |= (1 << 3);
  DDRB |= (1 << 1) | (1 << 2);
  DDRD |= (1 << 5) | (1 << 6);

Das ist nun wirklich Quak.

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