Forum: Mikrocontroller und Digitale Elektronik Eingangssignal eines Schieberegisters mitschneiden (Arduino/AVR)


von Nils H. (nhhpp)


Lesenswert?

Hallo zusammen,

Ich bin noch relativ grün hinter den Ohren, was Mikrocontroller betrifft 
und stehe aktuell vor einem Problem, bei dem ich einmal nachfragen 
wollte, ob es so lösbar ist.

Es geht darum, dass ich ein manuelles Bedienfeld mit verschiedenen 
Tastern, Status-LEDs und einem 7-Segment-Display habe und die Eingabe in 
das Gerät automatisieren möchte. Um die Taster zu schalten verwende ich 
ein Analog-/Digital-Schalter 4066, der über ein Arduino mit 
433MHz-Empfänger angesprochen wird. Das ganze funktioniert auch 
zuverlässig. Allerdings besteht das Problem, dass ich trotzdem noch die 
manuelle Bedienung erlauben möchte, von der der der µC aber aktuell nix 
mitbekommt. Das kann zu teils falschen Aktionen des Arduino führen, 
grade beim manuellen Wechsel eines Betriebsmodus.

Da die Anzeige (LEDs und Display) auf dem Bedienfeld anscheinend über 
eine Schieberegister angesteuert wird hatte ich jetzt die Idee dieses 
auszulesen und den µC so wissen zu lassen in welchen Status sich das zu 
steuernde Gerät befindet.
Dazu würde ich die beiden Interrupt-Pins INT0 und INT1 des Arduino mit 
Latch- und Shift-Clock des Schieberegisters verbinden; einen der übrigen 
IO-Pins mit dem Eingang.
Bei jedem Shift-Clock könnte ich dann den Wert vom Eingang per 
digitalRead einlesen und sammeln und beim Latch-Clock daraus den 
eingestellten Modus und Inhalt der Displayanzeige bestimmen.
Ist das so möglich, oder besteht da meinerseits ein grundlegend falsches 
Verständnis zur Funktionsweise eines Schieberegisters und der 
Interrupt-Pins am Arduino?

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Um welche Taktrateen geht es dort?

Ich schätze ganz grob, dass du auf diese Art (ohne Assembler) höchstens 
1Mhz verarbeiten kannst.

von Nils H. (nhhpp)


Lesenswert?

Das weiß ich leider nicht. Lediglich, dass das Signal von einem nicht 
näher beschriebenen µC mit 8 MHz Taktfrequenz an das Schieberegister 
ausgegeben wird. Besteht die Möglichkeit die Frequenz des Signals ohne 
Oszilloskop festzustellen?

Edit:Wenn das Signal eine Frequenz aufweist, die ich mit dem Arduino 
verarbeiten kann, würde meine Idee denn prinzipiell so funktionieren?

Edit2: Ich habe mich grade einmal mit der Frequenzmessung mit Arduinos 
informiert. Hier (http://arduino.datamaster2003.com/f-measurements.htm) 
wird eine Methode beschrieben um diese mit über die Interrupt-Pins eines 
Arduino zu messen. Der Autor schreibt auch, das bei 10kHz Schluss ist, 
bzw. die Genauigkeit der Messung abfällt. Ich werde das aber mal 
ausprobieren.

: Bearbeitet durch User
von Sascha W. (sascha-w)


Lesenswert?

Nils H. schrieb:
> Das weiß ich leider nicht. Lediglich, dass das Signal von einem nicht
> näher beschriebenen µC mit 8 MHz Taktfrequenz an das Schieberegister
> ausgegeben wird. Besteht die Möglichkeit die Frequenz des Signals ohne
> Oszilloskop festzustellen?
siehst du den μC? Was steht drauf?

> Edit:Wenn das Signal eine Frequenz aufweist, die ich mit dem Arduino
> verarbeiten kann, würde meine Idee denn prinzipiell so funktionieren?
sollte schon gehen

> Edit2: Ich habe mich grade einmal mit der Frequenzmessung mit Arduinos
> informiert. Hier (http://arduino.datamaster2003.com/f-measurements.htm)
> wird eine Methode beschrieben um diese mit über die Interrupt-Pins eines
> Arduino zu messen. Der Autor schreibt auch, das bei 10kHz Schluss ist,
> bzw. die Genauigkeit der Messung abfällt. Ich werde das aber mal
> ausprobieren.
du willst ja nicht die Frequenz messen - das geht nur zusammen mit einem 
Timer.
Bei Dir liegt das Problem das bei einem INT dein Programm unterbochen 
werden muss und du dann den Pegel einlesen und speichern musst - und das 
muss passieren bis der nächste INT kommt.

Sascha

von Nils H. (nhhpp)


Lesenswert?

Sascha W. schrieb:
> siehst du den μC? Was steht drauf?
Der ist leider ziemlich versteckt hinter anderen Komponenten verbaut. 
Ich kann aber mal versuchen ranzukommen.

Sascha W. schrieb:
> du willst ja nicht die Frequenz messen - das geht nur zusammen mit einem
> Timer.
> Bei Dir liegt das Problem das bei einem INT dein Programm unterbochen
> werden muss und du dann den Pegel einlesen und speichern musst - und das
> muss passieren bis der nächste INT kommt.

Das ist mir bewusst. In diesem Fall ging es mir aber tatsächlich um die 
Messung, weil ja die Frage nach der Frequenz des Signals aufkam und ich 
kein Oszilloskop parat habe.

von Stefan F. (Gast)


Lesenswert?

Im Prinzip geht das, wenn das Signal nicht zu schnell ist. Ohne 
geeignetes Messgerät kannst du die Frequenz nur erraten oder es 
ausprobieren.

von Benedikt S. (benedikt_s)


Lesenswert?

Du könntest natürlich auch ein Schieberegister an den Arduino 
anschließen, und den Latch Clock an den interrupt hängen. So könntest du 
ganz entspannt auf einmal 8 bit einlesen und das Timeing entspannt sich 
deutlich.

von Nils H. (nhhpp)


Lesenswert?

Den µC, der das Signal ausgibt, habe ich jetzt identifizieren können.
Dabei handelt es sich um einen Samsung S3F9454BZZ-DK94, mit externem 8 
MHz Quarz. Das Schieberegister ist ein 74HC164N.

Benedikt S. schrieb:
> Du könntest natürlich auch ein Schieberegister an den Arduino
> anschließen, und den Latch Clock an den interrupt hängen. So könntest du
> ganz entspannt auf einmal 8 bit einlesen und das Timeing entspannt sich
> deutlich.

Die Idee werde ich definitiv mal im Hinterkopf behalten, vielen Dank.

Stefan U. schrieb:
> Im Prinzip geht das, wenn das Signal nicht zu schnell ist. Ohne
> geeignetes Messgerät kannst du die Frequenz nur erraten oder es
> ausprobieren.

Ich werd's erstmal mit ausprobieren versuchen :)

: Bearbeitet durch User
von Wolfgang (Gast)


Lesenswert?

Nils H. schrieb:
> Das ist mir bewusst. In diesem Fall ging es mir aber tatsächlich um die
> Messung, weil ja die Frage nach der Frequenz des Signals aufkam und ich
> kein Oszilloskop parat habe.

Ein kleiner Logikanalysator für ein paar Euro würde dafür völlig 
reichen. Da es sich (hoffentlich) um digitale Signale handelt, dürfte 
der genaue Amplitudenverlauf ziemlich irrelevant sein.

von Stefan F. (Gast)


Lesenswert?

> Die Idee werde ich definitiv mal im Hinterkopf behalten

Setzt natürlich voraus, dass die datenübertragung auch wirklich höchsten 
8 Bits pro Wort hat.

Wobei mir gerade einfällt: Für solche Sachen ist doch eigentlich die 
universelle serielle Schnittstelle des AVR gedacht, oder nicht?

von Benedikt S. (benedikt_s)


Lesenswert?

@Stefan Us stimmt ! Habe ich gar nicht dran gedacht.

auf Seite 218 in dem Dabla 
http://www.atmel.com/Images/Atmel-42743-ATmega324P_Datasheet.pdf ist das 
Timing und die Eintsellungen für Spi gezeigt. Das solltest du für dein 
Problem nutzen können. Einfach die Datenleitung an MISO, Datenclock an 
SCK, SS an den Latchclock und schon fallen die Daten schön in den USART. 
Die genauen Parameter musst du natürlich ausprobieren. Kauf dir dafür am 
besten einen billigen LA.

von Nils H. (nhhpp)


Lesenswert?

Vielen Dank für eure Antworten.

Wolfgang schrieb:
> Ein kleiner Logikanalysator für ein paar Euro würde dafür völlig
> reichen. Da es sich (hoffentlich) um digitale Signale handelt, dürfte
> der genaue Amplitudenverlauf ziemlich irrelevant sein.

Logikanalysatoren kannte ich bisher gar nicht - wieder was dazugelernt 
:)

Ich hab jetzt auch Zeit gefunden mich mit dem Datenblatt des 
Schieberegisters auseinanderzusetzen und feststellen müssen, das ein 
74HC164 gar kein Speicher hat sondern die Eingangsdaten mit jedem 
Shift-Clock direkt auf die Ausgänge gibt. Das ist bei dem 74HC595, das 
ich kenne, ganz anders :( Dachte die arbeiten alle so.
Die von Stefan und Benedikt beschriebene Methode über USART wäre damit 
ja auch nicht möglich, weil auch die ein Latch-Clock benötigt, oder 
gibt's da noch eine andere Möglichkeit?

von Stefan F. (Gast)


Lesenswert?

Nein, der USART braucht keinen Latch Clock. Der kann auch selbst einen 
Interrupt auslösen, wenn er genügend Takte/Bits empfangen hat.

von Sascha W. (sascha-w)


Lesenswert?

Stefan U. schrieb:
> Nein, der USART braucht keinen Latch Clock. Der kann auch selbst einen
> Interrupt auslösen, wenn er genügend Takte/Bits empfangen hat.
Nur hat man dann keine Syncronisation und weiß nicht wo die Daten 
anfangen.
Interressant währe hier wie Schaltung nach dem SR aussieht, mit 8-Bit 
lässt sich ja auch nicht viel anzeigen.

Sascha

von Benedikt S. (benedikt_s)


Lesenswert?

Das LCD hat ja die Enable Leitung (gehe jetzt mal von HD44780 aus) die 
sollte man doch zur Synchronisation nehmen können, zumindest für die LCD 
Daten.
Könntest du mal ein Schaltplan oder ein Foto der Platine hochladen ?

EDIT: Wird bei dem 74HC164 nicht der Master Rest auf LOW gehalten 
während die Daten ins Register geschrieben werden. Und erst mit der 
Steigenden MR Flanke übernommen? Da hätten wir doch eine 
Synchronisation.

EDIT2: das muss nicht so gemacht werden, könnte aber so sein, das 
solltest du mit einem LA klären, ist der MR Pin angeschlossen ?

: Bearbeitet durch User
von Nils H. (nhhpp)


Lesenswert?

Benedikt S. schrieb:
> Könntest du mal ein Schaltplan oder ein Foto der Platine hochladen ?

Sascha W. schrieb:
> Nur hat man dann keine Syncronisation und weiß nicht wo die Daten
> anfangen.
> Interressant währe hier wie Schaltung nach dem SR aussieht, mit 8-Bit
> lässt sich ja auch nicht viel anzeigen.

Sobald ich morgen abend wieder zu Hause bin, kann ich ein Foto von der 
Platine machen und hier einstellen. Vorweg kann ich schon soviel sagen, 
dass es sich um das Bedienpanel eines Bartscher IK35 Induktionskocher 
ist. Das ist wohl ein BT-350 des chinesischen Herstellers Better China 
mit anderem Label.

Benedikt S. schrieb:
> EDIT: Wird bei dem 74HC164 nicht der Master Rest auf LOW gehalten
> während die Daten ins Register geschrieben werden. Und erst mit der
> Steigenden MR Flanke übernommen? Da hätten wir doch eine
> Synchronisation.
>
>EDIT2: das muss nicht so gemacht werden, könnte aber so sein, das
>solltest du mit einem LA klären, ist der MR Pin angeschlossen ?

Der Reset wird auf LOW aktiv und löscht dann das Register.
In meinem Fall ist der Reset auf VCC gelegt und wird somit nie aktiv.
Das hat mich zunächst etwas verwirrt, inzwischen habe ich das aber auch 
in mehreren Tutorials zu dem Schieberegister so gesehen.

von Nils H. (nhhpp)


Angehängte Dateien:

Lesenswert?

Anbei die versprochenen Bilder.

von Sebastian S. (amateur)


Lesenswert?

Was auf einem geschubsten Bus los ist, ist mittels einer Unterbrechung 
und eines Eingangs, zusammen mit einem im Hintergrund laufenden Timer, 
leicht zu erfassen.
Ob Du etwas damit anfangen kannst steht auf einem anderen Blatt.

Wie aber willst Du das fast menschliche Problem lösen, dass zwei 
gleichzeitig Quasseln? µP sagt hü, der Tastenathur sagt hott.

von Sebastian S. (amateur)


Lesenswert?

Ach so, ich vergaß.

Möglicherweise brauchst Du, um ein synchrones Signal/Ergebnis zu 
erhalten noch mehr Eingänge.

Clock         bekannt
Data          bekannt
Reset         möglich
Latch         möglich
Output enable dem nach je

Die Wahrscheinlichkeit, dass endlos geschubst wird ist relativ gering. 
Also muss irgendwie der aktuelle Zustand fixiert werden. Dafür gibt es 
aber verschiedene Möglichkeiten.

Darüber hinaus brauchst Du wohl auch einen relativ breiten Monitor. Im 
Ergebnis kann es nämlich sein, dass 41 Bits geschubst werden wobei alle, 
bis auf eines, gleich sind.

: Bearbeitet durch User
von Nils H. (nhhpp)


Lesenswert?

Ich habe mir jetzt einen Logikanalysator bestellt. Sobald der da ist 
werde ich damit mal das Signal untersuchen und die Ergebnisse hier 
veröffentlichen.

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.