mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Scancodes einer Tastatur speichern


Autor: Björn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen!

Ich soll die Scancodes einer Tastatur in einem µC speichern und 
anschließend an einen PC übertragen. Doch irgendwie wird nur Mist 
übertragen.

Und zwar werte ich nach einer negativen Flanke des Clock- Signals den 
Data Kanal aus und schreibe je nach dem eine 1 oder 0 in eine Variable. 
Beim nächsten Interrupt schiebe ich dann die Variable und werte erneut 
den Data Kanal aus. Die ISR sieht so aus:

int Feld[100];
int nte_taste=0;
int interruptzaehler=0;

ISR (INT1_vect)
{
  interruptzaehler++;
  if(nte_taste==99)return;
  if(interruptzaehler==11)
  {
    interruptzaehler=1;
    nte_taste++;
  }
  if (interruptzaehler>1 && 
interruptzaehler<9)Feld[nte_taste]=Feld[nte_taste]<<1;
  if (interruptzaehler>1 && interruptzaehler<9 && 
(PIND&0x08)!=0x08)Feld[nte_taste]|=0x01;
  if (interruptzaehler>1 && interruptzaehler<9 && 
(PIND&0x08)!=0x00)Feld[nte_taste]|=0x00;
}


Jedoch wird in Feld[x] immer das selbe geschrieben, denn beim Senden an 
HyperTerminal wir immer 77 oder FF oder irgendwas ausgegeben.

Vielleicht hier noch die main() mit dem Übertragen an die UART. Ich weiß 
katastrophal programmiert, aber es soll ja nur funktionieren. Es kann 
nur an die UART übertragen werden wenn eine Taste an Pin PD2 gedrückt 
wird:



int i=0;
char c[7];
int n;
main ()
{

  UCSRB=0x08;
  UCSRC=0x86;
  UBRRH=0x00;
  UBRRL=0x17;
  sei ();                    // Interrupts zulassen
  DDRD = 0x00;               // PORT D = Eingang
  PORTD = 0xFF;              // PORTD = PULL-UP
  GICR=0x80;
  MCUCR=0x08;    // fallende Flanke an PD3
  do
  {
    if ((PIND&0x04)!=0x04)
    {
      while(!(UCSRA & (1<<UDRE)));
      {
        i++;
        if (i==99)i=0;
        itoa (Feld[i],c,16);
        for (n=0;n<1;n++)
        {
          UDR=(c[n]);
        }
        _delay_ms(10);
      }
    }

  }
  while (true);              // Mainloop
}

Autor: Björn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also, habs jetzt nochmal überarbeitet. Tut aber immer noch nicht so wie 
es soll.

Die UART funktioniert einwandfrei, an der liegts nicht. Es muss an der 
ISR liegen. Dort wird beim Drücken unterschiedlicher Tasten immer der 
selbe Wert geschrieben, auch mit meiner überarbeiteten Version:

ISR (INT1_vect)
{
  if (nte_taste==99)return;

  if (interruptzaehler>0 && interruptzaehler<8)
  {
    if ((PIND&0x08)!=0x08)
    {
      Feld[nte_taste]=Feld[nte_taste]|0x01;
    }

    Feld[nte_taste]=Feld[nte_taste]<<1;
  }

  interruptzaehler++;

  if (interruptzaehler==11)
  {
    interruptzaehler=0;
    nte_taste++;
  }
}

Was ich hier nicht ganz verstehe. Das könnte ich mal am Rande fragen. 
Und zwar die Zeile if ((PIND&0x08)!=0x08). Hier wird in die if- Bedinung 
gesprungen, wenn eine "1" am PIN D4 anliegt. O.k. die und- Verknüpfung 
verstehe ich ja noch. Aber warum dann ungleich 0x08?? Aus der 
Verknüpfung folgt bei PIN D2=1 -> 0x08. So müsste es doch dann heißen 
(PIND&0x08)==0x08 damit die Bedingung wahr ist. Aber aus jedem Beispiel 
geht hervor, dass die Bedinung bei "!=" wahr ist. Wie kommt denn das? 
Habe ich da einen Denkfehler?

Autor: Johannes A. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bit 2 hat als hex-Maske immer noch den Wert 0x04 und nicht 0x08...

Könnte es daran liegen?

Gruß Johannes

Autor: Björn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Johannes!

Ja, schon, aber der Data- Kanal ist an PIN 4 an Port D angeschlossen. 
Und das ist 0x08

Autor: Johannes A. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ähm, kannst Du vielleicht mal Deinen µC dazuschreiben?

Gruß Johannes

Autor: Björn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Atmega8L

Ja, ich hab noch gesehen, an den Zählvariablen war noch was falsch. 
Jetzt kommen zwar einigermaßen stimmige Werte raus aber immer noch nicht 
genau der Wert für die Taste. D.h. es kommt immer sowas wie A8F0A8 raus. 
Also das F0 stimmt ja mal, aber der Rest nicht...

Autor: Johannes A. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also beim mega8 im DIP-Gehäuse ist Pin4 PD2, und da ist die Bitmaske 
immer noch 0x04 und nicht 0x08...

Gruß Johannes

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.