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
Interne Pullup Widerstände aktivieren oder hab ich dein Problem falsch Verstanden ? MfG Matthias
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.
Und was spricht dagegen, die Serienwiderstände durch Drahtbrücken oder 0-Ohm Widerstände zu ersetzen?
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
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?
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? |
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_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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.