mikrocontroller.net

Forum: Compiler & IDEs Hilfe bei der Erstellung einer Definitionstabelle


Autor: Jürgen Dell (dell)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jürgen Dell (dell)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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'           */
                 ...
               };

Autor: Michael Wilhelm (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jürgen Dell (dell)
Datum:

Bewertung
0 lesenswert
nicht 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.
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.


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.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jürgen Dell wrote:
>
> 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.
> 
>
>
> 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.

Autor: Jürgen Dell (dell)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Dell (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Dell (Gast)

>Ist das korrekt?

Nöö. Du willst ja nur ein ZEICHEN ausgeben, nicht einen String. Eher so
uart_putc(Codes[1]);

MFG
Falk

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jürgen Dell (dell)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.