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.