Forum: Mikrocontroller und Digitale Elektronik [PIC] Problem mit Matrix Tastatur


von Andreas R. (blackpuma)


Angehängte Dateien:

Lesenswert?

Guten Abend!

Ich habe hier eine Schaltung mit einer Matrix Tastatur, 2 Tastern und 
einem LCD.

Das Problem ist wenn ich meine Tastatur abfrage bekomme ich immer den 
Stern zurück und das in einer Endlosschleife obwohl ich keine Taste 
drücke. Hier ist der Code dazu:
1
void main(void)
2
{
3
// Definition von Variablen
4
char data[16];
5
unsigned char t;
6
7
//Einstellen der Ports
8
// 0 = Output
9
// 1 = Input
10
TRISC = 0b00000000; // PORT C Ausgang
11
PORTC = 0x00;
12
13
TRISB = 0b00011000; // RB3, RB4 is Input
14
PORTB = 0x0F;
15
16
// Port A Einstellungen
17
// Alle PortA Pins digital I/O
18
ADCON1 = 0xFF;
19
20
TRISA = 0b00000000; // PORTA alles Ausgang
21
22
// XLCD Open
23
OpenXLCD( FOUR_BIT & LINES_5X7 );
24
25
/** Interrupts ***********************/
26
INTCONbits.GIE  = 0;    // Interrupts generell erlauben
27
INTCONbits.RBIF = 0;    // Interrupt on Change Flag aus
28
INTCONbits.RBIE = 1;    // Interrupt on Change aktivieren
29
RCONbits.IPEN   = 0;    // Interrupt priority aus
30
31
/** S T A R T   H A U P T P R O G R A M M *********/
32
while(1)
33
{
34
  t = 0;
35
  t = tast();
36
37
  // Abfrage ob eine Taste gedrückt wurde.
38
  if( t )
39
  {
40
    SetDDRamAddr( 0 );    // Cursor auf Position 0.
41
    while( BusyXLCD() );  // Warten bis LCD fertig ist.
42
    putcXLCD( t );      // Ausgabe eines Zeichens am LCD.
43
    while( BusyXLCD() );  // Warten bis LCD fertig ist.
44
  }
45
46
  Delay1KTCYx( 50 );
47
}
48
49
}
50
51
// Tastatur abfragen
52
unsigned char tast( void )
53
{
54
  TRISA = 0x0F; // RA0 bis RA3 sind Eingänge
55
56
  PORTBbits.RB0 = 0;
57
  PORTBbits.RB1 = 1;
58
  PORTBbits.RB2 = 1;
59
60
  if( !PORTAbits.RA3 )
61
  {
62
      return '*';
63
  }
64
65
  return 0;
66
}

Ich suche nun schon 2 Abende aber ich finde das Problem nicht.

Bitte helft mir!
Danke
Andreas

von Andreas R. (blackpuma)


Lesenswert?

Hab nach endlosem herum probieren noch immer keine Lösung gefunden.

Folgender Codefetzten bedeutet doch, dass der Char * nur zurückgegeben 
wird wenn an PIN RA3 ein Low Pegel anliegt oder? Dort liegt aber immer 
ein High Pegel an durch den Pull UP Widerstand R4. Wieso springt er dort 
trotzdem immer hinein? Woran kann das liegen?

1
// Tastatur abfragen
2
unsigned char tast( void )
3
{
4
  TRISA = 0x0F; // RA0 bis RA3 sind Eingänge
5
6
  if( !PORTAbits.RA3 )
7
  {
8
      return '*';
9
  }
10
11
  return 0;
12
}

von Peter D. (peda)


Lesenswert?

Vielleicht solltest Du ein Leerzeichen ' ' ausgeben, wenn der Returnwert 
0 ist.
Sonst bleibt das einmal geschriebene Zeichen bis in alle Ewigkeit 
stehen.


Peter

von Andreas R. (blackpuma)


Lesenswert?

Peter Dannegger schrieb:
> Vielleicht solltest Du ein Leerzeichen ' ' ausgeben, wenn der Returnwert
> 0 ist.
> Sonst bleibt das einmal geschriebene Zeichen bis in alle Ewigkeit
> stehen.

Wenn der return Wert 0 ist passt alles weil ja if( t ) steht. Dann führt 
er die Schleife nicht aus. Das Problem ist das er trotz High an RA3 die 
Schleife ausführt und einen * zurück gibt als return Wert.

von Andreas R. (blackpuma)


Lesenswert?

Habe wieder weiter probiert. Wenn ich statt RA3 die PINs RA0 und RA1 
verwende funktioniert es das er nicht in die Schleife springt. Wenn ich 
RA2 bis RA5 verwende springt er wieder in die Schleife obwohl die PINs 
auf High liegen. Haben die PINs irgendeine spezielle Funktion oder 
bedürfen einer Sonderbehandlung? Im Datenblatt wäre mir nichts 
aufgefallen.

von Andreas R. (blackpuma)


Lesenswert?

Ich habe das Problem endlich gelöst!
1
// Port A Einstellungen
2
// Alle PortA Pins digital I/O
3
ADCON1 = 0xFF;

Kann nicht funktionieren. Mit FF ist auf RA2 und RA3 die externe 
Referenzspannung aktiviert.

BG und schönen Abend!
Andreas

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.