Hi!
Ich möchte am Atmega328 einen Drehencoder betreiben. Die beiden Pins A
und B sind (mit dem Hühnerfuter für die Entprellung laut Datenblat) an
INT0 und INT1 angeschlossen.
Für einen ersten Test möchte ich ein paar LEDs einschalten, wenn ein
Interrupt auftritt.
Als erstes Setze ich die Pins als Eingänge:
1 | #define EncoderTaster PORTD4
|
2 | #define EncoderA PORTD3
|
3 | #define EncoderB PORTD2
|
4 |
|
5 | void PORT_Setup (void)
|
6 | {
|
7 | //ALLE EINGÄNGE EINSCHALTEN:
|
8 | DDRD &= ~(1 << EncoderTaster);
|
9 | DDRD &= ~(1 << EncoderA);
|
10 | DDRD &= ~(1 << EncoderB);
|
11 |
|
12 | //PULLUPS EINSCHALTEN
|
13 | PORTD |= (1 << EncoderTaster);
|
14 | PORTD |= (1 << EncoderA);
|
15 | PORTD |= (1 << EncoderB);
|
16 | }
|
Dann stelle ich die Interrupt Register passend ein. Ich dachte erst hier
liegt mein Fehler, allerdings habe ich die selbe Konfiguration der
Register schon mehrmals bei anderen Projekten im Internet gesehen.
1 | void InterruptConfig (void)
|
2 | {
|
3 | EICRA = 0b00000101;
|
4 | EIMSK = 0b00000011;
|
5 | sei();
|
6 | }
|
Dann kommen hier noch die ISR:
Die Funktion "LEDRing" steuert mir 8 LEDs um den Drehencoder herum an.
Ihr wird ein Byte übergeben, indem die Zustände der 8 LEDs enthalten
sind. 0xff bedeutet, dass alle LEDs an sind.
1 | ISR (INT0_vect)
|
2 | {
|
3 | LEDRing(0xff);
|
4 | uart_puts("int0change");
|
5 | }
|
6 |
|
7 | ISR (INT1_vect)
|
8 | {
|
9 | LEDRing(0xff);
|
10 | uart_puts("int1change");
|
11 | }
|
Das Funktioniert so aber nicht. Weder über den UART mnoch über die LEDs
bekomme ich irgendeine Reaktion, wenn ich den Encoder drehe.
Wer kann mir helfen?
Ich habe mir die Signale an INT0 und INT1 mal mit einem Logikanalysator
angesehen. Da sieht alles gut aus, die Signale kommen also grundsätzlich
am µC an, einen Hardwarefehler kann ich also ausschließen.
Grüße!