Forum: Mikrocontroller und Digitale Elektronik Tiny mit IR signal aufwecken


von Hansi C. (honsey)


Angehängte Dateien:

Lesenswert?

Guten Abend,

ich tüftle gerade an einer Schaltung, bei der ein Tiny44 durch ein 
IR-Signal aus dem Schlaf geholt werden soll. Dafür habe ich einen 
TSOP35D26TR (Active-Low) direkt an einem Portpin)

So richtig mag das noch nicht klappen — vielleicht kann mir jemand von 
euch sagen, ob die Schaltung, so wie ich sie habe das überhaupt 
ermöglicht?

Im Netz und im Datenblatt finde ich widersprüchliche Informationen, wie 
man den Tiny44 aus dem SLEEP_MODE_PWR_DOWN holen kann.

Meinen Code würde ich euch auch gerne zeigen, da muss ich aber erst noch 
ein bisschen aufräumen bevor ich das der Öffentlichkeit präsentieren 
kann... :)

Es würde mir aber schon sehr helfen, wenn mir jemand sagen könnte ob das 
überhaupt damit funktionieren kann

Danke im vorraus,
Hans

von Peter D. (peda)


Lesenswert?

Jeder PCINT kann aufwecken.

Allerdings verbraucht der TSOP selber schon 0,4mA. Viel sparen wird man 
daher nicht.

von H.Joachim S. (crazyhorse)


Lesenswert?

Mit nem levelinterupt geht das eigentlich immer, den Tiny44 im 
speziellen habe ich allerdings noch nie in Fingern gehabt.

von Conny G. (conny_g)


Lesenswert?

Müsste gehen, aber vielleicht ist das das Problem?
(Datenblatt Seite 33)

Note that if a level triggered interrupt is used for wake-up the changed 
level must be held for

some time to wake up the MCU (and for the MCU to enter the interrupt 
service routine). See

“External Interrupts” on page 49 for details.

Und ob man sich wirklich genug Strom spart, das ist die Frage.

von Thomas E. (thomase)


Lesenswert?

Hansi Cardell schrieb:
> Es würde mir aber schon sehr helfen, wenn mir jemand sagen könnte ob das
> überhaupt damit funktionieren kann
Funktionieren wird das. Aber Strom sparst du damit nicht sehr viel, da 
der TSOP 4mA braucht. Da bringen es die paar Hundert µA des Tiny nicht.

Du kannst den VS-Pin des TSOP an einen Port vom Tiny legen und ihn damit 
abschalten. Dann aktivierst du den Watchdog als Timer und legst den 
Controller schlafen. Der Watchdog kann ihn dann z.B. alle Sekunde 
aufwecken, den TSOP einschalten und abfragen. Das ist wesentlich 
effektiver als den TSOP ständig eingeschaltet zu lassen. Man muß halt 
nur etwas länger drücken. Aber 1 Sekunde maximal ist kein Problem.

mfg.

von Stromsparer² (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Allerdings verbraucht der TSOP selber schon 0,4mA. Viel sparen wird man
> daher nicht.
Um noch mehr Strom zu sparen hat er Vs und GND nicht angeschlossen.

von Hansi C. (honsey)


Lesenswert?

Vielen Dank!

Ich habe jetzt auch den Code aufgeräumt, falls mal jemand was ähnliches 
vor hat.
1
#include <avr/power.h>
2
#include <avr/wdt.h>
3
#include <avr/sleep.h>
4
#include <avr/interrupt.h>
5
#include <util/delay.h>
6
7
#define TSOP_MASK  (1<<PB2)
8
#define LED1_MASK  (1<<PA0)
9
#define LED2_MASK  (1<<PA3)
10
11
volatile uint8_t color;
12
13
ISR(WDT_vect){
14
    color = 1;
15
}
16
17
ISR(PCINT1_vect){
18
  color = 2;
19
}
20
21
void wdt_init() {
22
    cli();
23
    wdt_reset();
24
    WDTCSR = (1<<WDE) | (1<<WDCE); // enable watchdog
25
    WDTCSR = (1<<WDIE) | 7; // enable watchdog interrupt, every 2s
26
    sei();
27
}
28
29
void sleep_now() {
30
    power_all_disable();
31
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);
32
    sleep_enable();
33
    sleep_mode();
34
    sleep_disable();
35
    wdt_init();
36
}
37
38
void flashLED(){
39
40
  if(color==1){
41
    PORTA |= LED1_MASK;
42
    _delay_ms(100);
43
    PORTA &= ~LED1_MASK;  
44
  }
45
46
  if(color==2){
47
    PORTA |= LED2_MASK;
48
    _delay_ms(100);
49
    PORTA &= ~LED2_MASK;    
50
  }
51
  
52
}
53
54
int main(void) {
55
56
  // setup
57
    DDRA |= LED1_MASK; // led outputs
58
    DDRA |= LED2_MASK; // led outputs
59
    
60
    DDRB &= ~TSOP_MASK; // input pcint10
61
    PORTB |= TSOP_MASK; // pullup enable
62
63
    // enable pin interrupt
64
    GIMSK |= (1<<PCIE1); // Pin Change Interrupt Enable 1 PCINT11:8
65
  PCMSK1 |= (1<<PCINT10); // = PB2, any change will cause interrupt
66
67
    wdt_init();
68
69
    //sei(); //enable interrupts
70
71
    while( 1 ) {
72
        flashLED();
73
        sleep_now();
74
    }
75
76
    return 0;
77
}


Es funktioniert soweit ganz gut:

Der Tiny wird alle paar Sekunden von einem WDT geweckt, blinkt eine LED 
und schläft dann wieder.
Wenn man den TSOP mit einer Fernbedienung testet, blinkt eine andere LED 
auf.

Ziel des Projekts ist eine möglichst kompakte Platine, optimalerweise 
von einer Knopfzelle versorgt (Die 3.3V kommen dann von einem NCP1400 
aufbereitet), die auf Zwillingsplatinen reagieren kann: Wenn man also 
zwei Platinen voreinander hält, sollen sie z.B. die LEDs aufleuchten.

Mein Plan war: Per WDT alle paar ms aufwachen, eine IR-LED ansteuern. 
Externer Interrupt durch den TSOP.

Ich habe mich ein wenig von der Produkt-Seite des TSOPs bei Farnell in 
die Irre leiten lassen. Dort heisst es: 350µA Supply Current. Ihr habt 
aber recht — das Datenblatt sagt was anderes.

Mit um die 3mA geht die Rechnung mit der Knopfzelle nicht mehr auf, bzw. 
nur noch für wenige Tage...

Jemand von euch eine kluge Idee, wie man die Annäherung der Platinen 
alternativ erkennen lassen könnte?

Vielen Dank im voraus,
Hans

: Bearbeitet durch User
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.