mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Auswertung eines Signals


Autor: Bianka L. (Gast)
Datum:

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

Autor: Marcus (Gast)
Datum:

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

Autor: Christoph Kessler (Gast)
Datum:

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

Autor: TOM (Gast)
Datum:

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

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ein weiblicher Käsebrotschmierer...

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

ICP lässt grüssen...

Autor: Sebastian Heyn (Gast)
Datum:

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

Autor: Geri (Gast)
Datum:

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

Autor: Unbekannter (Gast)
Datum:

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

Autor: Geri (Gast)
Datum:

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

Autor: Bianka L. (Gast)
Datum:

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

Autor: Bianka L. (Gast)
Datum:

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

Autor: Thomas B. (yahp) Benutzerseite
Datum:

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

Autor: Bianka L. (Gast)
Datum:

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

Autor: Thomas B. (yahp) Benutzerseite
Datum:

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

Autor: Bianka L. (Gast)
Datum:

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

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Ding liefert einen Takt...

Autor: Diavolo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@all

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

Autor: Bianka L. (Gast)
Datum:

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

Autor: Michael Michael (mike_s)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

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

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

Grüße,

Michael

Autor: Bjoern Buettner (tishima)
Datum:

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

Autor: Danny (Gast)
Datum:

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

Autor: Bianka L. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke was ist eine AT-Tastatur genau? Eine normale Computertastatur?

Autor: Danny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja.

Autor: Bianka L. (Gast)
Datum:

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

Autor: Bianka L. (Gast)
Datum:

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

Autor: Bjoern Buettner (tishima)
Datum:

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

Autor: Gregor F. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo finde ich die Datei getatkbd_int.bas?

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.