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
> .. oder auch schon beim aufgesteckten Programmer + Tater gedrückt?
darauf bezog ich mich. Aufstecken des Programmers darf nichts machen.
achso, dankeschön und wenn ich nun programmiere? Einfach ein Pin--R--Taster--Ground um das schlimmste zu verhindern?
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.)
Zeig dochmal den Schaltplan, also was Du alles an den AVR angeschlossen hast. Man kann oftmals Pins mehrfach nutzen. Peter
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?
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"
@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
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.