Hallo,
ich wollte eine Tastenmatrix ansteuern. Allerdings spinnt diese
Tastenmatrix. Ich habe ein Programm geschrieben, welches "Hello World"
ausgibt, wenn man auf einer diesen Tasten drückt.
Das Problem ist jedoch, dass es nicht so ganz klappt. Die Tastenmatrix
scheint überempfindlich zu sein. Der Pin Change Interrupt wird schon
ausgelöst nur wenn ich diese Tastenmatrix bewege oder sofort zu
Programmstart oder manchmal garnicht.
Ich möchte interne Pullup Widerstände benutzen. Mit externen Pulldown
habe ich es ausprobiert, damit klappt es.
Hier ist der Code. Ein Bild mit dem Aufbau der Schaltung ist angehängt
1 | #define F_CPU 16000000UL
|
2 |
|
3 | #include <stdbool.h>
|
4 | #include <avr/pgmspace.h>
|
5 | #include <avr/io.h>
|
6 | #include <avr/interrupt.h>
|
7 | #include <util/delay.h>
|
8 | #include "i2clcd.h"
|
9 | #include "i2cmaster.h"
|
10 |
|
11 | ISR(PCINT2_vect) {
|
12 | lcd_printlc(1, 1, "Hello World");
|
13 | }
|
14 |
|
15 | int main() {
|
16 | DDRC = 0b00000000;
|
17 | PORTC = 0b00110000;
|
18 |
|
19 | i2c_init();
|
20 | lcd_init();
|
21 |
|
22 | lcd_command(LCD_DISPLAYON | LCD_CURSORON | LCD_BLINKINGOFF);
|
23 | lcd_light(true);
|
24 | lcd_command(LCD_CLEAR);
|
25 |
|
26 | _delay_ms(500);
|
27 |
|
28 | DDRD = 0b00000000;
|
29 | PORTD = 0b00001111;
|
30 |
|
31 | PCMSK2 = 1 << PCINT20 | 1 << PCINT21 | 1 << PCINT22 | 1 << PCINT23;
|
32 | PCICR = 1 << PCIE2;
|
33 | sei();
|
34 |
|
35 | while (1) {
|
36 |
|
37 | }
|
38 | }
|
Was kann ich tun?