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