hallo,
habe zwei Probleme, die ähnlich sind.
ich bastele gerade mit zwei Controllern, einem Atmega328 und einem
Arduino (auch Mega328).
Bei beiden gehen mir langsam die Pins aus.
- Erstmal der Arduinio -----------------
Es sind bereits alle Ports belegt und ich kann auch keine mehr frei
machen. (Diodenarrays hab ich schon jetzt ist aber kein Platz mehr.)
Die einzige Möglichkeit bei meinem Projekt ist ein ADC-Pin, den ich
digital verwende doppelt - als Aus- und Eingang zu nutzen.
Stichwort:
Beitrag "Taster + LED am selben Draht (4*)"
Diese Variante ist für meine Anforderungen zu übertrieben und ich möchte
nichts mehr an dem ADC+MUX verändern, weil ich die auch noch für anderes
verwende.
Wärend die LED leuchtet brauche ich den Taster nicht abfragen.
Es kann aber natürlich schon vorkommen, dass ich den Taster drücke
wärend sie Leuchtet.
High-Ground --> Kurzschluss
Nun brauche ich eigendlich nur ein Widerstand zum Schutz gegen zu hohen
Strom am Pin.
Kann ich das so machen:
PortPin-------------------330R---Taster----GND
|
|
LED
|
220R
|
|
+5Vcc
?
U/I=R
Pin verträgt bis zu 20mA
5V/0,02A= 250R
Wenn Pin Eingang--> interne Pullups an
Kann der Taster diesen mit dem 330R Widerstand noch runterziehen?
Die Led würde hier auch immer geschaltet wenn Taster gedrückt, kein
Problem.
- Zweiter Controller: --------
hier habe ich noch MISO MOSI und SCK frei!
an diese sollen auch noch Taster dran kommen.
Solange ich sie nicht beim Programmieren drücke --> kein Problem.
Wann gibt es ein Problem? Nur beim Übertragen der Daten von Programmer
auf Chip oder auch schon beim aufgesteckten Programmer + Tater gedrückt?
Möchte alles sicher machen, dass nichts kaputt geht.
Kann ich auch einfach ein Widerstand zum Schutz dazwischen klemmen?
http://www.mikrocontroller.net/articles/AVR_In_Sys...
gibt leider kaum Auskunft.
Könnt Ihr mir Tipps geben?
Danke
Nochmal kurz
Kann ich das so machen:
NormalerPortPin-------------------330R---Taster----GND
|
|
LED
|
220R
|
|
+5Vcc
?????
&und&
Mosi MOSI MISO SCK an Taster mit Schutzwiderstand? geht sowas?
danke
Du kannst die LED statt mit PORTn auch mit DDRn schalten!
Dann brauchst Du keinen Widerstand vorm Taster.
An die SPI Pins kannst Du Taster dranhängen.
Mit internen Pullups ohne Probleme..
> Du kannst die LED statt mit PORTn auch mit DDRn schalten!> Dann brauchst Du keinen Widerstand vorm Taster.
super Idee, das mach ich!
> An die SPI Pins kannst Du Taster dranhängen.> Mit internen Pullups ohne Probleme..
nee die Pullups werden beim Programmier-Reset ausgeschaltet und
unabhängig davon gibts doch ein Kurzschluss zwischen
Programmierdaten--Taster--Ground
Strumpf schrieb:> achso, dankeschön>> und wenn ich nun programmiere?> Einfach ein Pin--R--Taster--Ground> um das schlimmste zu verhindern?
Ja, und mit nem ~10k wirst Du sogar beim Programmieren die Taster
drücken können, ohne dass was schiefgeht.
Mein STK500 und ein Mega16 oder 32? haben beide einen Programierversuch
überlebt, mit den Miso- und Mosi-Pins direkt auf Masse gelegt.
(Ob das immer so sein muss, ka.)
Danke für Antworten!
Schaltplan habe ich keinen und möchte ich auch dieses eine Mal auch
keinen machen, unter anderem weil ich vorher nicht wusste was ich genau
machen möchte und nicht weiß was noch alles kommt. Habe angefangen und
immer weiter gemacht. Macht mir zur Abwechslung mehr Spaß.
Wie gesagt, Ich habe schon etliche Diodenarrays und ziemlich alle Pins
mehrfachbelegt, soweit das die gewünschte Funktion zulässt (Unterschied
zw. Tasten gleichzeitig u einzeln gedrückt ...)
Nochmal der Link von oben für alle Hilfesuchenden, da er broken war zur
profesionellen Ein+Ausgang Doppelbelegung
Beitrag "Taster + LED am selben Draht (4*)"
Dankeschön!
nochmal
>Du kannst die LED statt mit PORTn auch mit DDRn schalten!>Dann brauchst Du keinen Widerstand vorm Taster.
Völlige verwirrung hier, also das hier geht:
Pin----|-----Taster----GND
|
LED
|
220R
|
+Vcc
while(1){
DDRn = (0<<LEDBUTTONPIN); /* Eingang*/
PORTn = (1<<LEDBUTTONPIN); /* Pullup an, LED aus, Button auslesbar*/
_delay_ms(500);
PORTn = (0<<LEDBUTTONPIN); /* Pullup aus, LED leuchtet schwach, Button
nicht auslesbar */
_delay_ms(500);
}
Wie meinst du mit DDRn schalten? vielleicht so?
while(1){
DDRn = (0<<LEDBUTTONPIN); /* Eingang*/
PORTn = (1<<LEDBUTTONPIN); /* Pullup an, LED aus, Button auslesbar */
_delay_ms(500);
PORTn = (0<<LEDBUTTONPIN); /* Pullup aus, LED leuchtet schwach, Button
nicht auslesbar */
DDRn = (1<<LEDBUTTONPIN); /* Ausgang, Pin low, leuchtet hell */
_delay_ms(500);
}
egal wann Button gedrückt, da kann es doch keine Kurzschlüsse geben?
@Steffen
die Schieberegister habe ich gerade nicht zur hand und es ging mir jetzt
um das Wechselnde Nutzen von Input und Output an einem Pin.
Danke für den Hinweis, so ein Schieberegister ist ja klasse, neheme ich
das nächste mal.
@all geht beim Beispiel oben etwas kaputt?
Strumpf schrieb:> nochmal>>Du kannst die LED statt mit PORTn auch mit DDRn schalten!>>Dann brauchst Du keinen Widerstand vorm Taster.>> Völlige verwirrung hier, also das hier geht:>> Pin----|-----Taster----GND> |> LED> |> 220R> |> +Vcc>> while(1){> DDRn = (0<<LEDBUTTONPIN); /* Eingang*/> PORTn = (1<<LEDBUTTONPIN); /* Pullup an, LED aus, Button auslesbar*/> _delay_ms(500);> PORTn = (0<<LEDBUTTONPIN); /* Pullup aus, LED leuchtet schwach, Button> nicht auslesbar */> _delay_ms(500);> }>> Wie meinst du mit DDRn schalten?
Du wirst den internen Pullup gar nicht brauchen,
um den Taster auszulesen, weil die LED und R schon die
Spannung am Pin hochziehen.
PORTn brauchst Du gar nicht anrühren, dh. auf 0 lassen.
DDRn &= ~( 1 << LED_PIN ); // ..auf Eingang
..
ssMyButtonPressed = PINn & ( 1<< LED_PIN )
..
if( SollLedLeuchten())
DDRn |= ( 1 << LED_PIN );
GOTO 10
Das hier passiert nur, wenn Du den PORT und DDR auf 1 setzt:
> Es kann aber natürlich schon vorkommen, dass ich den Taster drücke> wärend sie Leuchtet.> High-Ground --> Kurzschluss> .... LED leuchtet schwach,
bist Du Dir sicher, dass sie erkennbar leuchtet?
Oder hast Du sie doch gegen Masse geschaltet, und
sie leuchtet schwach, wenn der interne Pullup an ist?
@
Autor: Strumpf (Gast)
Datum: 05.12.2011 22:13
Ja ja Ja,
Du kanst sämtliche Programmieranschlüsse als Ports verwenden!
.. zumindest als Outputs.
Sei dir klar darüber, dass während des Programiiervorganges ein
Höllenfeuer von Impulsen auf den Leitungen liegt.
Ich würde also nicht z.B. den schrittmotor eines grossen Roboters
mit da drauf legen, aber jedoch ohne Probleme die Datenleitungen des
Display.
Solange das Display nicht Intialisiert ist macht es sowieso nichts.
Das kannst du also machen.
Vielleicht noch die 470 Ohm Angstwiderstände in Reihe zu den
Displayleitungen
Dann kann garnix passieren.
Klaus
p.s.
angenommen man würde eine Schiesseinrichtung (Fernbedienung für ein
Maschienengewehr) programieren, dann wäre der Trigger auf MISO / MOSI
oder SCK bestiimt falsch.
Das könnte die Fertigstellung des Projektes behindern
Wilm schrieb:> Schaltplan habe ich keinen und möchte ich auch dieses eine Mal auch> keinen machen
Dann schreib in Worten auf, was an den 23 IO-Pins so alles hängt.
Es hat wenig Zweck, sich in einen Pin zu verbeißen, wenn andere Pins
vielleicht bedeutend leichter zu multiplexen sind.
Peter
Ich sehe jetzt nicht, wie viele Taster und LEDs Du verwendest. Aber wenn
es um mehrere Taster geht, dann schalte eine Reihe Widerstände
hintereinander, zwischen VCC un GND. Die Taster kommen dann zwischen die
Knotenpunkte zweier Widerstände und GND. Der ADC Eingang wird am
Knotenpunkt zwischen den ersten beiden Widerständen hinter Vcc
angeschlossen.
Durch Variation der Widerstände kann man auch mehrfach-Betätigungen
auflösen (mehere Taster gleichzeitig gedrückt), man kann die Taster
überwachen, da auch bei nicht gedrückten Tastern eine bestimmte Spannung
anliegen muss und man benötigt nur einen ADC Eingang, also einen Pin.
Mit zwei Transistoren und etwas Hühnerfutter kann man auch 2 LEDs oder
eine Bi-Color LED mit antiparallel geschalteten LEDs mit nur einem Pin
ansteuern. z.B. Output-Hi -> Rot, Output-Low -> Grün, Input -> Aus.
Nutzt man dazu einen PWM Ausgang, kann man auch alle Mischfarben
darstellen, also von Grün über Gelb, Orange nach Rot.
da geht also noch was :)
Gruß, Ulrich