Guten Morgen,
ich habe einen Code geschrieben, zum dimmen einer Lampe (einige müssten
wissen worum es geht). Ich nutze einen ATtiny2313 bei 8MHz. In dem Code
nutze ich INT0, der wird ausgelöst durch die Nulldurchgangserkennung,
bei einer fallenden Flanke. Nun möchte ich aber anstatt INT0, INT1
benutzen. Aber wenn ich alles nötige dafür ersetze, funktioniert der
Code nicht richtig, er compiliert zwar, aber in der Praxis funktioniert
er nicht.
1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 | #include <util/delay.h>
|
4 |
|
5 | #define Taster_1 (PIND&(1<<PD4))
|
6 |
|
7 | volatile struct {
|
8 | unsigned _1:1;
|
9 | unsigned _2:1;
|
10 | unsigned _3:1;
|
11 | unsigned _4:1;
|
12 | unsigned _5:1;
|
13 | unsigned _6:1;
|
14 | } Merker;
|
15 |
|
16 | volatile uint8_t Dimmrichtung = 1;
|
17 | volatile uint8_t Counter_1 = 0;
|
18 | volatile uint8_t Counter_2 = 0;
|
19 | volatile uint8_t Counter_3 = 0;
|
20 | volatile uint16_t Zuendwert = 800;
|
21 | volatile uint16_t Zuendpunkt_1 = 0;
|
22 | volatile uint16_t Zuendpunkt_2 = 0;
|
23 | volatile uint16_t Temp = 0;
|
24 |
|
25 |
|
26 | ISR(INT0_vect)
|
27 | {
|
28 | TCNT1 = 0;
|
29 |
|
30 | Merker._1 = 1;
|
31 |
|
32 | if (Taster_1)
|
33 | {
|
34 | Counter_1 = 0;
|
35 | Counter_2++;
|
36 | if (Merker._3 == 0)
|
37 | {
|
38 | Merker._2 = 1;
|
39 | }
|
40 | }
|
41 | else
|
42 | {
|
43 | Counter_1++;
|
44 | Counter_2 = 0;
|
45 | Merker._3 = 0;
|
46 | Merker._2 = 0;
|
47 | }
|
48 |
|
49 | if (Merker._2 == 1)
|
50 | {
|
51 | Counter_3++;
|
52 | }
|
53 |
|
54 | if ((Counter_3 <= 45) && (Counter_3 >= 4) && (Merker._2 == 0))
|
55 | {
|
56 | PORTD ^= (1<<6);
|
57 | Merker._4 = !Merker._4;
|
58 | if (Merker._4 == 1)
|
59 | {
|
60 | Dimmrichtung = !Dimmrichtung;
|
61 | }
|
62 | Counter_3 = 0;
|
63 | Merker._5 = 1;
|
64 | }
|
65 |
|
66 | if ((Merker._2 == 0) && (Merker._5 == 1))
|
67 | {
|
68 | Counter_3 = 0;
|
69 | }
|
70 |
|
71 | if ((Merker._4 == 0) && (Zuendwert != 0))
|
72 | {
|
73 | Temp = Zuendwert;
|
74 | Zuendwert = 0;
|
75 | Merker._6 = 1;
|
76 | }
|
77 |
|
78 | if ((Merker._6 == 1) && (Merker._4 == 1))
|
79 | {
|
80 | Zuendwert = Temp;
|
81 | Merker._6 = 0;
|
82 | }
|
83 |
|
84 | Zuendpunkt_1 = Zuendwert + 0;
|
85 | Zuendpunkt_2 = Zuendwert + 1250;
|
86 | }
|
87 |
|
88 |
|
89 | int main(void)
|
90 | {
|
91 | DDRB = 0b11111111;
|
92 | DDRD = 0b11100000;
|
93 |
|
94 | MCUCR |= (1<<ISC01)|(1<<ISC11);
|
95 | MCUCR &= ~((1<<ISC00)|(1<<ISC10));
|
96 | GIMSK |= (1<<INT0);
|
97 |
|
98 | TCCR1A = 0x00;
|
99 | TCCR1B |= (1<<CS10)|(1<<CS11);
|
100 |
|
101 | Merker._1 = 0;
|
102 | Merker._2 = 0;
|
103 | Merker._3 = 0;
|
104 | Merker._4 = 0;
|
105 | Merker._5 = 0;
|
106 | Merker._6 = 0;
|
107 |
|
108 | sei();
|
109 |
|
110 | while(1)
|
111 | {
|
112 | if ((Counter_2 == 50) && (Merker._4 == 1))
|
113 | {
|
114 | Merker._3 = 1;
|
115 | }
|
116 |
|
117 | if ((Counter_1 == 2) && (Merker._4 == 1))
|
118 | {
|
119 | Dimmrichtung = !Dimmrichtung;
|
120 | Counter_1++;
|
121 | }
|
122 |
|
123 | if (Merker._3 == 1 && Zuendwert <= 900 && Merker._1 == 1 && Dimmrichtung == 0)
|
124 | {
|
125 | Merker._1 = 0;
|
126 | Zuendwert+=5;
|
127 | Counter_3 = 0;
|
128 | Merker._2 = 0;
|
129 | }
|
130 |
|
131 | if (Merker._3 == 1 && Zuendwert >= 100 && Merker._1 == 1 && Dimmrichtung == 1)
|
132 | {
|
133 | Merker._1 = 0;
|
134 | Zuendwert-=5;
|
135 | Counter_3 = 0;
|
136 | Merker._2 = 0;
|
137 | }
|
138 |
|
139 | if (((TCNT1 == Zuendpunkt_1) || (TCNT1 == Zuendpunkt_2)) && (Zuendwert != 0))
|
140 | {
|
141 | PORTD |= (1<<5);
|
142 | _delay_us(80);
|
143 | PORTD &= ~(1<<5);
|
144 | }
|
145 | }
|
146 | }
|
Im MCUCR hab ich alles schon eingefügt was benötigt wird.
Wenn ich jetzt aber beim GIMSK das
1 | GIMSK |= (1<<INT0)|(1<<INT1);
|
anstatt
schreibe, funktioniert der Code wie beschrieben nicht mehr.
Dann muss ich ja auch nur noch anstatt
schreiben. Stimmt doch oder, fehlt dann noch etwas?
MfG
Mathias