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 }
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?
Bit 2 hat als hex-Maske immer noch den Wert 0x04 und nicht 0x08... Könnte es daran liegen? Gruß Johannes
Hallo Johannes! Ja, schon, aber der Data- Kanal ist an PIN 4 an Port D angeschlossen. Und das ist 0x08
Ähm, kannst Du vielleicht mal Deinen µC dazuschreiben? Gruß Johannes
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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.