timer interrupt; state machine, ATTINY45

Gast #2629705
Lesenswert?

Hallo,

Ich will mittels 2er Taster die ED eines Triacs steuern(Lüfterdrehzahl)

Ich benutze den ATTiny45 und AVR Studio(spielt bei meinem Problem 
wahrscheinlich keine Rolle)

Über INT0 bekommt der Pin jedesmal einen Impuls beim Nulldurchgang.

Die Taster werden per Polling eingelesen.

Weiters nutze ich den Timer um einen "globalen" Zähler zu 
inkrementieren, welcher beim "Nulldurchgangs - Interrupt" null gesetzt 
wird.

Mir fehlt so wies Aussieht der Überblick/Verständnis ich finde den 
Fehler nicht. Mein Programm funktioniert genauso wie erhofft wenn ich 
entsprechende Breakoint in die versch. Zustände(switch case) setze - 
d.h. ED stellt sich wie erhofft ein.

Läuft der µC ohne den Breakpoint schaltet der Ausgang(Triac) "nur" 
zwischen 0 und 1 hin und her. Wie gesagt beim Debuggen mit Breakpoints 
funktionierts aber.

Anbei mein Code (bin Anfänger!!)

Danke
1
volatile uint16_t counts=0;
2
uint16_t n=0;
3
int zustand =0;
4

5

6
ISR(INT0_vect)
7
{
8
  counts=0;
9
}
10

11

12
ISR(TIM1_COMPA_vect)
13
{
14
  counts++;
15
    
16
  if((counts<=n) && (n!=0) && (n!=1))
17
  {
18
    PORTB = 0b00000000;
19
  }
20
  
21
  
22
  if((counts>n) && (n!=0) && (n!=1))
23
  {
24
    PORTB = 0b00000010;
25
  }
26
    
27
  
28
  if(n==0)//dauerbetrieb aus
29
  {
30
    PORTB=0b00000000;
31
  }
32
  
33
  if(n==1)//dauerbetrieb ein
34
  {
35
    PORTB=0b00000010;
36
  }
37
  
38
  else 
39
  {
40
    PORTB = 0b00000000; //PB1 = pin6
41
  }
42
  
43
}
44

45

46
int main(void)
47
{
48
  
49
  sei();
50
  MCUCR = 0b00000011;
51
  GIMSK = 0b01000000;
52
  
53

54
  CLKPR=0b00000000;
55
  TIMSK = 0b01000000;
56
  
57
  TCCR1 = 0b00000001;
58
  OCR1A = 0b11111111;
59
  
60
  DDRB =  0b00000011; 
61
  
62
  
63
    while(1)
64
    {
65

66
  switch (zustand)
67
  {
68
    case 0:
69
        //aus
70
        n=0;
71
        break;
72
    case 1:
73
        n=80;
74
        break;
75
    case 2:
76
        n=160;
77
        break;
78
    case 3:
79
        n=320;
80
        break;
81
    case 4:
82
        n=500;
83
        break;
84
    case 5:
85
        n=1;//dauerein
86
        break;
87
    
88
    default:break;
89
  }
90
      
91
    
92
  
93
  if(PINB& (1<<PB4))
94
  {
95
    zustand++;
96
  }
97
     
98
     
99
  if(PINB& (1<<PB3))
100
  {
101
    zustand--;
102
  }  
103
       
104
       
105
     
106
  }    
107
}
Moderator (Firma: Titel) Persönliche Seite #2629732
Lesenswert?

johann schrieb:
> if(PINB& (1<<PB4))
>   {
>     zustand++;
>   }
Was meinst du, wie schnell deine while(1) Schleife durchlaufen wird?
Und wie kurz du den Taster drücken müsstest, damit der zustand nur um 
1 hochgezählt wird?
Und was meinst du, wie schnell dein zustand einen ungültigen Wert 
(kleiner 0 oder größer 6) erreicht? Und wie lange der dann braucht, um 
wieder in den Bereich zwischen 0 und 6 zu kommen?

Die Chancen für eine Zahl zwischen 0 und 6 liegen bei knapp 1:10000... 
:-o
Überleg mal, wie ich da drauf komme...
Gast #2629755
Lesenswert?

Was Lothar meint, dir fehlt die Tasterentprellung....
Deine Statemashine sieht etwas merkwürdig aus.

Weisst du dass das hier:
1
  if(n==1)//dauerbetrieb ein
2
  {
3
    PORTB=0b00000010;
4
  }
5
  
6
  else 
7
  {
8
    PORTB = 0b00000000; //PB1 = pin6
9
  }

deinen Ablauf stört, denn wenn n!= 1, dann immer alles aus....
Denk lieber nochmal drüber nach.


Ingo

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