In Unicode sind 256 Braille-Zeichen im Unicode-Block Braille-Zeichen (U+2800 bis U+28FF) kodiert. Buchstaben bzw. Ziffern (Soll der Buchstabe die Bedeutung einer Zahl haben, so wird das Zahlzeichen vorangesetzt): Die Punkte werden nach folgendem Schema nummeriert: obere Zeile [1] und [4] mittlere Zeile [2] und [5] untere Zeile [3] und [6] Bei Benutzung von Blindenschreibmaschinen sind die Tasten der Punkte gleichzeitig zu betätigen, um das entsprechende Zeichen zu schreiben. Da es aber auch auf dem digitalen Wege zur Verzögerung kommen kann, wird das gleichzieitige drücken der Tasten vernachlässigt erstmal. Die Tasten der Blindenschreibmaschine sind wie folgt angeordent: links: [3] [2] [1] |Leertaste| rechts: [4] [5] [6] Für den Buchstaben y mussen die Tasten 13456 gedrückt werden. Da ich später den Buchstaben zum Pc übertragen möchte, soll der ASCII-CODE für diese Tastenkombination defeniert werden. Wie soll ich das am besten anstellen?
D.h. du hast 7 Tasten. Jede Taste kommt an einen Pin voneinem Port. Damit hat jede Taste eine andere Wertigkeit und du bekommst beim Drücken von unterschiedlichen Tastenkombinationen jeweils eine andere Zahl von diesem Port. Diese Zahl nimmst du als Index in eine Tabelle aus der der Buchstabe kommt, der für diese Tastenkombination vorgesehen ist. Das mit dem gleichzeitigen Drücken: Würde ich mal so versuchen, dass eine Tastenkombination nur dann gültig ist, wenn sie über einen gewissen Zeitraum hin stabil anliegt. D.h. du liest den Port ein, wartest einen gewissen Zeitraum und liest den Port nochmal ein. Sind beide Zahlen identisch, so gilt das dann als Tastendruck. Den vergleiche ich dann mit dem Tastendruck von unmittelbar davor um festzustellen ob die Tastenkombination gerade gedrückt wurde oder ob sie immer noch gedrückt ist. Nur wenn sie gerade gedrückt wurde, wird dann das Zeichen (das ich mit der Zahl aus der Tabelle bekomme) weggeschickt.
Man bin ich blöd. total logisch. Weis aber nicht wie das definiert wird. Bin noch nicht so gut vertraut mit der Materie. Aber danke im voraus.
Jürgen Dell wrote:
> Man bin ich blöd. total logisch. Weis aber nicht wie das definiert wird.
//
// Taste 1 Bit 0
// Taste 2 Bit 1
// Taste 3 Bit 2
// Taste 4 Bit 3
// Taste 5 Bit 4
// Taste 6 Bit 5
// Leertaste Bit 6
//
char Codes[] = { ' ', /* 0 = 0000000 ... kein Zeichen */
'a', /* 1 = 0000001 ... 'a' */
'b', /* 2 = 0000010 ... 'b' */
....
'y', /* 61 = 0111101 ... 'y' */
...
};
@ Karl Heinz, was ist, wenn 2 x die gleiche Kombination gedrückt wurde? Als Abbruchbedingung, bzw. Gültigkeit der Tasten würde ich 7 offene Tasten nehmen. MW
Erstmal Danke Karl Heinz @Michael Wilhelm Ja genau das war noch mein Gedanke, wenn keine Taste gedrückt ist. Es soll ja erstmal nach jeder Tastenkombination der Buchstabe zum PC gesendet werden. Asynchrone Übertragung heisst es glaube ich. Da ist es der Gedanke von Michael Wilhelm richtig.
1 | Das mit dem gleichzeitigen Drücken: Würde ich mal so versuchen, |
2 | dass eine Tastenkombination nur dann gültig ist, wenn sie |
3 | über einen gewissen Zeitraum hin stabil anliegt. D.h. |
4 | du liest den Port ein, wartest einen gewissen Zeitraum |
5 | und liest den Port nochmal ein. Sind beide Zahlen identisch, |
6 | so gilt das dann als Tastendruck. Den vergleiche ich dann |
7 | mit dem Tastendruck von unmittelbar davor um festzustellen |
8 | ob die Tastenkombination gerade gedrückt wurde oder ob sie |
9 | immer noch gedrückt ist. Nur wenn sie gerade gedrückt wurde, |
10 | wird dann das Zeichen (das ich mit der Zahl aus der Tabelle |
11 | bekomme) weggeschickt. |
Das wäre dann der nächste Schritt. Wäre Dankbar wenn ich da Infos zu bekommen könnte. Mache aber erst die Tabelle fertig.
>Soll der Buchstabe die Bedeutung einer Zahl >haben, so wird das Zahlzeichen vorangesetzt Also brauchst du zumindest noch eine Zustandsverwaltung, die erkennt, wann eine Zahl erzeugt werden soll. Oliver
Michael Wilhelm wrote: > @ Karl Heinz, > > was ist, wenn 2 x die gleiche Kombination gedrückt wurde? Als > Abbruchbedingung, bzw. Gültigkeit der Tasten würde ich 7 offene Tasten > nehmen. Ja, so in etwa würde ich das sehen. An der Tastenauswertung bzw. Entprellung ändert sich dadurch nichts. Einzig und alleine wenn dann ganz hinten rauskommt, dass das gesuchte nächste Zeichen das mit dem Index 0 ist greift eine Sonderbehandlung ein, die verhindert das dieses Zeichen gesendet wird. Wenn du den Benutzer explizit dazu zwingst, zwischen 2 Zeichen immer alle Tasten loslassen zu müssen, dann denke ich, dass das Handling da nicht allzugut sein wird. Muss man aber ausprobieren.
Jürgen Dell wrote:
>
1 | > Das mit dem gleichzeitigen Drücken: Würde ich mal so versuchen, |
2 | > dass eine Tastenkombination nur dann gültig ist, wenn sie |
3 | > über einen gewissen Zeitraum hin stabil anliegt. D.h. |
4 | > du liest den Port ein, wartest einen gewissen Zeitraum |
5 | > und liest den Port nochmal ein. Sind beide Zahlen identisch, |
6 | > so gilt das dann als Tastendruck. Den vergleiche ich dann |
7 | > mit dem Tastendruck von unmittelbar davor um festzustellen |
8 | > ob die Tastenkombination gerade gedrückt wurde oder ob sie |
9 | > immer noch gedrückt ist. Nur wenn sie gerade gedrückt wurde, |
10 | > wird dann das Zeichen (das ich mit der Zahl aus der Tabelle |
11 | > bekomme) weggeschickt. |
12 | > |
> > > Das wäre dann der nächste Schritt. Wäre Dankbar wenn ich da Infos zu > bekommen könnte. Mache aber erst die Tabelle fertig. Was soll ich dir da noch mehr Infos geben? Steht doch in kompremierter Form alles im Artikel. Noch mehr Infos und ich schreib dir dein Programm. Und das ist ja nicht unbedingt der Sinn der Sache.
JA stimmt, HAst mir die Infos ja schon gegeben. Der Benutzer muss die Tasten loslassen den nur sobewegt sich der Schieber bei ner Braille-Schreibmaschiene. Und daher soll der Zustand wenn keine Tasten gedrückt sind das übertragen auslösen. Danke viel mals.
Wie lese ich es aus nem Array aus? Irgendwie spuckt der mir entweder alles oder nur einen kleinen Teil uart_puts(Codes[1]); Ist das korrekt?
@ Dell (Gast)
>Ist das korrekt?
Nöö. Du willst ja nur ein ZEICHEN ausgeben, nicht einen String. Eher so
1 | uart_putc(Codes[1]); |
MFG Falk
Dell wrote: > Wie lese ich es aus nem Array aus? Irgendwie spuckt der mir entweder > alles oder nur einen kleinen Teil > > uart_puts(Codes[1]); > > Ist das korrekt? Kann ich mir nicht wirklich vorstellen. Der Funktionsname uart_puts impliziert durch das letzte s, dass es gerne einen String haben möchte, also eine Character Sequenz, die mit einem '\0' Zeichen abgeschlossen ist. Auf der anderen Seite wird deine Code-Tabelle wahrscheinlich ja nicht aus Strings bestehen, sondern aus einzelnen Zeichen. Ergo: uart_puts ist die falsche Funktion (Nachtrag: Aber eigentlich hätte sich der Compiler da beschweren müssen, wenn du versuchst einen einzelnen char in eine Funktion zu stopfen, die einen char* haben will) Hast du keine Funktion uart_putc()? Wenn nicht: Sieh dir mal die Funktion uart_puts im Detail an. Die Chancen stehen nicht schlecht, dass innerhalb von uart_puts eine Funktion aufgerufen wird, die ein einzelnes Zeichen ausgibt. Genau diese Funktion brauchst du. Und kauf dir C-Literatur. Der Unterschied zwischen Strings und Charactern, bzw. wie man mit beidem umgeht ist in C ein sehr fundamentaler.
Ruhig Ruhig^^^ int uart_putc(unsigned char c) { while (!(UCSRA & (1<<UDRE))) /* warten bis Senden moeglich */ { } UDR = c; /* sende Zeichen */ return 0; } die Funktion habe ich auch. Habe nicht dran gedacht dass ich ja nur ein Zeichen sende. Literatur ist bestellt und kommt diese Woche an.
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.