mikrocontroller.net

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


Autor: Erich (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stone (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Interne Pullup Widerstände aktivieren oder hab ich dein Problem falsch 
Verstanden ?

MfG Matthias

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Marvin M. (Gast)
Datum:

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

Autor: Erich (Gast)
Datum:

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

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

Autor: Erich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So geht leider auch nichts.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Niels Hüsken (monarch35)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erich wrote:
>
>   if (PINE2 == 1) {
> 

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

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

Autor: Erich (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Erich (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Erich (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Niels Hüsken (monarch35)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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-Tu...

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-Tutori...
http://www.mikrocontroller.net/articles/AVR-Tutori...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.