Forum: Mikrocontroller und Digitale Elektronik Auswertung eines Signals


von Bianka L. (Gast)


Lesenswert?

Hallo

Vielleicht könnt ihr mir helfen? Ich arbeite mich gerade in die µC
Programmierung ein aber hier komme ich nicht weiter. Wie man einen
einzelnen Taste rauswertet und entprellt habe ich glaube ich
verstanden. Aber das hier....

Ich habe eine Signalfolge die von einem Gerät an meinen µC gesendet
wird. Es handelt sich dabei um eine Art "Morsecode", in diesem Fall
einen bestimmten Status-Code wie "ALLES OK". So sieht es aus:

300 µs high (start)
12 µs low
25 µs high
125 µs low
300 µs high (stop)

Das Problem ist, das es sich um eine Zeitkritische Anwendung handelt.
Wärend ich auf das Eintreffen dieser Signalfolge warten will, soll der
µC auch andere Dinge machen. Also kein Delay (nichts tun bis genau
diese Signalfolge eintrifft). Es gibt eine reihe weiterer Signalfolgen
dieser Art die ich auswerten möchte.

Kann mir jemand erklären wie ich diese Zeichenfolge passiv abwarte also
ohne den Controller zum "nichts tun" zu zwingen?

Viele grüße aus dem schönen Sauerland
Bianka

von Marcus (Gast)


Lesenswert?

...indem du dir einen interrupt selber baust, der genau dann auslöst,
wenn diese signalfolge erkannt wurde...
..aber wie man das jetzt macht, muss du jemand anderen fragen... :-/

von Christoph Kessler (Gast)


Lesenswert?

Hallo Bianka

Welcher Prozessor, Sprache Assembler oder C ?
Ist das Signal ungestört, oder können Fehlimpulse auftreten?

Die AVR-Prozessoren haben zwei Anschlüsse, die flankengesteuert einen
Interrupt auslösen können, das wäre die normale Methode.
mit den seltsamen Zeitverhältnissen ist es vermutlich nicht möglich,
die asynchrone Schnittstelle auszunutzen, das wäre die zweite
Möglichkeit
oder ein Timer löst regelmäßig einen Interrupt aus, in dem der Port
abgefragt wird.

73
Christoph

von TOM (Gast)


Lesenswert?

Was denn für nen controller?
Beim AVR würde ich aufeinanderfolgende Pulslängen über ICP messen
(->Datenblatt) und schauen, ob sie in dein Muster past.

Gruß

Thomas

von Rahul (Gast)


Lesenswert?

ein weiblicher Käsebrotschmierer...

http://www.mikrocontroller.net/forum/read-1-285883.html#new

ICP lässt grüssen...

von Sebastian Heyn (Gast)


Lesenswert?

ich mache sowas so (ist halt dann nix anderes machbar in der zeit)

(timer alle 2µsec)

timer:
incr zaehlbyte
return

warten bis high kommt
timer starten
warten bis low kommt
wenn zeahlbyte>140 then bedingung 1 erfüllt
warten bis high kommt
wenn zeahlbyte>4 then bedingung 2 erfüllt

usw

von Geri (Gast)


Lesenswert?

Hallo

Für dieses Problem gibt es einige Lösungsansätze:

Ein möglicher Lösungsansatz könnte sein, das Signal mit einer Frequenz
von > 1/12E-6 *2 Hz  (167KHz) abzutasten. Mit einer steigenden Flanke
beginnt die Messung.  Bei jedem Abtastvorgang kann man eine Variable 1
bit nach links schieben. Je nachdem ob dam Eingang logisch 1 ode 0
anliegt wird die Variable um 1 inkrementiert. Am Ende - z.B. des 300uS
- Pulses muss in der Variable eine Zahl stehen, die sich in einem
bestimmten Bereich bewegt, der  auch davon abhängt, wie genau das
Eingangssignal ist. Wenn diese Bedingung erfüllt ist, dann gelangt man
in einen weiteren Status in dem die 12us low geprüft werden usw - es
läuft dann auf eine Statusmaschine raus. Wenn das Eingangssignal nicht
übereinstimmt, dann startet man wieder mit Status 0.

Variante 2:
Die Zeitmessung kann man auch elegant mit dem Capture-Compare register
durchführen, wenn noch ein freies zur Verfügung steht. Damit verbraucht
man weniger Rechenzeit. Das Ganze wieder mit einer Statusmaschine.

Wenn man letztlich von Status 0 - 1 - 2 - 4 - 5 erreicht hat, dann ist
"ALLES OK:)"


Hoffe, das hilft weiter. Selbstverständlich müsste man noch einige
Randbedingungen kennen, wie auch die Vorgänger angedeutet haben

Beste Grüsse
Geri

von Unbekannter (Gast)


Lesenswert?

@Geri:

Wenn Du jedesmal wieder bei '0' anfängst, kannst Du gültige Sequenzen
verpassen.

Du musst eher die relevanten Low-High-Zyklen abspeichern, in diesem
Fall  5 Zeiten inkl. Level, und jedesmal wenn eine neue Flanke
festgestellt wurde, den ältestens Zyklus löschen und den neuen
anhängen.

Naja, und nach jedem neuen Zyklus vergleichst Du die gespeicherte Kette
mit dem erwarteten Ergebnis inkl. Toleranzen. Natürlich nur, wenn die
richtige Phase anliegt, also die Low-High-Zustände stimmen.

von Geri (Gast)


Lesenswert?

Hallo Unbekannter

Noch zur Überlegung...

Unbekannter, du hast recht. Im beschriebenen Algorithmus bin auf solche
Fälle nicht eingegangen. Entsprechend müsste die Statusmaschine
programmiert werden. An die Lösung mit fünf Zählerwerten (z.B. in einem
Ringpuffer) und den jeweiligen Zuständen der Eingangspins habe ich auch
gedacht. Eine Prüfroutine, die alle fünf Werte inkl. den
Toleranzbereichen in der ISR auf einmal prüft, kann aber u.U. recht
viel Zeit verbrauchen. Eine Prüfung ausserhalb - z.B. in der main loop
macht die Programmierung wiederum recht schwierig, da sich die Zustände
währendessen, dass geprüft wird, in der Zwischenzeit wieder ändern
können und man den Interrupt nicht gleichzeitig abschalten sollte.

Ja, und wie gesagt: Die Randbedingungen müsste man noch kennen

Freundliche Grüsse
Geri

von Bianka L. (Gast)


Lesenswert?

Danke euch für die zahlreichen Antworten. Ich habe mich noch nicht für
einen konkreten Controller entschieden, denke aber an einen AVR, der
mit der BASCOM-AVR IDE programmiert werden kann denn die gibts für ca.
70 EUR zu haben :-)

und angeblich soll dieses BASCOM sehr anfängerfreundlich sein.

das heist also man könnte es schon so programmieren, das der µc an
einem register die datenleitung des angeschlossenen gerätes abtastet
und auf bestimmte signale wartet, so das man z.b. immer noch
bedientasten am controller benutzen kann und kleinere dinge ausführen
kann?

gibts da nicht so etwas wie "multitasking"?

von Bianka L. (Gast)


Lesenswert?

noch eine Frage... wie ist das wenn ich von der oben genannten
Signalfolge ca. 100 verschiedene habe die alle etwas bestimmtes
bedeuten und die ich auswerten will? kriegt so ein kleiner controller
das überhaupt gebacken? mache mir da jetzt sorgen...

von Thomas B. (yahp) Benutzerseite


Lesenswert?

Bei 100 verschiedenen Codes muss dann doch mal die Frage gestellt
werden, warum das mysteriöse "Gerät" diese Informationen auf
möglichst kryptischem Wege abzugeben versucht!

von Bianka L. (Gast)


Lesenswert?

das oben war nur ein beispiel :-) ich wollte nur allgemein wissen ob
sowas geht. Teilweise sind die Codes sehr einfach gehalten

von Thomas B. (yahp) Benutzerseite


Lesenswert?

Verrat' doch einfach was das für ein Gerät ist, das hundert
Statusmeldungen abgeben soll, aber nicht genug Intelligenz besitzt, um
sagen wir mal nen fürs Gegenüber einfach verständlichen UART zu
bedienen.

von Bianka L. (Gast)


Lesenswert?

Es handelt sich um eine QWERTZ-Computertastatur ;-) ich wollte euch
nicht erschrecken. Man soll damit im Controller eingaben machen können
und mit den Cursortasten etwas steuern.

Die Tastatur sendet Signale in bestimmten Abständen aber ich bin noch
nicht 100%ig dahinter gekommen wie genau das funktioniert. Aber der PC
kann mit den Signalen auch was anfangen von daher...

wenn ich im internet danach suche finde ich nicht sonderlich viel
darüber, scheint nicht üblich zu sein das man eine pc tastatur nimmt.
Aber wäre toll!!

von Rahul (Gast)


Lesenswert?

Das Ding liefert einen Takt...

von Diavolo (Gast)


Lesenswert?

@all

unser alter Küchenherd gab auch immer solch seltsame Impulse ab...

von Bianka L. (Gast)


Lesenswert?

@Rahul stimm das heist der Controller muss den Takt der Tastatur prüfen.
Wie ich das sehe sendet die Tastatur vor jeder Tastenübertragung (oder
wie man das nennen darf) zu erst ein bestimmtes Taktsignal, wartet auf
eine Antwort vom Gegenüber und sendet dann das Signal rüber.

Irgendwo habe ich gelesen das es bei der Sprache BASCOM eine Funktion
gibt, welche dazu dient Signale einer Tastatur zu verarbeiten. Kann mir
da jemand mehr zu sagen??? Allerdings wüsste ich trotzdem gerne wie man
das manuell hinbekommt... :-)

von Michael M. (mike_s)


Lesenswert?

Hi,

dazu gibts ein Übertragungsprotokoll und eine sehr gute Erklärung im
Netz.

http://www.beyondlogic.org/keyboard/keybrd.htm

Grüße,

Michael

von Bjoern B. (tishima)


Lesenswert?

Wenn Du Dich für nen AVR und Bascom entscheidest liefert Bascom schon
funktionen für das Handling mit einer PS/2 Tastatur mit und Du brauchst
keinerlei verrenkung machen das Signal auszuwerten.

mfg
Bjoern

von Danny (Gast)


Lesenswert?

Wenn Du BASCOM nutzen willst: es gibt einen Befehl in BASCOM der
die Signale einer AT-Tastatur einlesen kann: GETATKBD (ist in der Hilfe
gut beschrieben).

von Bianka L. (Gast)


Lesenswert?

danke was ist eine AT-Tastatur genau? Eine normale Computertastatur?

von Danny (Gast)


Lesenswert?

Ja.

von Bianka L. (Gast)


Lesenswert?

wie ist das denn eigentlich mit Apple MAC, verwenden die ebenfalls das
PS/2 Protokoll?

von Bianka L. (Gast)


Lesenswert?

Wenn ich GETATKBD verwende ist das dann ein delay das der µc so lange
nichts tut bis eine gewünschte taste gedrückt wurde?

von Bjoern B. (tishima)


Lesenswert?

Wenn ich mich richtig erinner gibt Bascom eine 0 zurück wenn keine Taste
  gedrückt wurde, also kannst Du GETATKBD nur gelegentlich abfragen und
noch andre Dinge ausführen. Aber lang lang ists her und ich kann weder
meine Testhardware noch das Programm finden.
Ansonsten ist in Samples ein Beispiel (getatkbd_int.bas) da wird alles
per interrupt gemacht.

mfg,
Bjoern

von Gregor F. (Gast)


Lesenswert?

Wo finde ich die Datei getatkbd_int.bas?

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.