PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : miniatur kurzhubSCHALTER



ExXeQtor
07.10.2010, 12:11
hallo zusammen, ich suche einen Schalter (nicht Taster!) in der größe der standard taster, also ca 5*5mm.

So ein bisschen wie der hier (der aber taster ist)
http://www.conrad.de/ce/ProductDetail.html?hk=WW2&insert=U1&WT.mc_id=epro&productcode=701763&zanpid=1425077820362812416

Ich muss damit aber ein/ausschalten können, tasten reicht nicht.
Ich finde nichts, hat da jemand einen Tip?

askazo
07.10.2010, 13:09
Hm, ich wüsste nicht, dass es sowas gibt.
Wertest Du den Taster über einen µC aus? Dann könntest Du das softwareseitig lösen. Ansonsten müsste sich sowas auch über eine diskret aufgebaute Digitalschaltung machen lassen.

Gruß,
askazo

Jaecko
07.10.2010, 13:33
JK-Flipflop war das glaub ich als ext. Bauteil.
Aber in der grösse nen Schalter wird schon vom mechanischen her schwierig. Feder, Rastpunkt etc. muss ja alles mit rein.

ExXeQtor
07.10.2010, 16:32
hmm das problem ist, dass es eine extrem kleine schaltung ist und softwareseitig mit taster vielleicht(!?) schwierig wird, weil alles auf einem attiny13 ist und der schon fast voll... außerdem hab ich wenig ahnung (und sammle sie noch) was interrupts/sleep modes angeht und wüsste nicht, wie ich das dann noch codeeffizient umsetzen müsste... oder könnte mir da jemand ein kleines codebeispiel für den attiny13E geben, bei dem man per taster in den sleep(standby?) mode bzw wieder heraus kommt?

ExXeQtor
07.10.2010, 16:36
falls nicht wäre dann die nächste bauteilsuchfrage:
woher einen SMD(oder seehr kleinen) JK FlipFlop bekommen? vorallem weil die ja meist als 3er oder 6er etc in einem gehäuse sitzen.. ich habe halt ein platzproblem

edit: mir fällt auf, dass der ja auch nur dann sinn macht, wenn es im code auf dem tiny13 gelöst ist. insofern hat sich die frage beinahe erledigt. der schalter sollte mechanisch von der batterie trennen.

Jakob L.
07.10.2010, 23:13
Zur möglichen Softwarelösung:
Man könnte den µC beim Abschalten in den Power-Down-Modus schicken und (völlig ohne Interrupt-Pin) einfach z.B. alle 200 ms per Watchdog aufwachen, kurz den IO-Pin mit dem Taster prüfen und wieder einschlafen, wenn der Knopf nicht gedrückt wurde. Der Stromverbrauch im Power-Down-Modus ist so gering, dass das auch bei Batteriebetrieb in den meisten Fällen kein wirkliches Problem ist. Falls der INT0-Pin nicht anderweitig benötigt wird, dann kann man auch direkt über einen Interrupt auf diesem Pin aufwachen und sich so noch die paar µA für den Watchdog-Oszillator sparen.

oberallgeier
08.10.2010, 07:27
... ich habe halt ein platzproblem ... mechanisch von der batterie trennen ...Das Platzproblem höre ich schon von Anfang an raus. MUSS es eine mechanische Trennung sein, oder willst Du "nur" Batteriestrom sparen? Was hängt denn alles dran und was für eine Batterie hast Du dafür? Manchmal ist ein bisschen mehr Umfeldbeschreibung hilfreich. Also bitte mehr Hintergrund.


... nur ... wenn es im code auf dem tiny13 gelöst ist ...Die Schaltung (klick), (https://www.roboternetz.de/phpBB2/viewtopic.php?t=52148) mit der ich theoretisch einige hundert bis etliche tausend Betriebsstunden aus einem 9V-Block errechne, lässt sich mit SMD-Bauteilen ziemlich einfach aufbauen. Bei 10 nA (nano!) Stromverbrauch im Standby kann man damit viele Aufgaben lösen. Natürlich hatte ich die Lösung mit dem Sleep/PowerDown auch schon gemacht. Sobald da weitere Verbraucher angeschlossen sind, ist der Verbrauch dann meist trotzdem so hoch, dass dieser Weg oft nicht gangbar ist. Wäre die im Link genannte Schaltung - mit Taster - für Dich ein gangbarer Weg ? Die funktioniert mit dem tiny13 sicher ebensogut wie mit meinem tiny85.

ExXeQtor
08.10.2010, 13:28
hallo danke für die antwort!
die gesamte elektronik kommt in ein 3er microzellengehäuse. darin sind 2 AAA microzellen (und damit ~2,8Volt) und im dritten block die elektronik. die passt bisher auch rein, ich habe noch platz für einen taster o.ä.
Die schaltung oben ist dafür wohl leider schon zu groß(auch wenn ich smd bauteile nehme, weil ich mich auf einer entsprechen kleinen platine befinde).
Die mechanische lösung habe ich deshalb gesucht, weil es (sofern es einen so kleinen schalter gäbe) die platzsparendste lösung ist, da es nur darum geht, das ganze ding über nacht ausschalten zu können (wobei ausschalten entweder power down oder eben wirklich physisch von der batterie trennen heißen kann).

Also es geht dabei in erster linie um batteriestromsparen, da die schaltung aber auch so im schnitt nur alle 15 minuten ca 60mAs verbraucht (und dazwischen im sleep mode ist) wäre es wohl nicht allzuschlimm, wenn beim "ausschalten" auch lediglich ein sleep mode vorherrscht. Der einzige sonstige verbraucher hängt einem transistor, der vom tiny angesteuert wird. was ich da verliere ist nicht der rede wert.

Mit dem sleep mode habe ich aber das problem der fehlenden erfahrung mit (externen) interrupts bzw dem sleep mode (das was ich bislang verwende ist größtenteils ein gebastel aus tips) und würde dann fragen müssen:

wie machen(codebeispiel)?
Wie mit einem taster den attiny13E in den sleep- und aus dem sleep mode holen?

oberallgeier
08.10.2010, 15:47
... würde dann fragen müssen:
wie machen(codebeispiel)?
Wie mit einem taster den attiny13E in den sleep- und aus dem sleep mode holen?Na das ist der Stand, mit dem ich auch drangegangen war. Aber schon ok, erst das main - wirklich unwesentliche Dinge wie Timerinitialisierung und -nutzung habe ich weggelassen. Es ist nur I/O-Definition, Tastenabfrage und die Sache um PCI und sleep drin. Überall wo Punkte sind (..........) wurde etwas weggebraten *ggg*. Ach so, ja - nutzen wird Dir das nix, weil ich keinen tiny13E kenne und deshalb garnichts zu diesem exotischen Bauteil sagen kann.

Bitte beachten: im folgenden stehen Mustertexte - nur als Beispiel für Buchstaben in einer Reihe und ohne Ziel für irgendeine Funktion. Der Text ist ohne Gewähr für irgendeine Funktion. Die Unschädlichkeit dieses Textes ist weder nachgewiesen noch wird sie zugesichert. Jede Verwendung des Textes durch Dritte ist erst nach eingehender Prüfung sinnvoll, weil er voller Fehler steckt. Jedwede Ähnlichkeit des Textes mit einer Programmiersprache ist rein zufällig und nicht gewollt. © bei mir.


/* >>
Sicherung 13apr09 1730 ..\C2\Cpcrt13\Cpcr13_a12.c
================================================== =================================
Target MCU : ATtiny 13
Target Hardware : Pcr 13
Target cpu-frequ. : 9,6 MHz, interner Oszillator
================================================== =================================
....
================================================== =================================
*** Versionsgeschichte:
====================
a12 13apr09 1720 Zeithorizont Izthrznt wieder eingeführt - als Korrekturmöglichkeit
......
================================================== =================================
Alle möglichen Portanschlüsse am ATtiny 13 :
============== ===
dW, /RESET, (PB5) 1 20 Vcc
PCINT3, CLKI, ADC3,(PB3) 2 19 (PB2), SCK, T0, ADC1, PCINT2
PCINT4, ADC2,(PB4)___3 18___(PB1), MISO, INT0, AIN1, PCINT1, OC0B
GND 4 11 (PB0), MOSI, AIN0, PCINT0, OC0A
--------------------==========-----------------------
Vorgesehene/belegte Anschlüsse am ATtiny 13 :
================== v
/RESET, (PB5) 1 20 Vcc
rLED,(PB3) 2 19 (PB2)
Taster, PCINT4, (PB4)___3 18___(PB1)
GND 4 11 (PB0), gLED */
/* ================================================== ============================ */
#include <stdlib.h>
#include <avr/io.h>
#include <avr/interrupt.h>

#include "CpcrT13_com_a12.h" // commonvariable
#include "CpcrT13_tmr_a12.c" // Routinen, Initialisierung etc
......
// ================================================== ===============================
// ================================================== ===============================


// ================================================== ===============================
// === HAUPTProgramm ================================================== ============
// Initialisierungen

int main(void)
{
...........
// Pins/Ports als Ein- (0) oder Ausgänge (1) konfigurieren, Pull Ups (1) aktivieren
// A = Ausgang, E = Eingang ohne , EU = Eingang MIT PullUp
DDRB = 0b11101111; // Aus- + Eingänge definieren
PORTB = 0b00011001; // und Port/Pull Ups (1) aktivieren
.....................
// ================================================== ==============================
// ===>>> Beispiel Tastenabfrage #####################>>>>>>>>
/* while (1)
{ if ( ! (PINB & (1 << PINB5)) ) // Taste abfragen auf SCK
{ PORTC |= (1<<PC4); } // LED auf PC4/MISO einschalten
else
{ PORTC &= ~(1<<PC4); } // LED auf PC4/MISO ausschalten } */
// ########### Ende der Tastenabfrage auf MISO/PB4 #####################
........................................
sei(); // Abschluss der Initialisierung, erlaube Interrupts

while (1)
{
schlaf_PI4 (); // Schlafen mit PCI auf PinB3 => Controller "wacht" auf,
// wenn PB4 auf GND gezogen wird
.....................................
}

return 0;
}
// ===== Ende Testabschnitt
// ================================================== ==============================

/* >>
Sicherung 13apr09 1730 ..\C2\Cpcrt13\CpcrT13_tmr_a12.c ###>>> noch nicht
================================================== =================================
Target MCU : tiny 13
Target Hardware : pacer 13
Target cpu-frequ. : In der Quelle wählbar
================================================== =================================
Enthaltene Routinen: Nur Timer
......................
ISR(PCINT0_vect) // Vektor ??
void schlaf_PI4 (void) // Controller in Ruhemodus, aufwachen durch PCINT4
.......................
================================================== =================================
........................
================================================== ============================== */


// ================================================== ==============================
// === Nicht unterbrechbare ISR für PCINT ========================================
ISR(PCINT0_vect) // Vektor 3 (1 ... 3 !!!)
{
//
// Hier könnten anhand einer Bittabelle (uint8_t wird sicher reichen)
// Verzweigungen zu verschiedenen Programmen erledigt werden, damit WÄHREND
// des Programmlaufs derselbe Taster für unterschiedliche Zwecke verwendet
// werden kann/darf.
//
return; // Einfach "ret" -> bedeutet "Aufwachen" vom sleep
}
// ================================================== ==============================


// ================================================== ==============================
// === Ruhemodus fuer tiny 13 ================================================== =
// Aufgabenstellung: Controller setzen auf PinChangeInterrupt
// PCI aktivieren für PB4/PCINT4
// Sleepmodi setzen
// Sleepmodus aktivieren
void schlaf_PI4 (void) // Controller in Ruhemodus, aufwachen durch PCINT4
{
GIMSK |= (1<<PCIE); // PinChangeInterrupt enable
PCMSK |= (1<<PCINT4); // PinChangeInterrupt auf Pin PB4/PCINT4
sei();
MCUCR |= (1<<SM1)|(1<<SE);
asm volatile ("sleep");
GIMSK &= ~(1<<PCIE); // PinChangeInterrupt disable
return;
}
// ================================================== ==============================


// ================================================== ==============================
// ===== ENDE Subroutinen ================================================== ==
// ================================================== ==============================

ExXeQtor
08.10.2010, 17:00
sorry, ich hatte aus dem "efficient" ein e gemacht, gemeint war der 13V... tschuldigung... :D
Dazu fällt mir aber noch ein - weiß hier jemand was der unterschied zwischen dem attiny 13v 10su und 10ssu ist irgendwie bin ich zu Blind dazu etwas zu finden.

den code gucke ich mir heut abend mal genauer an, wenn ich ein bisschen mehr zeit habe. Herzlichen dank!
Soweit ich das bisher aber richtig erkannt habe, bist du durchgängig im sleep und weckst den µC nur kurzzeitig mit einem tastendruck auf. wie würdest du ihn denn mit derselben taste wieder einschlafen lassen? einfach eine bool variable mitzählen (gerade/ungerade) und eine schleife?

oberallgeier
08.10.2010, 17:12
... was der unterschied zwischen dem attiny 13v 10su und 10ssu ist irgendwie bin ich zu Blind ...Irgendwie ist es mir fast peinlich, den gleichen Spruch immer wieder zu bringen: Umgang mit Controllern ohne das Datenblatt zu lesen gehört zu den letzten großen Abenteuern unserer Tage.


... bist du durchgängig im sleep und weckst den µC nur kurzzeitig mit einem tastendruck auf ...Neeein. Der Controller läuft - das ganze Programm, notfalls bis zum Ende der Akkukapazität - wenn er nicht irgendwann im "eigentlichen" Programm wieder beim Sleep vorbeigeschickt wird. Dann schläft er bis zum nächsten Tastendruck. Inzwischen kann die Taste natürlich auch andere Reaktionen einleiten.


... wie würdest du ihn denn mit derselben taste wieder einschlafen lassen ...Also ein bisschen eigenes Überlegen wäre doch ganz nett. Steht aber, genaugenommen im oberen Absatz. Code (Text *ggg*) dazu gibts nicht. Das Ganze hatte immer zwei Taster. Ursprünglich ging der erste an /RESET. Mittlerweile sind beide für die Steuerung (daher auch ein tiny85).

............http://oberallgeier.ob.funpic.de/PCR80_2145.jpg (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=501921#501921)

Richard
08.10.2010, 17:56
Warum nicht einfach z.B. ein D-FF (4013) zwischen Taster und den "Rest", bei jedem Tasten Druck Ändert sich der Q Ausgang vom D-FF und mit einem kleinen C kann auch eine extra Endprell Schalung entfallen.

Das 4013 nur weil ich das früher oft eingesetzt habe und das deshalb halt immer noch im Hirn gespeichert ist.

Gruß Richard

ExXeQtor
10.10.2010, 13:57
@Richard:
danke, das werde ich aber aufgrund von platzproblemen eben nicht tun können, auch den 4013er gibts soweit ich weiß auch als smd nur in der 4er(oder mehr?) flipflop version..

@oberallgeier
Ja, du hast schon recht, den hinweis mit dem datenblatt bekomme ich auch immer wieder. ich bitte nur darum zu bedenken, dass man als anfänger oft den wald vor lauter bäumen nicht sieht, vorallem wen es mehr als 170 bäume(seiten) sind und der wald voller bit und registerbeschreibungen die einem größtenteils nichts sagen.

ich habe gerade (mal wieder) einige zeit mit dem lesen des avr-gcc tutorials auf mikrocontroller.net verbracht und auch mit deinem code immernoch probleme...
ich weiß genau, was ich will - einfach durch einen externen pinchange interrupt eine funktion ausführen, die mir lediglich eine boolvariable setzt - den rest kann ich dann in der bisherigen funktion einfach über eine schleife klären. das problem ist, dass ich zB in deinem code nicht erkenne, was der interrupt nun genau auslöst - in meiner anfängerdenke suche ich momentan nach irgendeiner stelle, die ausgeführt wird, sobald der intterupt auftaucht - aber die erkenne ich nicht.

um den code auf meine anwendung zu übertragen:
um bei einem logikwechsel an PB3 einen pinchangeinterrupt auszulösen muss ich die register auf

GIMSK |= (1<<PCIE); (wie du den pinchangeinterrupt enablen)
PCMSK |= (1<<PCINT3);

setzen, dann im code die interrupts global enablen
sei();

und wie heißt dann die funktion, die durch den interrupt aufgerufen wird?
ich habe natürlich (um dem vorzubeugen) im datenblatt nach den funktionen gesucht und dinge wie
ISR(INT0_vect)

gefunden - was müsste bei mir in klammern stehen? PCINT3?
also ISR(PCINT3_vect)?

ich hoffe die fragen waren präzise genug, die orientierung bei den interrupts fällt mir außerordentlich schwer... danke für jede hilfe!

oberallgeier
10.10.2010, 14:50
... hinweis mit dem datenblatt ... und der wald voller bit und registerbeschreibungen ...Ok, stimmt ja. Ging mir genauso.

Dieses Datenblatt, (http://www.atmel.com/dyn/resources/prod_documents/doc2535.pdf) Seite 160 oben. Kleiner Tip: vielleicht hat Dein PDF-Reader eine Suchfunktion, dann suche mal nach "10ssu" - es gibt nur ZWEI Treffer. Beide betreffen die Bauform "S8S1". Also nochmal Suchfunktion damit füttern - dann stolperst Du zur Seite 163. Du siehst - ich behaupte zwar, dass ich lesen kann (sogar in der einen und anderen Sprache auch intensiv und diagonal-intensiv) - aber manchmal mache ich es mir total bequem. Lass den Wald vom Rechner durchsuchen. Und entschuldige bitte, dass ich so kurz angebunden war.


... und wie heißt dann die funktion, die durch den interrupt aufgerufen wird ... im datenblatt ... dinge wie ISR(INT0_vect) ...GENAU so ist es. Das steht auch bei meinem Codebeispiel oben. Der Tiny13 hat nur eine kurze Interrupt-Vektortabelle, siehe DS 44 (D okumentation, S eite). Beachte dazu auch DS 45, Punkt 9.2, DS Punkt 9.3.2 - Bit 5 – PCIE und DS 47 - Punkt 9.3.4 - Bits 5:0.

Kurz: Mit Deinem "PCMSK |= (1<<PCINT3);" hast Du die PinChange-MaSKe auf den Port B3 gelegt, vgl. dazu DS 2 in Figure 1-1 das Pinout von 8-PDIP/SOIC. Jetzt wird dieser PinChange diesen einzigen PinChange-Interrupthandler anspringen, den der tiny13 hat. Und der hat die Adresse "ISR(INT0_vect)".


... also ISR(PCINT3_vect) ...Auf DS 44, Punkt 9.1 Interrupt Vectors hast Du ja eben bemerkt, dass es NUR diesen PCINT0 gibt auf Programm Adresse 0x0002. Und in Deinem A VR-GC C-Verzeichnis (bei mir heißt es "WinAVR-20090313") findest Du in der subdirectory "...\WinAVR-20090313\avr\include\avr" die tiny13-Headerdatei iotn13.h. Suche dort drin nach "PCINT0" - etwa Zeile 289. Dann wird Dir einiges klar.


... die orientierung bei den interrupts fällt mir außerordentlich schwer ...Ach weißt Du, das hatte bei mir ewig gedauert, bis ich das halbwegs blickte. Und dicke wirds erst, wenn ein Interrupt (in Assembler) kommt, den man garnicht erwartet und daher auch nicht bedient. Aber den man erlaubt hatte, weil man noch nicht ALLES kennt *ggg*.

Ich gebs ja zu - es sind einige Bäume - zusätzlich zu den von Dir gezählten mehr als 170.

OK? Verstanden?

ExXeQtor
10.10.2010, 15:07
Mehr als einverstanden!
Großes Lob an deine Geduld und Hilfsbereitschaft!
Gesucht hatte ich auch schon mit der Suchfunktion, allerdings ohne die "10" vorm ssu. und dann macht das ganze keinen spaß mehr, wie wörter wie assume, assure, issuing etc pp nahelegen :D

Ich dachte erst jeder über PCINTx "interrupt-aktivierte" Pin hätte dann seinen ebenso heißenden vector - aber wenn ich das jetzt hoffentlich endlich richtig verstanden habe, sprechen sie in diesem fall alle den selben vector an - dh ich kann zwar mit mehreren pins einen pinchange interrupt auslösen - aber dann immer denselben(PCINT0)! korrekt?

mit dem von oben klappt mein testprogramm soweit es scheint ausgezeichnet. endlich ein erfolgserlebnis ;)

oberallgeier
10.10.2010, 15:37
... Gesucht hatte ich ... ohne die "10" vorm ssu ... wörter wie assume, assure ...Und manchmal findet man es nicht MIT der 10, weil ein Zwischenraum da ist . . . . . Und z.B. der AcrobatReader berücksichtigt kein angehängtes Leerzeichen (mit dem jeder popelige Editor ein assume unbeachtet lässt) und versteht auch keine wildcards wie * oder ?.


... ich kann zwar mit mehreren pins einen pinchange interrupt auslösen - aber dann immer denselben(PCINT0)! ...Genau so ist es. Diese Philosophie gilt auch für andere Controller - und andere Anschlussdefinitionen. Der mega168/~328 z.B. hat 28 Pinne, davon 23 PCINTi, aber nur drei PCINT-Vektoren. Die 23 PCINT-Pinne sind in drei Gruppen zusammengefasst. Oder - der ADC wird gemultiplext . . . uswusf.


... klappt mein testprogramm soweit es scheint ausgezeichnet ...Schön. Aber die nächsten Bäume ähhhh Probleme stehen sicher schon bereit.

ExXeQtor
10.10.2010, 19:13
Schön. Aber die nächsten Bäume ähhhh Probleme stehen sicher schon bereit.
Da hast du recht, jetzt hänge ich daran, dass die bool variablen, die ich in meiner ISR verändere so tun als gäbe es sie gar nicht. dann bekam ich das stichwort "volatile" - durch die deklaration als volatile bool ändert sich aber auch nichts...
nuja. ich probiere und probiere :D
vielen dank für die hilfe soweit! Ohne ginge es wohl gar nicht.

noppsing
08.06.2011, 13:46
Hallo,
ich bin neu hier und ich möchte meinen ATtiny13A auch gerne schlafen "legen".
Mich würde der C-Code brennend interessieren.
Wo kann ich den bekommen bzw ansehen ?
Schöne Grüße
Noppsing

oberallgeier
08.06.2011, 15:52
... ich bin neu hier ...Herzlich Willkommen!


... ATtiny13A ... schlafen "legen" ... C-Code ... Wo kann ich den bekommen ...DAS ist ziemlich einfach. Du musst nur in DIESEM Thread die erste Seite durchsehen. Da habe ich etwa in der Mitte (m)einen Code zum Sleepmodus einschliesslich einer Weckmöglichkeit mittels Taster gepostet. Ausserdem ist auch eine Schaltung vorgestellt, mit der erheblich weniger Strom verbraucht wird als im Sleepmodus der Atmelcontroller.

Übrigens macht sich bei solchen Fragen die Suchfunktion des Forums bezahlt . . . . wenn man die benutzt.

Viel Erfolg.

noppsing
09.06.2011, 07:50
Hallo, vielen Dank !
Ich war mir nicht sicher ob der code der endgültige Stand ist. Tolle Schaltung !!
Schöne Grüße Noppsing