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

Eine eigene Frage? Dieser Thread ist über 8 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.