Nabend,
sagt mal, kann ich das noch irgendwie softwaremäßig retten. Ich habe
dummerweise einen kompletten Port mittels Serienwiederständen an einen
Steckeranschluß geführt.
Sieht ungefähr so aus, eben 8x:
Atmel Jumper
[ PINE2 >-----[R:10k]-----[x x]-----[GND]
Wenn ich die Pins auf Ausgang schalte liegen immerhin die 5 V an, aber
eigentlich wollte ich damit 8 Zustände (EIN/AUS) von Schaltern bzw.
Tastern einlesen.
Kann ich das noch irgendwie softwaremäßig retten, damit ich nicht alles
in die Tonne kloppen kann?
Erich
JO, du kannst die internen Pullups einschalten und dann müssten am 10k
widerstand ca. 1V abfallen. Der uC müsste das dann als Low erkennen. Am
besten den 10k kleiner machen auf 100 oder so, falls der Aufwand nicht
zu groß ist.
Wenn die Brücke (Schalter offen) offen ist, ist der Eingang auf 5 V und
das Signal wird z. B. rot,
wenn die Brücke (Schalter geschlossen) gesetzt ist, ist der Eingang auf
0 V und das Signal wird z. B. grün.
Erich
Zeig doch mal dein tatsächliches Programm her. Im speziellen:
wie ist denn PINE2 definiert?
Hast du mal ein Voltmeter genommen und am Prozessorpin nachgemessen,
auf welchen Pegel der Pin tatsächlich beim Drücken der Taste
fällt? 0V wird er nicht erreichen, aber welchen Wert erreicht
er denn?
Au, Menschenskinder, Danke. So tut sich endlich was.
Bloß, wenn ich auf auf "0" anstatt auf "1" prüfe, macht er noch nix,
also wenn ich die Brücken kurzschließe.
Erich
Und denken hilft manchmal auch bei alten Leuten. Mit If ... else geht's,
ich hab mit zweimal if auf 1 und 0 geprüft.
Nochmal vielen Dank für's retten, so brauch ich nix mehr umbauen und es
tut wie's soll.
Erich
Erich wrote:
> Und denken hilft manchmal auch bei alten Leuten. Mit If ... else geht's,> ich hab mit zweimal if auf 1 und 0 geprüft.
Und um das auch noch zu beantworten:
if( ( PINE & (1<<PE2) ) == 1 )
wird niemals wahr sein, weil bei der Und-Operation (der Maskierung)
nun mal keine 1 rauskommen wird, sondern der Wert (1<<PE2).
Wenn schon, dann so:
if( ( PINE & (1<<PE2) ) == (1<<PE2) )
oder so
if( ( PINE & (1<<PE2) ) != 0 )
oder aber mit einem else Zweig, so wie du das dann im Endeffekt
gemacht hast.
Mein Sohn hat mich drauf gebracht, damit rumzuprobieren und weil die
ganzen Märklin-Sachen inzwischen so unglaublich teuer sind, finde ich
das hier ziemlich elegant. Ich baue mir ein Standardmodul mit einem
kleinen ATmega Mikrocomputer und ein paar Widerständen und kann damit
reinprogrammieren was ich möchte. Allein der Platzvorteil zu den alten
Relaisbatterien ist unglaublich, vom Stromverbrauch ganz zu schweigen.
Aber manche Sachen verstehe gerade bei diesen Pin-Vergleichen noch nicht
so, wann was bei welchem Vergleichszeichen 0 oder 1 wird oder warum ich
mal PORT und mal PIN nehmen muß.
Aber ich danke euch sehr, daß ihr mir geholfen habt.
Erich
Erich wrote:
> Aber manche Sachen verstehe gerade bei diesen Pin-Vergleichen noch nicht> so, wann was bei welchem Vergleichszeichen 0 oder 1 wird
Das Thema nennt sich Binärarythmetik und ist eigendlich ganz einfach,
wenn man erstmal einen Ansatz gefunden hat.
> oder warum ich> mal PORT und mal PIN nehmen muß.
Das ist ja noch einfacher....
Mit PORTx steuert man die Portbits, die man über DDRx als Ausgänge
konfiguriert hat und mit PINx fragt man die Portbits ab, die man auf
Eingang gestellt hat.
Erich wrote:
> Mein Sohn hat mich drauf gebracht, damit rumzuprobieren und weil die> ganzen Märklin-Sachen inzwischen so unglaublich teuer sind, finde ich> das hier ziemlich elegant. Ich baue mir ein Standardmodul mit einem> kleinen ATmega Mikrocomputer und ein paar Widerständen und kann damit> reinprogrammieren was ich möchte. Allein der Platzvorteil zu den alten> Relaisbatterien ist unglaublich, vom Stromverbrauch ganz zu schweigen.> Aber manche Sachen verstehe gerade bei diesen Pin-Vergleichen noch nicht> so, wann was bei welchem Vergleichszeichen 0 oder 1 wird oder warum ich> mal PORT und mal PIN nehmen muß.
Bei letzterem, einfach mal hier nachlesen.
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Zugriff_auf_Ports
Das hier ist zwar für Assembler geschrieben, die zugrundeliegenden
Prinzipien sind aber völlig identisch und das eine oder andere davon
ist auch für einen C-Programmierer wichtig:
http://www.mikrocontroller.net/articles/AVR-Tutorial:_IO-Grundlagen#Zusammenfassung_der_Portregisterhttp://www.mikrocontroller.net/articles/AVR-Tutorial:_IO-Grundlagen