Moin,
ich bin gerade dabei, meinen ATmega644 ausgiebig zu testen... :)
Also, Folgendes:
Ich habe am Port D Folgendes angeschlossen:
D2: Taster
D3: Taster
D4: Taster
D5: LED
D6: LED
Ich möchte, dass die LED an D7 mit konstanter Geschwindigkeit blinkt.
(funktioniert wie gewünscht)
Über die Tasten soll gewählt werden, wie schnell es blinkt: D2 - 4Hz, D3
- 2Hz, D4 - 1Hz. (funktioniert gar nicht)
Die LED an D5 soll anzeigen, ob gerade ein Taster gedrückt ist.
(funktioniert wunderbar)
Folgenden C-Code habe ich auf den Mega geflasht:
1 | #include <avr/interrupt.h>
|
2 | #include <avr/io.h>
|
3 | #include <stdbool.h>
|
4 |
|
5 | #define sbi(x,b) x |= (1 << (b))
|
6 | #define cbi(x,b) x &= ~(1 << (b))
|
7 |
|
8 | void delayMs( unsigned int ms )
|
9 | {
|
10 | while( ms > 0 )
|
11 | {
|
12 | TCNT0 = 0;
|
13 | while( TCNT0 < 64 ){;}
|
14 | ms--;
|
15 | }
|
16 | }
|
17 |
|
18 | bool pressed = false;
|
19 | int freq = 1000;
|
20 |
|
21 | int main(void)
|
22 | {
|
23 | // Disable watchdog
|
24 | WDTCSR &= ~(1<<WDE);
|
25 |
|
26 | //Init timer
|
27 | cbi(TCCR0B,CS00);
|
28 | cbi(TCCR0B,CS01);
|
29 | sbi(TCCR0B,CS02);
|
30 |
|
31 |
|
32 | //Init Interrupt
|
33 | PCICR = (1 << PCIE3);
|
34 | PCMSK3 = (1 << PCINT28);
|
35 | PCMSK3 |= (1 << PCINT27);
|
36 | PCMSK3 |= (1 << PCINT26);
|
37 | sei();
|
38 |
|
39 | DDRD = 0b01100000;
|
40 | PORTD = 0b00011100;
|
41 | while(1)
|
42 | {
|
43 | PORTD ^= 0b01000000;
|
44 | delayMs(freq);
|
45 | }
|
46 | while (1) {}
|
47 | }
|
48 |
|
49 | ISR(PCINT3_vect)
|
50 | {
|
51 | PORTD ^= 0b00100000;
|
52 | pressed = !pressed;
|
53 | if (pressed)
|
54 | {
|
55 | if(PIND4)
|
56 | { freq = 1000; }
|
57 | else if(PIND3)
|
58 | { freq = 500; }
|
59 | else if(PIND2)
|
60 | { freq = 250; }
|
61 | }
|
62 | }
|
Übrigens: Ich habe auch schon IF-Abfragen der Form "if ((PIND & 4) == 4)
{freq = 250;}". Auch ohne Erfolg.
Wenn ich über der Zeile "PORTD ^= ..." in der ISR ein "freq = 100;"
hinzufüge, passiert auch nichts; immer wird genau 1s gewartet.
Wer weiß, wodran's liegen könnte?
Gruß,
euer LDer