Forum: Mikrocontroller und Digitale Elektronik Kann ich das noch retten? Pins gegen GND als Schalter lesen


von Erich (Gast)


Lesenswert?

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

von Stone (Gast)


Lesenswert?

Interne Pullup Widerstände aktivieren oder hab ich dein Problem falsch 
Verstanden ?

MfG Matthias

von Martin (Gast)


Lesenswert?

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.

von Marvin M. (Gast)


Lesenswert?

Und was spricht dagegen, die Serienwiderstände durch Drahtbrücken oder 
0-Ohm Widerstände zu ersetzen?

von Erich (Gast)


Lesenswert?

Also muß ich es so reinprogrammieren? Habe ich das richtig verstanden?
1
  // Damit sind es Eingänge ...
2
  DDRE = ( 0<<DDE2 | 0<<DDE3 | 0<<DDE4 | 0<<DDE5 | 0<<DDE6 | 0<<DDE7);
3
  // Damit sind diese interner Pull-Up-Widerstände aktiv...
4
  PORTE  = (1<<PE2) | (1<<PE3) | (1<<PE4) | (1<<PE5) | (1<<PE6) | (1<<PE7);  
5
  ...
6
  // Und in der Hauptschleife steht dann z. B. ...
7
  if (PINE2 == 1) {
8
    // Schalte Signal auf rot
9
  }
10
  if (PINE2 == 0) {
11
    // Schalte Signal auf grün
12
  }

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

von Erich (Gast)


Lesenswert?

So geht leider auch nichts.

von Karl H. (kbuchegg)


Lesenswert?

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?

von Niels H. (monarch35)


Lesenswert?

Erich wrote:
>
1
>   if (PINE2 == 1) {
2
>

Meiner Meinung nach kann das so nicht funzen. Du prüfst entweder einen 
einzelnen PIN so:
1
  if (PINE & (1<<PE2))  // PE2 gesetzt?

oder ein reihe von PINS aus einen gewissen Zustand
1
  if (PINE & 3 == 1 )  // von PE0-1 nur PE1 gesetzt?

von Erich (Gast)


Lesenswert?

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

von Erich (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Erich (Gast)


Lesenswert?

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

von Niels H. (monarch35)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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_Portregister
http://www.mikrocontroller.net/articles/AVR-Tutorial:_IO-Grundlagen

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.