Forum: Mikrocontroller und Digitale Elektronik Timer läuft immer weiter, sollte aber stoppen und bei null beginnen


von Daniel (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich bin dabei eine Phasenanschnittsteuerung für eine 
B2-Stromrichterschaltung auf dem ATMega2561 zu programmieren. Hierfür 
werden netzsynchrone Zündimpulse zum Einschalten von Thyristoren 
berechnet und übergeben.
Für eine Regelung wird allerdings noch die Stromleitdauer der 
Thyristoren benötigt. Diese wird mit einer Optokopplerschaltung 
ermittelt und dann an den PIN PD1 als TTL-Signal (grüner Verlauf) 
übergeben.
Die Dauer des Signals soll über den Timer3 gemessen werden.

Der Timer3 soll im Zündzeitpunkt der Thyristoren bei null starten und in 
der ISR (INT1), durch die positive Flanke des grünen Verlaufs ausgelöst, 
in LAMBDA geschrieben werden.

Das Problem besteht aber darin, dass der Timer3 im Interupt1 nicht 
aufhört zu zählen und den Wert in LAMBDA kontinuierlich erhöht.
Wie kann ich den Timer3 nach dem Übergeben des Zählerstandes stoppen, so 
dass dieser bei der nächsten Zündung wieder bei null anfängt zu zählen?
1
ISR (INT0_vect)        
2
{
3
  leitdauerErkennung1 = 1;
4
  TCNT1 = 0;
5
  TCNT4 = 0;
6
  ALPHAnutz = ALPHArech;
7
  OCR1A = ALPHAnutz;
8
  LAMBDA = LAMBDAmess;
9
}
10
11
ISR (INT1_vect)        
12
{
13
  EIMSK &= ~(1<<INT1);        
14
15
  if(leitdauerErkennung1)
16
  {
17
    leitdauerErkennung1 = 0;
18
    LAMBDA1 = TCNT3;         
19
    TCCR3B = 0x00;          
20
  }
21
22
  if(leitdauerErkennung2)
23
  {
24
    leitdauerErkennung2 = 0;
25
    LAMBDA2 = TCNT3;
26
    TCCR3B = 0x00;
27
    LAMBDAmess = (LAMBDA1 + LAMBDA2) / 2;
28
  }
29
}
30
31
ISR (TIMER1_COMPA_vect)        //Zündung erste Halbwelle
32
{
33
  if(gezuendet)
34
  {
35
  zweiteHalbwelle = 1;
36
  ausschaltsicherung = 0;
37
        weiterZuenden = 1;
38
39
  if(drehrichtung)
40
  {
41
     //PORTA |= (1<<PINA7);      
42
  }
43
  else
44
  {
45
  PORTA |= (1<<PINA4);      
46
  EIMSK |= (1<<INT1);        
47
  TCCR3B = 0x02;        
48
//   TCNT3 = 0;
49
  }
50
51
  OCR1B = ALPHAnutz + 400;      
52
  }
53
}
54
55
ISR (TIMER1_COMPB_vect)      //Löschen aller gezündeten Pins
56
{
57
  if(gezuendet)
58
  {
59
    if(weiterZuenden)
60
    {
61
      ausschaltsicherung = 1;
62
63
        PORTA &= ~(1<<PINA4);    
64
        PORTA &= ~(1<<PINA5);  
65
        PORTA &= ~(1<<PINA6);    
66
        PORTA &= ~(1<<PINA7);    
67
68
      if(zweiteHalbwelle)
69
      {
70
        zweiteHalbwelle = 0;
71
        OCR1C = ALPHAnutz + 20000;
72
      }
73
      else
74
      {
75
        weiterZuenden = 0;
76
      }
77
    }
78
  }
79
}
80
81
ISR (TIMER1_COMPC_vect)        //Zündung zweite Halbwelle
82
{
83
  if(gezuendet)
84
  {
85
    if(weiterZuenden)
86
    {
87
      ausschaltsicherung = 0;
88
89
      if(drehrichtung)
90
      {
91
        //PORTA |= (1<<PINA6);    
92
      }
93
      else
94
      {
95
        PORTA |= (1<<PINA5);    
96
        EIMSK |= (1<<INT1);      
97
        TCCR3B = 0x02;      
98
//        TCNT3 = 0;
99
      }
100
101
      OCR1B = ALPHAnutz + 20400;    
102
    }
103
  }
104
}

: Bearbeitet durch User
von Oliver (Gast)


Lesenswert?

Immer das ganze Programm zeigen (als Anhang)

Ich wette mal in blaue hinein: volatile

Oliver

von Daniel (Gast)


Angehängte Dateien:

Lesenswert?

Im Anhang befindet sich der gesamte Quellcode.

von Stefan E. (sternst)


Lesenswert?

Wenn du das Rücksetzen des Timer-Wertes auf 0 überall auskommentierst, 
ist es ja kein Wunder, wenn das nicht passiert.

von Daniel (Gast)


Lesenswert?

Ja, da hst du recht aber wenn ich das Rücksetzen des Timer-Wertes 
einkommentiere, ist das Ergebnis immer gleich null.

von Stefan E. (sternst)


Lesenswert?

Dann hast du das Rücksetzen wohl an den falschen Stellen.

: Bearbeitet durch User
von Martin K. (maart)


Lesenswert?

Variablen, welche in einer ISR verändert werden, sollten mit
1
volatile
 deklariert werden.

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.