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
Jeder PCINT kann aufwecken. Allerdings verbraucht der TSOP selber schon 0,4mA. Viel sparen wird man daher nicht.
Mit nem levelinterupt geht das eigentlich immer, den Tiny44 im speziellen habe ich allerdings noch nie in Fingern gehabt.
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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.