Bascom Taster Impuls Simulieren geht das ?

Nicole

Mitglied
03. Feb. 2014
61
0
6
Sprachen
  1. ANSI C
Hallo zusammen,

benötige bitte eure Hilfe.

Ich möchte mit einem Attiny 13 und Bascom einen Impuls über Masse auslösen.
Das bedeutet sobald der Attiny Strom bekommt, soll der Attiny 5 Sekunden warten und dan kommt der Impuls über Masse für ca 1 Sekunde.

Möchte so einen Taster Impuls Simulieren.

Wie löse ich das Problem am besten ?

Hier mal meine Lösung.



CodeBox BascomAVR
$regfile = "attiny13.dat"
$crystal = 1200000
$hwstack = 15
$swstack = 15
$framesize = 20

Config Portb.3 = Output

Wait 5

Portb.3 = 1
Wait 1
Portb.3 = 0
Waitms 250

End



Würde das so gehen ?

Oder sollte man hier mit Tri State arbeiten ?

Vielen Dank
 
Das kommt ganz auf deine Schaltung an.
So musst du auf jeden Fall GND verbinden und der Taster darf im offenen Status nicht mehr Spannung führen als der Tiny. Du bist also relativ eingeschränkt. Die Probleme hättest du nicht wenn du den Tiny (mit dem Quelltext von dir) ein (Reed)Relais schalten lässt.

Wenn du mit den Einschränkungen leben kannst geht es auch so.
Vorsicht aber wenn du den echten Taster betätigst. Dann würdest du die 1 vom Tiny quasi kurzschließen. Besser wäre es da wenn du den Ausgang umschaltest zwischen Low und TriState.
 
Danke für deine schnelle Antwort und die Infos.

Das mit den Einschränkungen habe ich nicht bedacht :(
Kannst Du mir das mit dem TriState bitte mit einem Beispiel erklären ?

TriState bedeutet ja nur, das das Signal wo am Eingang anliegt auch genau so am Ausgang wieder rausgeht richtig ?
Also z.B. an PB1 liegt Masse an und am PB0 schalte ich diese Masse wieder raus.

Habe ich das so richtig verstanden ?

Oder muss ich PB1 als Eingang und Ausgang schalten lassen und benötige so den PB0 nicht ?

Vielen Dank mal wieder.
 
Ich würde an deiner Stelle lieber ein (Reed)Relais nehmen, dann bist du komplett frei von allem. Dann funktioniert dein Code auch exakt so wie du ihn geschrieben hast und die beiden Schaltungen sind komplett voneinander getrennt.

Und nein. TriState bedeutet dass der Pin offen geschaltet werden kann. Das erreichst du indem du beim AVR den Pin als Eingang definierst und den PullUp weg lässt. In diesem Zustand würde der AVR dem Signal an dem Pin nichts antun (Grenzwerte für Spannung müssen trotzdem eingehalten werden!). Wenn du den Pin als Ausgang definierst hat er immer einen gewissen Pegel, also entweder 0 (=GND) oder 1 (=VCC). Wenn dein Taster also auf GND schaltet musst du eigentlich nur den Pin umkonfigurieren.
Input ergibt TriState (nicht gedrückt)
Output ergibt GND (gedrückt)
Somit reicht der eine Pin aus.
WENN die Schaltung so aufgebaut ist. Der Taster könnte ja auch auf VCC schalten. Das Prinzip bleibt aber ähnlich.

Aber da kann z. B. der @dino03 wohl besser was zu sagen, für mich ist das zu viel Bascom ;)
Die Zeit ist zu lange her dass ich damit was gemacht habe.
 
Danke für die Info mit dem Reed Relais.
Möchte wenn es geht es erst mal ohne Reed Relais testen.

Der Taster schaltet GND.

Wenn ich zwei Pins am Attiny nutzen möchte müsste es ja dann so funktionieren oder ?



CodeBox BascomAVR
$regfile = "attiny13.dat"
$crystal = 1200000
$hwstack = 15
$swstack = 15
$framesize = 20

Config Portb.1 = Input
Config Portb.0 = Output

Wait 5

Portb.0 = 1
Wait 1
Portb.0 = 0
Waitms 250

End


Oder habe ich das wieder falsch verstanden :rolleyes:
 
ne, eher so:
(unten ist die externe Schaltung dessen Taster du "drücken" willst)
upload_2015-9-29_12-17-4.png

Und dann wäre es:


CodeBox BascomAVR
Config PortB.0 = Input ' nicht gedrückt
Wait 5
Config PortB.0 = Output ' gedrückt
Wait 1
Config PortB.0 = Input ' nicht gedrückt
WaitMS 250

oder so in etwa
 
Hmm danke für das Beispiel.

Ok du macht es jetzt aber nur mit einem Pin ?

Das bedeutet, PortB0 ist der Eingang und wartet bis die 5 Sekunden abgelaufen sind.
Nach den 5 Sekunden schaltet der Port0 auf Ausgang um jetzt für 1 Sekunde der Tastendruck zu Simulieren.
Anschließend geht der PortB0 wieder auf Eingang und nach 250 ms ist das Programm fertig.

Habe ich das jetzt richtig verstanden ?
Wenn ja, wie mache ich den ganzen Spaß mit 2 Pins?

Oder ist die schönere Variante die Lösung mit dem einen Pin ?

Vielen Dank mal wieder.
 
Ja, richtig verstanden.

Warum mit 2 Pins? Ist doch eigentlich unnötig.
Klar könntest du GND vom Taster an einen Anderen Port Pin legen. Es wäre aber das Selbe alsob du GND direkt verwendest. Der Pin wäre also verschwendet. Oder was meinst du?
 
Ich denke, sie will 2 Controllerbeine miteinander verbinden, wie ein Taster/Schalter eben (*spekulier*).
Das geht mit dem Controller allein nicht - stattdessen kann der Controller aber (->TommyB) ein (Reed-)Relais anziehen lassen, das sekundär dann die gewünschten beiden Kontakte besitzt, die verbunden oder getrennt werden.
Eventuell kann statt des Relais auch ein Optokoppler eingesetzt werden.
Ohne galvanische Trennung dann entweder direkt (-> #6), oder falls nötig 'n Transistor dazwischen, der ggf Pegel anpassen kann/den Controller vor zuviel Strom schützt...

Was ist denn die externe Schaltung konkret?
 
War nur so eine Denkensweise von mir.

Ich habe es jetzt so versucht wie Du es mir gesagt hast TommyB.
Funktioniert ohne Probleme vielen Dank.

Jetzt würde ich noch gerne eine kleine Funktion einbauen.

Und zwar, ist es möglich wenn man den Taster für 3 Sekunden gedrückt hält das das Modul sich Quasi ausschaltet ?
Es soll so sein, drückt man für 3 Sekunden den Taster schaltet sich das Modul Quasi ab.

Das Modul soll so lange ausgschalten bleiben bis man wieder für 3 Sekunden den Taster gedrückt hält.
Ist das möglich ?

Wenn ja, wie heißt diese Funktion ?

Vielen Dank für eure Hilfe.
 
Es soll so sein, drückt man für 3 Sekunden den Taster schaltet sich das Modul Quasi ab.

Das Modul soll so lange ausgschalten bleiben bis man wieder für 3 Sekunden den Taster gedrückt hält.
Ist das möglich ?

Wenn ja, wie heißt diese Funktion ?

Natürlich ist dies möglich, aber hierfür wird es keine Funktion geben, das müsstest du dir selber programmieren. Zum Beispiel in Verbindung mit einem Timerinterrupt.
 
Danke für deine Antwort.

Ist es nötig für die neue Funktion einen zweiten Port zu wählen ?
Oder kann ich weiterhin mit Portb.0 arbeiten ?

Wenn ich den gleichen Portb.0 nutzen kann, wie sieht es dan mit der Deklarierung vom Taster aus ?
Muss ich den Taster Deklarieren ?

Bitte um kleine Hilfestellung.

Vielen Dank
 
Zuletzt bearbeitet:
Nicole, ich möchte dir jetzt nicht zunahe treten, aber es wäre für uns alle hilfreich wenn du mal genau erklären würdest was du überhaupt möchtest, statt uns als "aus-der-Nase-zieher" einzustellen ;)
Ich denke ich spreche hier für alle, wir sind gerne bereit dir zu hefen, aber bitte versorg uns mit ausreichenden Informationen, nicht nur mit Fragmenten.

Welches Modul?
Wie sieht die Schaltung aus?
Wie viel Strom frisst die? (wenn unter 20mA könnte der Tiny selbst die selbst versorgen)
Wer oder was soll ausgeschaltet werden? Nur der Tiny selbst?
...
Fragen über Fragen.

Für dich ist das klar. Du brauchst n Stock.
Wir können nur auf Verdacht antworten "Geh in den Wald und such dir einen"
Dass du aber für dein Projekt einen 30cm langen Bambusstock brauchst können wir daraus nicht orakeln ;)

Wenn du erkennen willst wie lange ein Taster gedrückt wird kommst du um irgend etwas zeitgebendes (wie einem Timer wie @Dirk schon erwähnte) nicht drum herum. Das wird komplexer.
 
Hallo Thomas,

du tretest mir doch nicht zunahe ;)
Du hast absolut recht.

Es geht um einen Garagen öffner ( Fernbedienung )
Das ist nur eine Spielerei von mir die ich gerne testen möchte.

Die Fernbedinung zieht sehr sehr wenig Strom.
Das Modul ist die Fernbedienung !!!

Es soll der Tiny ausgeschalten werden.
Da ja der Tiny sobald er Strom bekommt nach 5 Sekunden den Taster Befehl losschickt.
Das möchte ich verhindern indem ich sage wenn ich den Taster für 3 Sekunden gedrückt halte ist der Tinny ausgeschalten ( wie wenn er Quasi überhaupt nicht da wäre )

Drücke ich den Taster jetzt wieder für 3 Sekunden, schaltet sich der Tiny wieder ein und sobald er den Strom bekommt drückt der Tiny immer automatisch nach 5 Sekunden auf den Taster.

Ich hoffe Ihr versteht jetzt was ich machen möchte ?

Jetzt zu meinen Fragen.

Kann ich den PortB.0 auch für diese Funktion nutzen ?
Oder muss ich jetzt PortB.1 dazunehmen um einen anderen Taster mit anzuschliesen ?

Das ganze sollte doch über eine If Taster = Gedrueckt Then abfrage möglich sein.



CodeBox BascomAVR


'TASTER1 an PB0'
Taster1 Alias Pind.0
Config Taster1 = Input
Portd.0 = 1                    'PullUp-Widerstand einschalten'

Do
If Taster1 = 0 Then
Wait 3
If Taster1 =1 then END

Ab es so möglich ist weiß ich nicht darum ja auch meine bitte an Euch um eine kleine Hilfestellung bzw Erklärung.

Der bereits verbaute Taster an der Fernbedinung muss natürlich weiterhin nutzbar sein.
Wenn ich den Taster auf der Fernbedinung für 1 Sekunde drücke passiert noch nichts erst nach 3 Sekunden drücken, schaltet sich der Tiny aus oder an.

Man benötigt Quasi eine Funktion die den letzten Zustand nach dem Drücken des Tasters speichert.
Erst nach erneutem drücken der 3 Sekunden auf dem Taster ändert sich der Wert wieder.

Der Wert soll nicht geändert werden, wenn man den Tiny vom Strom trennt.

Vielen Dank mal wieder.
 
Zuletzt bearbeitet:
Die Fernbedinung zieht sehr sehr wenig Strom
Der Tiny13 selbst nimmt ca 6mA (wenn er an 5V hängt, und mit 8MHz internem Takt läuft).
Senkt man Takt und/oder Spannung, kommt man auf ca 0,3mA runter.
Wenn das nicht reicht, kann man den Controller auch schlafen schicken. Dann kann man den auf weniger als ein µA kriegen.
Aus dem Tiefschlaf kann der Controller mittels Pegelwechsel an jedem Bein (sind alles PCINTs) geweckt werden.
 
Danke für deine Antwort.

Das hilft mir nicht richtig weiter.

Ich möchte gerne wissen, ob man es so Programmieren kann wie ich es gerne haben würde
Siehe zwei Beiträge weiter oben.

Ein Beispiel wäre sehr sehr nett.

Vielen Dank
 
Ich wollte damit zeigen, daß der Tiny13 auch (wie Deine Fernbedienung) sehr wenig (ca 6mA) Strom verbraucht. Wenn Du ihn statt abzuschalten einschläferst und weckst, verbraucht er quasi keinen Strom (<0,1µA).

Zu Deinem Programm aus #14, da is'n Denkfehler drin. Du machst D0 zum Eingang mit aktiviertem internen Pullup (der liefert also selbst 'ne eins).
Dann prüfst Du (wahrscheinlich immer wieder in einer Schleife) ob das Bein extern auf null gezwungen wird -> Polling.
Ist das mal der Fall (im Augenblick der Abfrage), läßt Du den Controller 3s aussetzen (quasi auf der Stelle hüpfen, däumchendrehen), danach fragst Du nochmal, ob das Bein genau in diesem Augenblick wieder eins (der Taster losgelassen) ist. Dann terminierst Du das Programm mit 'ner leeren Endlosschleife (quasi dasselbe wie wait unendlich).
Es spielt keine Rolle, wielange der Taster gedrückt wird - wenn er nach exakt 3s offen ist, gehts in die "end", wenn nicht, geht der code in Zeile10 weiter (also wenn Du länger als 3s drückst).

Irgendwie ist mir trotzdem nicht klargeworden, was Du da wirklich zusammenstecken willst.
Du hast 'ne Fernbedienung mit 'nem Taster, die irgendwas ansteuert (Garagentor...)
Parallel zum Taster der Bedienung kann Dein Tiny13 die Fernbedienung (und damit auch das Tor) ansteuern (Thomas's Schaltung/Programmvorschlag).
Bisher Macht der Controller das einfach einmal(?) beim starten (?)

Soweit richtig verstanden? (ansonsten erklär mal bitte genauer, was wo angeschlossen ist, und was was machen soll...)

Wann soll der Controller denn den Gnd-Impuls an die Fernbedienung raushauen? Also was soll dieses Ereignis auslösen?
 
Ok danke für die Info.

Trotzdem bin ich jetzt immer noch nicht wirklich weiter gekommen o_O

Ich glaube Ihr versteht nicht was ich benötige bzw erreichen möchte.

Nochmals:

Der Attiny soll nach 5 Sekunden einen Impuls auslösen.
Das macht er auch sehr gut.

Zusätzlich möchte ich nachdem er den Impuls ausgelöst hat dem Tiny sagen 3 Sekunden auf den Taster drücken heißt für den Tiny abschalten bzw schlafen legen.
Und erst wenn ich den Taster wieder für 3 Sekunden betätige macht der Tiny seine Arbeit weiter.

Es ist Quasi ein ( Ein - Aus ) Schalter der sich den letzten Wert Speichert.

Weil jetzt macht der Tiny jedes mal seine Arbeit wenn er Strom bekommt.
Diese Funktion möchte ich über den Taster abschalten können.

Der Tiny soll nur arbeiten wenn ich Ihm das sage ?

Versteht Ihr was ich meine ?
 
Also erstmal:
Der Tiny arbeitet immer wenn er Strom bekommt.
Zweitens:
Um zu erkennen ob die Taste 3 sec gedrückt wird muß er auch eingeschaltet sein.

Dein Code aus #14 kann nicht funtionieren.
Zuerst fragst Du Taster1 auf 0 ab (Zeile7) und dann auf 1 (Zeile9) Richtiger wäre doch beide male auf 0 abzufragen.
Trotzdem ist es aber unsauber programmiert (wie LotadaC in #18 auch schreibt).

Besser wäre es mit einem Timer zu arbeiten. Siehe hierzu in der Bascom Hilfe nach Config Timer.


Zum Programmablauf. Mein Vorschlag wäre:

letzten Zustand in Eeprom abspeichern und dann im Programm mit der Ausführung verknüpfen.

Einfach eine Variable z.B. R als ERAM Byte deklarieren. (Dim R as Eram Byte)

Wenn R=0 ist, keinen Impuls (1 sec) ausgeben. Dennoch mußt Du prüfen ob der 3 sec Impuls zur Umschaltung erfolgt.

Wenn R=1 ist Impuls (1 sec) ausgeben. Auch hier auf 3 sec Impuls prüfen.

Ist der 3 sec (Umschalt-) Impuls vorhanden einfach die Variable R toggeln.

Alles verstanden?
 

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