Forum: Mikrocontroller und Digitale Elektronik Atmega zu wenig Pins / LED u Taster an Pin / MISO MOSI SCK anderweitig benutzen


von Strumpf (Gast)


Lesenswert?

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

von Strumpf (Gast)


Lesenswert?

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

von Schiko (Gast)


Lesenswert?

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..

von Strumpf (Gast)


Lesenswert?

> 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

von Schiko (Gast)


Lesenswert?

> .. oder auch schon beim aufgesteckten Programmer + Tater gedrückt?

darauf bezog ich mich. Aufstecken des Programmers darf nichts machen.

von Strumpf (Gast)


Lesenswert?

achso, dankeschön

und wenn ich nun programmiere?
Einfach ein Pin--R--Taster--Ground
um das schlimmste zu verhindern?

von Schiko (Gast)


Lesenswert?

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.)

von Peter D. (peda)


Lesenswert?

Zeig dochmal den Schaltplan, also was Du alles an den AVR angeschlossen 
hast.
Man kann oftmals Pins mehrfach nutzen.


Peter

von Wilm (Gast)


Lesenswert?

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!

von Strumpf (Gast)


Lesenswert?

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?

von Steffen H. (avrsteffen)


Lesenswert?

Warum benutzt du denn keine Schieberegister ala 74HC595 für Outputs und 
74HC165 für Inputs? lässt sich super durch SPI einlesen.

Hab das ganze auch mal auf eine Platine gebracht.
Siehe:
Beitrag "Re: Schieberegister 74HC595 und 74HC165"

von Strumpf (Gast)


Lesenswert?

@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?

von Michael S. (schiko)


Lesenswert?

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?

von Klaus D. (kolisson)


Lesenswert?

@
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

von Peter D. (peda)


Lesenswert?

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

von Ulrich P. (uprinz)


Lesenswert?

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

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.