C-Programm Softpwm Problem mit der ISR (oder mit der Main?)

Gast #3035190
Lesenswert?

Verwendeter MC: ATtiny2313

Das ganze soll eine sehr einfache SW PWM geben, ich weiß man könnte es 
auch mit dem PWM mode machen und einfach die OCx Pins nehmen, aber ich 
will es so und es müsste meiner Meinung nach auch so funktionieren?
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3

4
#define F_CPU         8000000L           // Systemtakt in Hz
5

6
volatile uint16_t t0_ovf_cnt=0;          // zähler der T0 Überläufe
7

8

9
ISR(TIMER0_COMPA_vect)
10
{
11
  PORTD|=(1<<PD5);          //beim Vergleichswert LED einschalten  
12
}
13

14
ISR(TIMER0_OVF_vect)
15
{
16
  t0_ovf_cnt++;            //zähler hochzählen
17
  PORTD=0x00;              //beim Überlauf LED ausschalten
18
}
19

20

21
//Compare Wert Register : OCR0A u. B
22
// Aktueller Zählerstand von T0: TCNT0
23

24
//TCCR0B  prescaler 0 ="1"  1024="5"
25
//TIMSK "INterrupts"  bits OCIE0A und OCIE0B
26

27

28

29
int main()
30
{
31
  
32
  TCCR0B|=3;                   //Prescaler 
33
  TIMSK |= (1<<OCIE0A|1<<OCIE0B|1<<TOIE0); //OUtputcompare interrupts und ovf
34
  
35
  DDRD |= 0x7F; //Ports als Ausgänge schalten
36
  // =1111111 (nur 7 einser, da es nur bis PD6 geht)
37
  
38
  OCR0A=230;
39
  
40
  sei();
41

42
  
43

44
  
45
  while(1)
46
  {
47
    if (t0_ovf_cnt>=500)  // Nach 500 PWM Durchläufen
48
    {
49
      PORTD^=(1<<PD5);  // PIN D5 Toggeln
50
    }  
51
  }  
52
  
53
  
54
  
55
  return 0;
56
  
57

58
  
59
}



Hab das ganze schon im Atmelstudio laufen lassen und festgestellt, dass 
sobald der zähler auf 1 gesetzt wurde nach der 2. oder 3. If abfrage der 
zähler einfach so wieder auf 0 gestellt wird. Ich verstehe aber einfach 
nicht warum. Vielleicht könnt ihr mir ja helfen.

mfg Jo
Gast #3035202
Lesenswert?

Ok danke für den Hinweis. Werd mich mal belesen.
Achja oben haben sich bei dem ganzen Copy&Paste noch im Code 2 
Fehlerchen eingeschlichen: in der Main soll PD6 getoggelt werden (dass 
ergibt mehr Sinn als jetzt) und der Counter wird auch innerhalb der IF 
Verschachtelung zurückgesetzt

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