Forum: Mikrocontroller und Digitale Elektronik Tastenmatrix spinnt herum


von Grevak D. (xorda)


Angehängte Dateien:

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?

: Bearbeitet durch User
von Christian H. (netzwanze) Benutzerseite


Lesenswert?

Grevak D. schrieb:
> Was kann ich tun?

Verwende keinen Interrupt zur Tastenabfrage (außer dem Timer).

von Grevak D. (xorda)


Lesenswert?

Das Problem ist, dass unser Lehrer möchte, dass wir Interrupts nutzen. 
Und wir kennen gerade nur den Pin Change Interrupt. Außerdem hat es ja 
mit externen Pulldown Widerständen funktioniert

von Lothar (Gast)


Lesenswert?

Du kannst im Interrupt nochmal prüfen ob und welche Taste gedrückt 
wurde.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Grevak D. schrieb:
> Das Problem ist, dass unser Lehrer möchte, dass wir Interrupts nutzen.
Dann nimm einen Timerinterrupt.

von Grevak D. (xorda)


Lesenswert?

Er soll aber nicht pollen, das ist ineffizient

von Peter D. (peda)


Lesenswert?

Grevak D. schrieb:
> Er soll aber nicht pollen, das ist ineffizient

Seit wann ist eine CPU-Last <0,1% ineffizient?

Alle einwandfrei funktionierenden Tastenroutinen pollen per Timer.
Alle anderen bringen den Anwender durch Fehlfunktion (Prellen usw.) 
regelmäßig zur Weißglut.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Lothar M. schrieb:
> Dann nimm einen Timerinterrupt.

Grevak D. schrieb:
> Und wir kennen gerade nur den Pin Change Interrupt.

Peter D. schrieb:
> Seit wann ist eine CPU-Last <0,1% ineffizient?

Blöd, wenn sein Lehrer offensichtlich etwas anderes behauptet.

von Frank M. (ukw) (Moderator) Benutzerseite


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.

: Bearbeitet durch Moderator
von Grevak D. (xorda)


Lesenswert?

Wir haben entprellen schon durch genommen. Dass ich die falschen Pullups 
aktiviert habe ist mir nicht aufgefallen xD

Ich werde es mal ausprobieren

Mit Pollen war allerdings eigentlich gemeint, dass wir nicht in einer 
Schleife die ganze Zeit über PINx abfragen

Wir hatten halt Timerinterrupts noch nicht im Unterricht

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.