Hallo Forum!
Habe leider hier kein Vergleichbares Problem mit dem Pollin-Teil
gefunden.
Ich hab folgendes Problem:
Meine beiden (1*Bausatz, 1*Fertigteil) Net-IO´s produzieren willkürlich
Pegeländerungen bei den Eingängen.
Hab hier viel gelesen über Fuses, Kondensatoren tauschen usw., aber
nirgends, wie sich diese Dinge in der Praxis auswirken.
"Version" gibt 1.03 aus. Habe keine Änderungen (weder Soft- noch
Hardware) durchgeführt.
Ansonsten bin ich elektronisch jetzt nicht so der Guru...
Danke für eure Hilfe.
Chris
Ein unbeschalteter Eingang ist nicht definiert.
Der kann den Zustand 0 oder 1 haben.
Dies kann sich durch Störungen ändern.
Deshalb den Eingang z.B. mit einem 10kOhm Widerstand nach VCC definieren
(Pullup).
Dann hat der Eingang eine 1 und kann z.B. mit einem Schalter auf 0
gezogen werden.
Wenn man das Programm ändern kann, schaltet man die internen Pullup
Widerstände ein, dann erspart man sich die externen Widerstände.
Gruss JensM.
Danke für die ersten Antworten.
Das Problem hab ich nicht nur, wenn nichts angeschlossen ist.
Hab an den Eingängen im "Normalbetrieb" Taster, da passiert das gleiche.
Das mit den PullUp-Widerständen, müßte dass dann so aussehen:
Wenn der Taster offen ist, so ist es wie nichts angeschlossen.
Die Schaltung ist so noch nicht richtig.
Sondern so:
/
Versorgung ------10kOhm------|-----/ ------ GND
|
|
|
Eingang1
Dann hat der Eingang1 mit offenem Taster 1 und mit geschlossenem 0.
Gruss JensM
Danke Jens für deine Unterstützung.
Ob "0" oder "1" wäre egal, kann ich im Programm entsprechend abändern.
Versorgung wären dann die 5V? Oder die Betriebsspannung des Boards?
Die Versorgung ist die Versorgungsspannung des Prozessors.
Je nachdem, ob dieser mit 3,3V oder 5V versorgt wird entsprechend mit
dieser Spannung.
Beim Pollin Net IO sind es 5V.
Gruss JensM.
Hi
>Alles klar soweit.>Ich werde ASAP die Widerstände organisieren und die Sache mit den>Pullup´s testen.>Werd dann Bescheid sagen.AVRs haben auch interne Pull-Up-Widerstände. Einfach die
Portregister-Bits bei den Eingängen auf 1 setzen.
MfG Spess
Wäre natürlich auch praktisch, aber ich hab keine Ahnung wie das gehen
soll.
Von daher ist die externe Beschaltung zwar vlt nicht schön, aber für
mich machbar ;-)
Hallo,
das passt zu meinem Projekt.
Ich bin gerade beim entwerfen einer umfangreichen Schaltung für den
Pollinbausatz.
Digitale Eingänge werden mit Opokoppler entkoppelt.
Digitale Ausgänge da nehme ich die Relaiskarte von Pollin.
Für die analogen Eingänge fehlt mir noch die saubere Entkopplung zum
AVR.
Gruß Frank
spess53 schrieb:> AVRs haben auch interne Pull-Up-Widerstände. Einfach die> Portregister-Bits bei den Eingängen auf 1 setzen.
Dafuer muesste man aber an die Sources von Pollin kommen... ;)
TO: Der Wert der Pull-Ups ist uebrigens nicht ganz so kritisch, da
sollte alles zwischen 10K und 1M stabil funktionieren. Wenn Du also
etwas groesseres als 10K rumliegen hast, brauchst Du nicht extra etwas
besorgen gehen.
Die Logik laesst sich auch einfach invertieren indem du "Vorsorgung" und
"GND" im Beispiel von JensM vertauschst. (Dann hat der Eingang1 mit
offenem Taster 0 und mit geschlossenem 1). Generell ist die
Pull-Up-Variante aber zu bevorzugen, da man dann (unter normalen
Umstaenden) die internen Pull-Ups des AVR benuzten kann.
Volker
Selbst wenn man die Sources von Pollin bekommt würde man eine
Möglichkeit brauchen, den Controller zu programmieren...
Ob der geschlossene Taster 0 oder 1 liefert, ist egal, das kann ich in
meinem Programm dementsprechend verarbeiten.
Wenn ihr also Pullup empfehlt, dann mach ich das so.
Morgen allerseits!
Es scheint, als würde es nun funktionieren.
Anfangs war ich enttäuscht, weil sich nichts geändert hat, nachdem ich
die Widerstände eingelötet hab.
Dachte dann, das es natürlich auch an meiner etwas russischen
Testschaltung liegen könnte, und hab zum Probieren den Widerstand auf
einen jungfräulichen Sub-D-Stecker gelötet.
Hat dann wunderbar funktioniert.
Wenn ich das ganze nun Ordentlich löte, kann ich bei 10k bleiben und
wäre hier mehr besser? Weil hier schon von bis zu 1M die rede war.
Danke euch jedenfalls für die Hilfe, jetzt bin ich schon recht zufrieden
mit dem Teil...
Christoph G. schrieb:> Wenn ich das ganze nun Ordentlich löte, kann ich bei 10k bleiben und> wäre hier mehr besser? Weil hier schon von bis zu 1M die rede war.
10k sind vollkommen in Ordnung, bedenke aber, wenn du Spannungen messen
willst über den ADC, geht das nicht so einfach, du verfläschst das
Ergebnis mit dem Widerstand.
Hallo Forum!
Nachdem ich dachte, es würde funktionieren hab ich alles nochmal
ordentlich verkabelt und zusammengelötet.
Hab mich an den Tipp von Jens gehalten, und den 10K zwischen digitalem
Eingang und Vcc gelötet.
Nachdem ich nun den ganzen Spaß nun wieder in Betrieb genommen hab mußte
ich feststellen, dass meine Eingänge noch immer machen, was sie wollen.
Spielt es denn eine Rolle, wie weit weg von der Net-IO-Platine die
Widerstände sitzen?
Wenn´s egal ist und die 10K reichen, hm, dann hat wohl mein Programm
eine Macke. Aber ich frag ja nur alle 0,1s die Eingänge ab.
Habt ihr noch einen Tipp? Bin jetzt ein klein wenig frustriert, weil ich
sehr optimistisch war.
lg
Christoph G. schrieb:> Spielt es denn eine Rolle, wie weit weg von der Net-IO-Platine die> Widerstände sitzen?> Wenn´s egal ist und die 10K reichen,
Ist (in Grenzen) egal und 10k ist perfekt. In Grenzen heißt: die
Port-Leitungen sollten nicht so wild in der Gegend "herumirren" und sich
Störungen einfangen.
> hm, dann hat wohl mein Programm eine Macke.
Ist denkbar.
> Habt ihr noch einen Tipp? Bin jetzt ein klein wenig frustriert, weil ich> sehr optimistisch war.
Mess doch mal die Spannung am Port. Die sollte eine saubere VCC sein.
Gruß Dietrich
Christoph G. schrieb:> [...]> Wenn´s egal ist und die 10K reichen, hm, dann hat wohl mein Programm> eine Macke. Aber ich frag ja nur alle 0,1s die Eingänge ab.>> Habt ihr noch einen Tipp? Bin jetzt ein klein wenig frustriert, weil ich> sehr optimistisch war.
10K reichen: Je groesser der Wert des Widerstands, desto hoeher die
Empfindlichkeit gegen Stoerung, desto niedriger aber auch der Strom,
den Du auf GND ziehen musst.
Was meinst Du mit "Dein Programm"? Waere es nicht sinnvoll nicht an
allen Baustellen gleichzeitig zu arbeiten und zum Abfragen der Eingaenge
die Original-Pollin-Software und Firmware zu nehmen, so lange du an der
Beschaltung der Eingaenge arbeitest?
Gruss,
Volker
Ich habe mir die Muehe gemacht, mit meinem NET-IO (Ver. 1.03) zu testen:
Die Eingaenge liegen definitiv auf dem internen Pull-Up, Du brauchst
also gar keinen externen Widerstand. Wenn Du mit der Original-Software
(oder ueber RS232) auch flatternde Eingaenge siehst, liegt der Fehler
wohl auf der Platine. Wenn die Eingaenge stabil sind, liegt's wohl an
Deiner Software (auch wenn ich nicht verstehen kann, wie man bei einer
solchen Abfrage etwas falsch interpretieren kann).
Nochmal Gruss,
Volker
Morgen!
Danke für die Antworten.
Die Widerstände hab ich direkt an die Sub-D-Buchse gelötet.
Dannach sind je nach Eingang eta 7m Cat-Kabel, an denen dann die Taster
sind.
Mein Multimeter zeigt 4,94V an.
Wenn ich mir das ganze mit der Pollin-Software anschaue, sind da keine
Schwankungen erkennbar. Das einzige was mir aufgefallen ist, ist das die
Pollin Software ab und an wohl die Verbindung verliert.
Aber die Statusänderungen, die mein Prog anzeigt sind zeitlich damit
nicht in Verbindung zu bringen...
Ich kann mir auch nicht vorstellen, dass man beim auslesen recht viel
falsch machen kann.
Meine Funktion dazu:
function get_input($host, $port) {
$kommando = "getport ".$port."\r\n";
$fp = fsockopen($host, "20590");
fwrite($fp, $kommando);
$status = abs(fgets($fp)-1);
fclose($fp);
return $status;
}
Naja, dann geht die Suche wohl weiter...
Ich hoffe, das schweift jetzt nicht zu sehr vom eigentlichem Thema ab.
Hab den Code nochmal etwas geändert. Ein Kollege meine, naja, man weiß
so nie ob der Befehl erfolgreich an den NetIO geschickt wurde.
function get_input($host, $port) {
$kommando = "getport ".$port."\r\n";
$fp = fsockopen($host, "50290);
fwrite($fp, $kommando);
$i=0;
$test="";
while (!feof($fp) and $i<10) {
echo "Testschleife\n";
$i++;
$test.=@fgets($fp);
usleep(10000);
}
//$status = abs(fgets($fp)-1);
fclose($fp);
//return $status;
return $test;
}
Christoph G. schrieb:> Die Widerstände hab ich direkt an die Sub-D-Buchse gelötet.> Dannach sind je nach Eingang eta 7m Cat-Kabel, an denen dann die Taster> sind.> Mein Multimeter zeigt 4,94V an.
Das ist ja schon mal was. 7m? Waere es nicht sinnvoll die grossen
Leitungslaengen eher auf der Ethernet-Seite zu haben?
> Wenn ich mir das ganze mit der Pollin-Software anschaue, sind da keine> Schwankungen erkennbar. Das einzige was mir aufgefallen ist, ist das die> Pollin Software ab und an wohl die Verbindung verliert.
Also wird es wohl an Deinem Code liegen. Das Verlieren der Verbindung
kenne ich so auch, aber sehr sporadisch. Und mit den Eingaengen hat das
schon gar nichts zu tun. ;)
> Meine Funktion dazu:> function get_input($host, $port) {> $kommando = "getport ".$port."\r\n";> $fp = fsockopen($host, "20590");> fwrite($fp, $kommando);> $status = abs(fgets($fp)-1);> fclose($fp);> return $status;> }
Wie erklaerst Du mir:
$status = abs(fgets($fp)-1);
?
Das Checken auf Fehlermeldungen waere dann das Naechste. Die Antwort ist
komplett wenn ein \r\n empfangen wurde.
Volker
Hallo Volker!
Die abs()-Funktion nutze ich, um eine "1" zu erhalten, wenn der Taster
gedrückt wird.
Im Normalfall ist ja offen eine "1", durch abs() kann ich das
"umdrehen".
Meine beiden NetIO´s sind im Unterverteiler, die 7m Catkabel sind
sozusagen die Steuerleitungen, die die Taster im Raum mit dem NetIO
verbinden.
Ich danke euch derweil für eure gedanklichen "Inputs", ich werd mir
jetzt mal ansehen, wie ich das "\r\n" überprüfen kann.
Christoph G. schrieb:> [...]> Die abs()-Funktion nutze ich, um eine "1" zu erhalten, wenn der Taster> gedrückt wird.> Im Normalfall ist ja offen eine "1", durch abs() kann ich das> "umdrehen".> [...]
Also in meiner Welt liefert fgets einen Char zurueck. In Dezimal waeren
das 48 fuer eine 0 und 49 fuer eine 1. Wenn Du dann noch die 1
subtrahierst und den Absolutwert bildest, bist Du bei 47 bzw. 48. \r\n
sind uebrigens 13 und 10. ;)
Volker
Hallo Volker!
Lt. Beschreibung schickt der (das?) NetI0 bei getport x folgendes
zurück:
"Zustand des Eingangs bei High-Pegel = 1, bei Low-Pegel = 0 als
ASCII-Zeichen"
Also bei mir klappt das (zumindest das)
Beim Check nach Fehlermeldungen bin ich noch nicht weitergekommen.
Ich gestehe auch, im AVR NetIO Forum mal angefragt zu
haben...Wahrscheinlich ist dir Lösung relativ einfach, aber ich sehs
noch nicht.
Christoph G. schrieb:> [...]> Lt. Beschreibung schickt der (das?) NetI0 bei getport x folgendes> zurück:> "Zustand des Eingangs bei High-Pegel = 1, bei Low-Pegel = 0 als> ASCII-Zeichen"
Genau. Und 0 als ASCII-Zeichen entspricht, wie erwaehnt, 48 dezimal. 49
bei 1 respektive. Da gibt's auch keine zwei Meinungen. ;)
> Also bei mir klappt das (zumindest das)
Offensichtlich nicht. Wenn mit der Original-Software alles problemlos
laeuft, mit Deiner aber nicht, dann liegt Dein Problem exakt an dieser
Stelle.
> Beim Check nach Fehlermeldungen bin ich noch nicht weitergekommen.> Ich gestehe auch, im AVR NetIO Forum mal angefragt zu> haben...Wahrscheinlich ist dir Lösung relativ einfach, aber ich sehs> noch nicht.
Du liest in einer Schleife die Antwort Zeichen fuer Zeichen ein bis die
Bytes 13 und 10 (Dezimal) empfangen wurden. Dann verarbeitest Du diesen
String. Ist doch nicht so schwierig.. Und uebrigens auch nichts
NET-IO-spezifisches...
Volker
Hallo Volker!
Jetzt funktionierts!
Ich hab mich von dem gefunden Codeschnippsel $irgendwas=fgets(irgendwas)
komplett, vermutlich zwecks mangelndem Wissen, in die Irre führen
lassen.
So ist nämlich $irgendwas 0 oder 1.
Bin durch Zufall draufgekommen, dass $irgendwas ein 3-stelliger String
ist, und nachdem ich den Zeichen für Zeichen ausgelesen habe bin ich
genau wie du gesagt hast auf 48 (oder 49) + 13 + 10 gekommen.
Somit kann ich nun alles richtig abfragen und mich über funktionierende
Eingänge erfreuen.
Danke nochmal für deine Anregungen!