LED und Taster an 1 Port

Thorsten_Sch

Mitglied
31. Okt. 2010
152
0
16
47
HH
Sprachen
  1. BascomAVR
Hallo Ihr Bastler und Forum Besucher

als aller 1 sage ich schon mal das ich bei der suchmaschiene gesucht habe wie ein buchleser, alle
seiten durchgelesen......

zu meine frage:
An 1 Port 1 taster und 1 Led abfragt um port zu sparen?
hab es schon propiert aber komme auf keinen richtigen weg..........?????!!!!!!

Hier mal der code den ich bis jetzt habe und propiert habe.....
Code:
'Taster + Led an einen port
$regfile "2313def.dat"                                      'CPU ATtiny2313
$crystal = 8000000                                          '8Mhz Intern
$hwstack = 32
$swstack = 10
$framesize = 40
$lib "mcsbyte.lbx"

Ddrb = &B00000000                                           ' Ports als Ausgang gesetzt (0) - (1) als Eingang
Ddrd = &B00000000                                           ' Ports als Ausgang gesetzt (0) - (1) als Eingang

Config Pinb.0 = Input                                       'Eingang auf Portb.0 - Taster eingang
Portb.0 = 0
Waitms 1
Config Pinb.1 = Input                                       'Eingang auf Portb.0 - Taster eingang
Portb.1 = 0
Waitms 1
Config Pinb.2 = Input                                       'Eingang auf Portb.0 - Taster eingang
Portb.2 = 0
Waitms 1

Declare Sub P1
Declare Sub P2
Declare Sub P3

Dim I As Byte

Do

Debounce Pinb.0 , 1 , P1 , Sub
Debounce Pinb.1 , 1 , P2 , Sub
Debounce Pinb.2 , 1 , P3 , Sub

Loop


Sub P1
Toggle Portb.3
Toggle Portb.0
Portb.0 = 1
Waitms 1
End Sub

Sub P2
Toggle Portb.4
Toggle Portb.1
Waitms 1
End Sub

Sub P3
Toggle Portb.5
Toggle Portb.2
Waitms 1
End Sub

End
Return

und so denke ich mir das mit der schaltung sehe bild:
NEU~1.JPG

so was muss man in den code ändern um da weiter zu kommen daher bitte ich um RAT vielen dank
Gruß Thorsten
 
Hallo,
als erstes mal noch eine Frage zum Sinn des Ganzen, wozu soll das gut sein?
Wenn du den Ausgang auf high schaltest leuchtet die LED, soweit ok, wenn du die Taste drückst, passiert nichts, was soll auch passieren, Pegel liegt ja schon auf high.
Wenn du den Ausgang auf low schaltest, leuchtet die LED nicht und wenn du jetzt die Taste drückst, freut sich der Ausganstransistor im MC, Ausgang auf low und volle 5V ohne Vorwiderstand drauf, keine Ahnung wie lange das gut geht.
Wenn du schon solche Sachen machst, solltest du dem Ausgang wenigstens einen Schutzwiderstand (Strombegrenzug) spendieren (max. Ausgannsstrom siehe Datenblatt).
Was evtl. funktionieren könnte, wäre das Umprogrammieren des entspr. Data Direction Registers (DDRx) zum Umschalten Eingang / Ausgang, normalerweise führt der Ausgang dann aber high-Pegel (interner Pull-up Widerstand), macht also Sinn, den Taster Richtung Masse zu legen und die LED Richtung 5V. Aber egal, was du machst, es bleibt ein Kompromiss, bei gedrückter Taste, kann der MC die LED nicht ausschalten. Meine Erfahrungen beziehen sich haupsächlich auf Atmega aber ATtiny sollten sich ähnlich verhalten, im Zweifel immer Datenblatt lesen !
Viel Spaß beim Experimentieren.
 
In meinen Augen ist das nicht umsetzbar.

Man könnte es höchstens so machen (falls einem das ausreicht):
  • LED an den Port Pin (via einem Transistor der den Strom verstärkt), Taster an den Port Pin und gegen Masse.
  • Pin im DDR Register als Eingang deklarieren.
  • LED an: internen Vorwiderstand anschalten (PORT Register)
  • LED aus: internen Vorwiederstand ausschalten.

So würde der Taster das Signal runter ziehen.

Nachteile:
  • Bei gedrücktem Taster leuchtet die LED nicht mehr
  • Der Taster funktioniert nur wenn die LED an ist

Besser wäre ein Tiny mit n paar mehr Pins und denn Eingang und Ausgang getrennt halten. :)
 
Ich weiß jetzt nicht, wie gut Du Dich mit den Registern, die das Bein betreffen auskennst. Prinzipiell kann man eine LED und einen Taster über ein gemeinsames Bein ansteuern/auswerten.
ABER mit Debounce wird das nichts.
Taster und LED werden parallel vom Bein nach Gnd gelegt, die LED mit entsprechendem Vowiderstand, der Taster ebenso (Kurzschluß, wenn der Controllerpin Vcc (ohne Pullup) liefert). Möglicherweise läßt sich da sogar ein gemeinsamer R wählen.
Die LED sollte leuchten, wenn das Bein auf Vcc liegt (Ausgang und Hi), und der Taster offen ist.
Um den Taster abzufragen muß das Bein zum Eingang werden (Datenrichtungsregister), und ggf noch der Pullup aufgeschaltet werden (PortLatchRegister), falls die LED aus war. Jetzt kann der Zustand des Tasters über das PIN-Register gelesen werden. Danach kann der Ursprüngliche Zustand der Register wiederhergestellt werden.

Allerdings ist die LED aus, während man den Taster drückt.

P.S.: sinniger finde ich, wenn man denn unbedingt Beine sparen muß, 2Taster an ein Bein zu hängen, und die abwechselnd abzufragen.
 
Hi
Nun, ich bin eigentlich ein Verfechter von EVA-einlesen, verarbeiten und ausgeben. Aber in diesem Fall funktioniert folgendes:
Loop
Data Direction Register auf Eingang
Portpin einlesen und in Variable speichern ("E" - einlesen)
DDRx auf Ausgang
Portpin mit Wert aus Variable belegen ("A" - ausgeben)
Variable Eingänge bearbeiten ("V" - verarbeiten)
Variable Ausgänge zuweisen
End-Loop
Die LED wird, da sie während der gesamten Zykluszeit angesteuert ist, auch sichtbar leuchten. Die kurze Unterbrechung durch die Tasterabfrage dürfte nicht stören. Ich halte mich eigentlich immer an eine Zwischenspeicherung der Ein- und Ausgabewerte. So wird nur in bestimmten Programmabschnitten auf die Peripherie zugegriffen.
Obwohl ich in Assembler programmiere und mit BASCOM nix am Hut hab, sollte das auch in deiner Welt funktionieren.
Gruß oldmax
 
Hallo Forum und Bastler

Also wenn es also so schwer ist mit der schaltung und den code.....
wie währ es denn wenn man das so macht:
Taster1 an = PORTB.0 gegen GND
Taster2 an = PORTB.1 gegen GND
Taster3 an = PORTB.2 Gegen GND

und die LED`S so:
LED1 an = PORTB.0 gegen PORTD.6 schalten
LED2 an = PORTB.1 gegen PORTD.6 schalten
LED3 an = PORTB.2 gegen PORTD.6 schalten

also wie hier auf diesen bild sehe unten Bild Nr.1

NR.1
NEU.JPG
und habe ich das mit den code gedacht sehe Nr.2 aber es haut irgendwie nicht hin......

Nr.2
Code:
$regfile "2313def.dat"
$crystal = 4000000
$hwstack = 32
$swstack = 10
$framesize = 40
$lib "mcsbyte.lbx"

Config Portd.6 = Output                                     'Led
Config Pinb.0 = Input
Portb.0 = 0
Config Pinb.1 = Input
Portb.1 = 0

Declare Sub P1
Declare Sub P2

Dim I As Byte

Do

If Pinb.0 = 1 Then Gosub P1
If Pinb.1 = 1 Then Gosub P2

Loop


Sub P1
Portb.0 = 1 : Portb.0 = 1
Waitms 20
Portd.6 = 0 : Portb.0 = 0
Waitms 20
End Sub

Sub P2
Portd.6 = 1 : Portb.1 = 1
Waitms 20
Portd.6 = 0 : Portb.1 = 0
Waitms 20
End Sub

End
Return

Ach ja auf den code fehlt noch ein taster und Led! grins
Bitte um rat oder Tipps
Gruss Thorsten
 
Hi
Also, bitte entschuldige, das ich dir keinen Code geschickt habe. Du darfst das nicht persönlich nehmen, aber meine Codes sind geheim. Daher liefere ich immer kleine Denksportaufgaben...
Mal im Ernst. Was erwartest du? Ich hab dir die Lösung übermittelt. Was nun plötzlich ein neuer Ausgang bewirken soll, steht in den Sternen. Natürlich kannst du auch eine Matrix aufbauen, was hindert dich daran? Aber wenn es funktionieren soll, dann versuch erst mal mit kleinen Schritten Part A und Part B zu programmieren. Erst wenn es dann klappt, kannst du beides einbauen. Nun nochmal eine kleine Hilfe:
Unterprogramm:
Portx auf Eingang.
Einlesen und in Variable ablegen
Portx auf Ausgang

Was ist daran so schwierig? Natürlich mußt du den Ausgang danach auch zuweisen. Von mir aus in einer eigenen Subroutine
Aufbereiteten Ausgang aus Variable holen
Ausgeben

Oder hast du Probleme mit Variablen?
Dim Eingang as Byte
Dim Ausgang as Byte
Zumindest ist das so in VB. Nehme an, das Bascom es ähnlich hält.
Gruß oldmax
 
@Thorsten: Du klatscht uns hier jetzt irgendeine Schaltung, nebst nicht (wie gewollt) laufendem Programm hin, und erwartest... was?
Wie SOLL denn Deine Schaltung gehen, was ist DEINE IDEE dahinter? Dann können wir uns Gedanken machen, was an Schaltung und/oder Code nicht zur Idee paßt.

Bisher macht Dein Programm folgendes:
  • Initialisierung
    • D6 wird auf Gnd gelegt
    • B0 und B1 bleiben Tristate
    • (B2 ebenso)
    • Endlosschleife, in der permanent die beiden Subs aufgerufen werden, solange (wenn) der betreffende Taster unbetätigt ist
  • Sub1
    • der Pullup von B0 wird eingeschaltet (2x - C&P-Fehler?)
    • 20ms Warten
    • D6 auf Gnd (war er auch schon vorher), Pullup von B0 wieder aus (Pin ist also wieder Tristate)
    • weitere 20ms Pause
      Von wo nach wo soll hier jetzt Strom fließen? Der Strom der beiden (interner/externer Pullup) in Sperrrichtung durch die LED?
  • Sub2
    • hier schaltest Du D6 auf Vcc und B1 auf Pullup, für 20ms
    • anschließend D6 wieder auf Gnd, B1 auf Tristate und 20ms Pause
      Wenn Du hier den Taster im richtigen Moment betätigst (die Sub wird ja immer aufgerufen, wenn in der Hauptschleife im Moment der Abfrage von B1 der Taster offen ist), zwingt der Taster den Pin gegen die beiden Pullups auf Gnd. Da D6 20ms lang auf Vcc ist, kann ein Strom von D6 über D2 und den Taster nach Gnd fließen. Ob D6 und die LED dem dabei fließenden Strom gewachsen sind, bzw wie lange, und wer ggf als erstes in den Ruhestand eintritt, weiß ich nicht... 20ms sind ein ganz schön langer "Peak"
Ist das in etwa die gewünschte Funktion?

Anmerkung:
D6 meint das entsprechende Beinchen des Tinies, D2 die LED
 
Danke für gute tipps ich werde auf mein buch warten danke und verleicht schreib ich noch hierrein ob ich das hinbekommen habe....

gruss thorsten
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)