Forum: Mikrocontroller und Digitale Elektronik m328 pwm + timer


von grundschüler (Gast)


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?

von Einer K. (Gast)


Lesenswert?

Warum ist tim nicht volatile?

von grundschüler (Gast)


Lesenswert?

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

ist es:
#define v volatile

von Matthias S. (Firma: matzetronics) (mschoeldgen)


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.

von grundschüler (Gast)


Lesenswert?

dämlicher fehler:

mit

if(tim>1000){
  led1_tog;
  tim=0;
  }

blinkt die led.

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.