timer interrupt; state machine, ATTINY45

Gast #2629705
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
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
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

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.