Nabend,
Ich habe hier einen Tiny2313 an dem sind drei Taster ein MosFed, ein
Summer und ein LCD. Der Tiny soll meinen LED Belichter steuern und zwar
habe ich zwei Taster mit dennen ich die Zeit einstellen kann. Das wäre
bei checkButtons() die ersten zwei PIND3 u. PIND2.
Die beiden funktionieren einwandfrei. Der dritte Button auf PIND6 aber
nicht. Wird die Variabel status auf 0 gesetzt steht die Zeitschaltuhr
still. Bei status 1 läuft die Zeitschaltuhr.
Sobald ich Strom draufgebe Startet die Zeitschaltuhr sofort und das LED
Array ist an. Das sollte es aber nicht! Sobald ich den Taster an PIND6
drücke geht es aus. Ich kann mir nicht erklären da die drei Taster
indentisch eingebaut sind.
THX 4 Help
Daniel
1 | #include "LEDBelichter.h"
|
2 |
|
3 | uint8_t status;
|
4 | uint8_t beep;
|
5 | volatile unsigned long Sekunden=30;
|
6 | volatile unsigned long Minuten=8;
|
7 | ISR(TIMER1_COMPA_vect)
|
8 | {
|
9 | if(status == 1)
|
10 | {
|
11 | if(Minuten == 0 && Sekunden == 0)
|
12 | {
|
13 | status = 2;
|
14 | }
|
15 | else
|
16 | {
|
17 | if(Sekunden == 0)
|
18 | {
|
19 | Minuten--;
|
20 | Sekunden = 59;
|
21 | }
|
22 | else
|
23 | {
|
24 | Sekunden--;
|
25 | }
|
26 | }
|
27 | }
|
28 | }
|
29 |
|
30 | // PIND0 MosFet [Ausgang]
|
31 | // PIND1 Summer [Ausgang]
|
32 | // PIND2 JP2 -> [Eingang]
|
33 | // PIND3 JP1 -> [Eingang]
|
34 | // PIND6 JP3 -> [Eingang]
|
35 | void init()
|
36 | {
|
37 | status = 0;
|
38 | beep = 1;
|
39 | lcd_init(LCD_DISP_ON);
|
40 | //Registerinitialisierung
|
41 | TCCR1A = 0b00000000; //Timer im CTC-Mode; Prescaler 256; CPU-Clock
|
42 | TCCR1B = 0b00001100; //Timer im CTC-Mode; Prescaler 256; CPU-Clock
|
43 | TCCR1C = 0b00000000; //Timer im CTC-Mode; Prescaler 256; CPU-Clock
|
44 | TIMSK = 0b01000000; //Interrupt bei Compare Match
|
45 | OCR1A = 62499; //genau eine Sekunde; Comparematch-Register
|
46 |
|
47 | DDRD &= ~((1<<DDD2)|(1<<DDD3)|(1<<DDD6));
|
48 | DDRD |= (1<<DDD1) | (1<<DDD0);
|
49 | PORTD = ((1<<PD2) | (1<<PD3) | (1<<PD6));
|
50 | sei();
|
51 |
|
52 |
|
53 | }
|
54 |
|
55 | int main(void)
|
56 | {
|
57 |
|
58 | init();
|
59 |
|
60 | for (;;)
|
61 | {
|
62 | if( (!(PORTD & (1 << PD0))) && status == 1) // LED-Array
|
63 | {
|
64 | PORTD |= (1<<PD0);
|
65 |
|
66 | } else if (status == 0 || status == 2){
|
67 | PORTD &= ~(1<<PD0);
|
68 | }
|
69 | if(status == 2 && beep == 1) //beep
|
70 | {
|
71 | cli();
|
72 | uint8_t i;
|
73 | for(i=0;i<4;i++)
|
74 | {
|
75 | PORTD |= (1<<PD1);
|
76 | _delay_ms(1000);
|
77 | PORTD &= ~(1<<PD1);
|
78 | _delay_ms(1000);
|
79 | }
|
80 | beep = 0;
|
81 | sei();
|
82 | }
|
83 |
|
84 | checkButtons();
|
85 | _delay_ms(100);
|
86 | updateLcd();
|
87 | }
|
88 | }
|
89 |
|
90 | void checkButtons()
|
91 | {
|
92 | if(PIND & (1<<PIND3))
|
93 | {
|
94 | cli();
|
95 | status = 0;
|
96 | if(Sekunden <= 55)
|
97 | {
|
98 | Sekunden += 5;
|
99 | }
|
100 | else
|
101 | {
|
102 | Sekunden = 0;
|
103 | if(Minuten <= 30)
|
104 | Minuten++;
|
105 | }
|
106 |
|
107 | sei();
|
108 | }
|
109 | if(PIND & (1<<PIND2))
|
110 | {
|
111 | cli();
|
112 | status = 0;
|
113 | if(Sekunden >= 5)
|
114 | {
|
115 | if(Sekunden == 59)
|
116 | {
|
117 | Sekunden -= 4;
|
118 | }
|
119 | else
|
120 | {
|
121 | Sekunden -= 5;
|
122 | }
|
123 | }
|
124 | else
|
125 | {
|
126 | Sekunden = 59;
|
127 | if(Minuten > 0)
|
128 | Minuten--;
|
129 | }
|
130 |
|
131 | sei();
|
132 | }
|
133 | if(PIND & (1<<PIND6))
|
134 | {
|
135 |
|
136 | if(status == 0)
|
137 | {
|
138 | cli();
|
139 | status = 1;
|
140 | beep = 1;
|
141 | sei();
|
142 | }
|
143 |
|
144 | }
|
145 | }
|
146 |
|
147 |
|
148 |
|
149 | void updateLcd()
|
150 | {
|
151 | lcd_clrscr();
|
152 | lcd_gotoxy(0,0);
|
153 | lcd_puts("Status: ");
|
154 | switch(status)
|
155 | {
|
156 | case 0:
|
157 | lcd_puts("STOP");
|
158 | break;
|
159 | case 1:
|
160 | lcd_puts("RUN");
|
161 | break;
|
162 | case 2:
|
163 | lcd_puts("END");
|
164 | break;
|
165 | default:
|
166 | lcd_puts("NDEF");
|
167 | }
|
168 | lcd_gotoxy(0,1);
|
169 | lcd_puts("Zeit: ");
|
170 | lcd_puts(getCharFromInt(Minuten/10));
|
171 | lcd_puts(getCharFromInt(Minuten%10));
|
172 | lcd_puts(":");
|
173 | lcd_puts(getCharFromInt(Sekunden/10));
|
174 | lcd_puts(getCharFromInt(Sekunden%10));
|
175 | }
|
176 | char *getCharFromInt(uint8_t index){
|
177 | switch(index)
|
178 | {
|
179 | case 0:
|
180 | return "0";
|
181 | break;
|
182 | case 1:
|
183 | return "1";
|
184 | break;
|
185 | case 2:
|
186 | return "2";
|
187 | break;
|
188 | case 3:
|
189 | return "3";
|
190 | break;
|
191 | case 4:
|
192 | return "4";
|
193 | break;
|
194 | case 5:
|
195 | return "5";
|
196 | break;
|
197 | case 6:
|
198 | return "6";
|
199 | break;
|
200 | case 7:
|
201 | return "7";
|
202 | break;
|
203 | case 8:
|
204 | return "8";
|
205 | break;
|
206 | case 9:
|
207 | return "9";
|
208 | break;
|
209 | }
|
210 | return "?";
|
211 | }
|