mikrocontroller.net

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


Autor: Andreas Riegebauer (blackpuma)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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:
void main(void)
{
// Definition von Variablen
char data[16];
unsigned char t;

//Einstellen der Ports
// 0 = Output
// 1 = Input
TRISC = 0b00000000; // PORT C Ausgang
PORTC = 0x00;

TRISB = 0b00011000; // RB3, RB4 is Input
PORTB = 0x0F;

// Port A Einstellungen
// Alle PortA Pins digital I/O
ADCON1 = 0xFF;

TRISA = 0b00000000; // PORTA alles Ausgang

// XLCD Open
OpenXLCD( FOUR_BIT & LINES_5X7 );

/** Interrupts ***********************/
INTCONbits.GIE  = 0;    // Interrupts generell erlauben
INTCONbits.RBIF = 0;    // Interrupt on Change Flag aus
INTCONbits.RBIE = 1;    // Interrupt on Change aktivieren
RCONbits.IPEN   = 0;    // Interrupt priority aus

/** S T A R T   H A U P T P R O G R A M M *********/
while(1)
{
  t = 0;
  t = tast();

  // Abfrage ob eine Taste gedrückt wurde.
  if( t )
  {
    SetDDRamAddr( 0 );    // Cursor auf Position 0.
    while( BusyXLCD() );  // Warten bis LCD fertig ist.
    putcXLCD( t );      // Ausgabe eines Zeichens am LCD.
    while( BusyXLCD() );  // Warten bis LCD fertig ist.
  }

  Delay1KTCYx( 50 );
}

}

// Tastatur abfragen
unsigned char tast( void )
{
  TRISA = 0x0F; // RA0 bis RA3 sind Eingänge

  PORTBbits.RB0 = 0;
  PORTBbits.RB1 = 1;
  PORTBbits.RB2 = 1;

  if( !PORTAbits.RA3 )
  {
      return '*';
  }

  return 0;
}

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

Bitte helft mir!
Danke
Andreas

Autor: Andreas Riegebauer (blackpuma)
Datum:

Bewertung
0 lesenswert
nicht 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?

// Tastatur abfragen
unsigned char tast( void )
{
  TRISA = 0x0F; // RA0 bis RA3 sind Eingänge

  if( !PORTAbits.RA3 )
  {
      return '*';
  }

  return 0;
}

Autor: Peter Dannegger (peda)
Datum:

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


Peter

Autor: Andreas Riegebauer (blackpuma)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas Riegebauer (blackpuma)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas Riegebauer (blackpuma)
Datum:

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

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

BG und schönen Abend!
Andreas

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.