Forum: Mikrocontroller und Digitale Elektronik timer interrupt; state machine, ATTINY45


von johann (Gast)


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
}

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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...

von johann (Gast)


Lesenswert?

hallo,

....Deine Erklärung erscheint mir logisch.

Nur die Sache ist die ich hab das Problem mit den Taster auch mit dieser 
Methode 
http://www.mikrocontroller.net/articles/Entprellung#Flankenerkennung zu 
lösen versucht.

Brachte mir aber auch nicht den gewünschten Erfolg.
Meinst Du, dass wirklich nur das Einlesen der Taster dieses Problem 
verursacht ?

mfg

von Ingo (Gast)


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

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.