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
...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... :-/
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
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
ein weiblicher Käsebrotschmierer... http://www.mikrocontroller.net/forum/read-1-285883.html#new ICP lässt grüssen...
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
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
@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.
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
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"?
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...
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!
das oben war nur ein beispiel :-) ich wollte nur allgemein wissen ob sowas geht. Teilweise sind die Codes sehr einfach gehalten
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.
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!!
@all unser alter Küchenherd gab auch immer solch seltsame Impulse ab...
@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... :-)
Hi, dazu gibts ein Übertragungsprotokoll und eine sehr gute Erklärung im Netz. http://www.beyondlogic.org/keyboard/keybrd.htm Grüße, Michael
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
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).
wie ist das denn eigentlich mit Apple MAC, verwenden die ebenfalls das PS/2 Protokoll?
Wenn ich GETATKBD verwende ist das dann ein delay das der µc so lange nichts tut bis eine gewünschte taste gedrückt wurde?
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
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.