Forum: Mikrocontroller und Digitale Elektronik Scancodes einer Tastatur speichern


von Björn (Gast)


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
}

von Björn (Gast)


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?

von Johannes A. (Gast)


Lesenswert?

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

Könnte es daran liegen?

Gruß Johannes

von Björn (Gast)


Lesenswert?

Hallo Johannes!

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

von Johannes A. (Gast)


Lesenswert?

Ähm, kannst Du vielleicht mal Deinen µC dazuschreiben?

Gruß Johannes

von Björn (Gast)


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...

von Johannes A. (Gast)


Lesenswert?

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

Gruß Johannes

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.