Tastenmatrix spinnt herum

#5316222
Lesenswert?

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?
Angehängte Dateien:
Moderator Persönliche Seite #5316919
Lesenswert?

Grevak D. schrieb:
> Ich möchte interne Pullup Widerstände benutzen.
>
>     PCMSK2 = 1 << PCINT20 | 1 << PCINT21 | 1 << PCINT22 | 1 << PCINT23;

Da Du nicht angegeben hast, welchen AVR Du verwendest, tippe ich einfach 
mal auf ATMega88/168/328.

Hier sind:

PCINT20 = PD4
PCINT21 = PD5
PCINT22 = PD6
PCINT23 = PD7

> DDRD = 0b00000000;
> PORTD = 0b00001111;

In der zweiten Zeile schaltest Du die internen Pullups für PD0...PD3 
ein, aber nicht für PD4...PD7.

Kein Wunder, dass Deine Tastatur "überempfindlich" ist. Dein Inputs 
floaten einfach so rum und reagieren bereits bei schiefem Angucken.

Schreibe also:

PORTD = 0b11110000;

um die richtigen Pullups einzuschalten.

P.S.
Taster per PCINT auszulesen ist - wie oben schon gesagt - wirklich die 
schlechteste Idee überhaupt. Prellende Taster erzeugen nicht nur mehrere 
Interrupts (was auch die CPU belastet), sondern sind auch noch schwierig 
zu erkennen und zu filtern. Kannst Du ja mal bei Gelegenheit in einer 
der nächsten Lehrstunden zur Diskussion stellen. Siehe auch 
Entprellung.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren