Forum: Compiler & IDEs Hilfe bei der Erstellung einer Definitionstabelle


von Jürgen D. (dell)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Jürgen D. (dell)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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'           */
                 ...
               };

von Michael Wilhelm (Gast)


Lesenswert?

@ 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

von Jürgen D. (dell)


Lesenswert?

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.

von Oliver (Gast)


Lesenswert?

>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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Jürgen D. (dell)


Lesenswert?

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.

von Dell (Gast)


Lesenswert?

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?

von Falk B. (falk)


Lesenswert?

@ 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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Jürgen D. (dell)


Lesenswert?

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
Noch kein Account? Hier anmelden.