Forum: Mikrocontroller und Digitale Elektronik Taster Abfragen (Selbstabschaltung)


von Mr.T (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
Ich taste mit der Schaltung meinen µC "ein" (über GND), der µC macht die 
Selbsthaltung und schaltet sich selbst wieder "aus". Jetzt möchte ich 
gerne den Taster mit dem µC abfragen wenn die Schaltung eingeschaltet 
ist. Nur wie mache ich das am elegantesten? µC ist ein attiny24, 
konstruktionsbedingt kann ich nur diesen Taster nutzen. Über eine 
Anregung wäre ich sehr dankbar :)

lg Malte

von Krapao (Gast)


Lesenswert?

> Ich taste mit der Schaltung meinen µC "ein" (über GND), der µC macht die
> Selbsthaltung und schaltet sich selbst wieder "aus".

Also ein Interrupt-Sleep Verhalten?

Es spricht technisch nix dagegen, den Pin von Interrupt-Eingang während 
der Einschaltphase wie einen normalen Input-Pin zu pollen. Die 
Interruptfunktion  ist dann abzuschalten und erst wieder zu aktivieren 
bevor es ans Schlafen geht.

von Krapao (Gast)


Lesenswert?

Deine Schaltung habe ich nicht kontrolliert. Dennoch: Aufpassen den max. 
DC Ratings am µC, wenn du den Taster anhängst.

von Johannes A. (kleinerkeiler96)


Lesenswert?

hallo.

das passt gut...ich habe bei der tasterabfragung ein problem...


#include <avr/io.h>
#include <util/delay.h>
#define F_CPU 8000000
int main (void)
{
  DDRC = 0x00;
  DDRD = 0xff;
  PORTC = 0xff;
  while(1)
  {

  if (PINC & (1<<PC0))
  {
    PORTD = 0b00000001;
    _delay_ms(100);
    PORTD &= ~ 0b00000001;
    _delay_ms(100);
  }

  else if (PINC & (1<<PC1))
  {
    PORTD = 0b00000010;
    _delay_ms(100);
    PORTD &= ~ 0b00000010;
    _delay_ms(100);
  }
  else if (PINC & (1<<PC0) | (1<<PC1))
  {
    PORTD = 0b00000011;
    _delay_ms(100);
    PORTD = ~ 0b00000011;
    _delay_ms(100);
  }
  else
  {
    PORTD = 0x00;
    _delay_ms(50);
    PORTD &= ~ 0x00;
    _delay_ms(50);
  }
  }
  return 0;
}



wenn dieser zustand ist:
else if (PINC & (1<<PC0) | (1<<PC1))
  {
    PORTD = 0b00000011;
    _delay_ms(100);
    PORTD = ~ 0b00000011;
    _delay_ms(100);
  }

habe ich ein ausgang auf PD0. wieso nicht bei beiden, wie ich es 
verlangte.? was mach ich falsch.?


danke.

von Benjamin U. (utzus)


Lesenswert?

Johannes Adler schrieb:
> if (PINC & (1<<PC0))
> {
>   PORTD = 0b00000001;
>   _delay_ms(100);
>   PORTD &= ~ 0b00000001;
>   _delay_ms(100);
> }
> else if (PINC & (1<<PC1))
>   {
>     PORTD = 0b00000010;
>     _delay_ms(100);
>     PORTD &= ~ 0b00000010;
>     _delay_ms(100);
>   }
>   else if (PINC & (1<<PC0) | (1<<PC1))
>   {
>     PORTD = 0b00000011;
>     _delay_ms(100);
>     PORTD = ~ 0b00000011;
>     _delay_ms(100);
>   }

Dein Controller arbeitet die Schleife ab und stößt auf die obere else if 
anweisung. Wenn PINC & (1<<PC0) == true ist, wird die Anweisung darunter 
abgearbeitet. Den else if Zweig darunter mit (PINC & (1<<PC1)) oder PINC 
& (1<<PC0) | (1<<PC1) (Setz mal sicherheitshalber ein paar mehr 
Klammern) müsste der Controller dann ignorieren, weil er schon einen 
passenden fall in deinem IF-Konstrukt gefunden hat. (Priorisierung von 
IF-Cases)
Also, entweder tauschen oder:
if ...
end if
if ...
end if
(also ohne else!)

von Hubert G. (hubertg)


Lesenswert?

Vielleicht so:
else if (PINC & (1<<PC0) || (1<<PC1))

von Johannes A. (kleinerkeiler96)


Lesenswert?

danke euch beiden...ich versuch es mal;)

von Johannes A. (kleinerkeiler96)


Lesenswert?

Benjamin Utz schrieb:
> if ...
> end if
> if ...
> end if

Error  5  'end' undeclared (first use in this function) 
D:\Elektronik\avr\Projekte\Tests\Test_1\main\main.c  20  2  main



brauch ich dafür eine header datei.?

von Mr.T (Gast)


Angehängte Dateien:

Lesenswert?

mmm ich habe mich wohl etwas missverständlich ausgedrückt... ich denke 
so ist es verständlicher. Drücke ich den Taster so leitet der Mosfet, 
der µC startet und macht über den Transistor die Selbsthaltung. An Akku 
+ liegt 12V

Jetzt möchte ich, wenn der µC die Selbsthaltung geschaffen hat und meine 
Schaltung arbeitet, den Taster gerne weiter auswerten.

von Johannes A. (kleinerkeiler96)


Lesenswert?

Benjamin Utz schrieb:
> (Setz mal sicherheitshalber ein paar mehr
> Klammern) müsste der Controller dann ignorieren, weil er schon einen
> passenden fall in deinem IF-Konstrukt gefunden hat.

und wo soll ich mehr klammern setzen.?

von Hubert G. (hubertg)


Lesenswert?

Eine Diode in die Tasterleitung zum IRF sollte für die Ansteuerung 
dessen kein Problem sein.
Zum µC hin zwischen Taster und Diode abgreifen.

von Krapao (Gast)


Lesenswert?

Mit einem ADC die Spannung an 2 des Tasters messen.

Die sollte bei aktiver Selbsthaltung und offenem Taster wg. T5 leicht 
über GND liegen und bei gedrücktem Taster auf GND.

von Krapao (Gast)


Lesenswert?

Johannes, was bu den für einer?

Fremde Threads für eigene Fragen kapern und Pseudocode nicht von C 
unterscheiden können...

von Johannes A. (kleinerkeiler96)


Lesenswert?

laber nich...es hat geholfen.

von Mr.T (Gast)


Lesenswert?

Hallo, das mit ADC... ich habe dort bei der Selbsthaltung ~30mV 
Differenz und meine Akkuspannung variiert auch. 5V/1024 macht ne 
Auflösung von 4mV das wird glaube ich nicht sauber funktionieren.

Das mit der Diode habe ich noch nicht ganz verstanden...

lg Malte

von Hubert G. (hubertg)


Lesenswert?

Wenn du zwischen Taster und R10 eine Diode mit Kathode zum Taster 
schaltest, bekommt der IRF GND über Taster und Diode.
Der µC schaltet den Transistor und der IRF bekommt GND darüber.
Wenn du nun zwischen Diode und Schalter auf einen Eingang des µC gehst, 
PullUp aktivieren, hast du high wenn Taste nicht gedrückt oder low, wenn 
TAste gedrückt.

von Krapao (Gast)


Lesenswert?

~30mV, differentiell gemessen und mit Gain 20x, und 1.1V ADC Voltage 
Reference, beim Attiny24 geht das ja... Ich würde nicht grundsätzlich 
ausschliessen un mal im Prototyp probieren.

von Mr.T (Gast)


Angehängte Dateien:

Lesenswert?

So ? Das Funktioniert nicht da im ausgeschaltetem zustand an +5V wohl 
GND. 5V Werden durch einen Schaltregler erzeugt...

lg

von Hubert G. (hubertg)


Lesenswert?

Ich würde auch den internen PullUp des µC verwenden, den schaltest du 
doch erst im Betrieb ein.

von Mr.T (Gast)


Lesenswert?

Hubert G. schrieb:
> Ich würde auch den internen PullUp des µC verwenden, den schaltest du
> doch erst im Betrieb ein.

Bleibt aber noch das ich dann ja am Pin 12V-5V habe und ich bekomme so 
keine 5 auf den I/O... also das scheint nicht zu Funktionieren...

aber danke :).

von Krapao (Gast)


Lesenswert?

Die Idee von Hubert ist gut, du musst sie aber mit der Software aber 
richtig bedienen.

1. vom µC aus Selbsthaltung einschalten. Dadurch sieht die Anode der 
Diode ~GND.

2. jetzt den internen Pull-Up am µC einschalten und die Kathode der 
Diode (und Pin 2 des Tasters) sehen ~5V.

3. Der Taster ist jetzt active-low, d.h. du an mit einem LOW Pegel am µC 
Pin  erkennen dass der Taster gedrückt ist.

4. Bevor der µC die Selbsthaltung löst, ist der interne Pull-Up wieder 
auszuschalten.

von Hubert G. (hubertg)


Angehängte Dateien:

Lesenswert?

Der Rückstrom könnte tatsächlich störend wirken. Dann halt einen 
Transistor dazu.

von Mr.T (Gast)


Lesenswert?

ich habe das mal aufgebaut... das funktioniert leider nicht, Transistor 
ist ein BC639 den ich noch hier hatte...

von Hubert G. (hubertg)


Lesenswert?

Schaltet der IRF nicht oder funktioniert die Tastenerkennung nicht?

von cHristian (Gast)


Angehängte Dateien:

Lesenswert?

dann probier mal die Schaltung aus, einschalten mit Low an D6, zum 
Ausschalten muss Low an D8.
Auszug aus der Schaltung vom portablen Mikrokoptertool.

Christian

von Mr.T (Gast)


Lesenswert?

Die tasten Erkennung, ich habe am PIN2 vom Taster ja keine 5V anliegen 
da liegt GND Potential...

von cHristian (Gast)


Lesenswert?

mach was drauss,die Schaltung funktioniert so. an C21 liegen übrigens 
3,2-4,2V, die werden beim Einschalten mit Low(GND) über den FET an den 
Spannungswandler geschaltet, der FET hält sich selbst über R43/T43 und 
kann dann über Low an der Basis von T43 wieder abgeschaltet werden.

Christian

von Mr.T (Gast)


Lesenswert?

mmm ok ich schau mir das mal an... wobei ich ja nicht nur ein/abschalten 
will, das funktioniert ja. Ich will gleichzeitig noch den Taster mit dem 
µC auswerten... wenn die Selbsthaltung aktiv ist.

von Mr.T (Gast)


Lesenswert?

Danke, hab den ganzen Schaltplan gefunden und die Schaltung glaube ich 
verstanden... werde es mal umsetzen...

http://svn.mikrokopter.de/filedetails.php?repname=Projects&path=/Transportables_Koptertool/tags/V3.x/HW_Koptertool3_9/Release_PKT_V3_9m_sch.pdf

von Christian (Gast)


Angehängte Dateien:

Lesenswert?

ok, dann bekommst Du den Rest auch noch, Key_plus findest Du in dem 
anderen Bild wieder.
Genau das mache ich da, Taste Key_plus zum Einschalten und danach wird 
die Taste als Taste benutzt.

Christian

von Mr.T (Gast)


Lesenswert?

Herzlichen Dank ich hatte da eben einen Knoten im Kopf bezüglich des 
Pullups.

R41, R40 und C23 bilden denke ich ein Low Pass filter zum entprellen, 
C23 wird über R40 entladen und R41 wieder geladen wenn der Transistor 
nicht mehr durchschaltet, liege ich da richtig?

Danke für den Wink...

von Christian (Gast)


Lesenswert?

so ist es.
Hast ja die Schaltung schnell gefunden;-)
MK-Pilot?

von Mr.T (Gast)


Lesenswert?

Ne einfach "portablen Mikrokoptertool" gegooglet und gut ;). Aber 
Mikrokopter stehen auch noch auf meiner Liste... Komme eher aus der 
Flächenflieger ecke ;)

Ich dank dir und ein Schönen Abend.

von Christian (Gast)


Lesenswert?

oh ja, Google ist da ja sehr aufmerksam, war mir noch garnicht 
aufgefallen.
Na dann mal zu, Mikrokopter und AVR passt gut zusammen.

Christian

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.