Forum: Mikrocontroller und Digitale Elektronik C-Programm Softpwm Problem mit der ISR (oder mit der Main?)


von Joachim (Gast)


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

von troll (Gast)


Lesenswert?

Keine Ahnung obs mit dem Fehler zutun hat, aber der Zugriff auf die 
globale Variable muss atomar erfolgen.

von holger (Gast)


Lesenswert?

>Ich verstehe aber einfach nicht warum.

Man aktiviert keine Interrupts für die es keinen Handler gibt.
So einfach ist das.

von Joachim (Gast)


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

von Joachim (Gast)


Lesenswert?

holger schrieb:
>>Ich verstehe aber einfach nicht warum.
>
> Man aktiviert keine Interrupts für die es keinen Handler gibt.
> So einfach ist das.

ok werd ich auch versuchen. Hat sich daher ergeben, dass mein Programm 
ursprünglich deutlich umfangreicher war ^^

von Joachim (Gast)


Lesenswert?

Tatsache funzt alles.
Vielen Dank euch!

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.