Taster Abfragen (Selbstabschaltung)

Gast #2454165
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
Angehängte Dateien:
Gast #2454193
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.
#2454214
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.
#2454222
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!)
Gast #2454236
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.
Angehängte Dateien:
Gast #2454273
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
#2454281
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.
Gast #2454338
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.
Gast #2454518
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
Gast #2454691
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...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren