Hi,
ich habe (eventuell) ein Problem mit dem Schlafmodus vom Attiny 2313.
Ich bin mir nicht sicher, ob er wirklich im Schlafmodus ist, denn die
Zielschaltung verbraucht leider eine Knopfzelle innerhalb von 3 Tagen.
Ich habe kein µAmpermeter um festzustellen, ob der Attiny nun den Strom
zieht, oder eine andere Komponente (in dem Fall ein Funkmodul, aber das
sollte auch schlafen).
Zwei Pins, PB3 und PB5 sollen den Controller jeweils wieder kurz
aufwecken (was auch funktioniert).
Anbei der Code, evtl. kann mir jemand sagen, ob es so geht, oder ob ich
etwas vergessen habe.
1 | #include <avr/interrupt.h>
| 2 | #include <avr/sleep.h>
| 3 |
| 4 |
| 5 | void setup(void) {
| 6 | GIMSK |= 1<<INT0 | 1<<INT1;
| 7 | PCMSK |= (1<<PCINT0);
| 8 | }
| 9 |
| 10 |
| 11 | ISR(INT0_vect)
| 12 | {
| 13 | sleep_disable();
| 14 | }
| 15 |
| 16 | void go_to_sleep(){
| 17 | set_sleep_mode(SLEEP_MODE_PWR_DOWN);
| 18 | sleep_enable();
| 19 | sei();
| 20 | sleep_cpu();
| 21 | cli();
| 22 | }
| 23 |
| 24 |
| 25 |
| 26 | int main(void) {
| 27 | setup();
| 28 | for(;;) {
| 29 | //Do something
| 30 | go_to_sleep();
| 31 | }
| 32 | }
|
Danke schonmal
Brownout-Detector? Watchdog?
Zu Funkmodul und Hardware lässt sich schlecht was sagen, weil Glaskugel
kaputt.
Mike Mike schrieb:
> oder ob ich
> etwas vergessen habe.
Den 2. Interrupthandler und die Pullups.
Analog Comparator abschalten.
Oh, der Handler ist da, hatte ihn nur beim abspecken vom Code gerade
rausgeschmissen.
Wenn die Pullups für die zwei Pins gemeint sind, die sind auch da.
Aber ja, sorry, hätte ich mit reinpacken sollen, aber wegen
undefinierten Pinstates wacht er nicht auf.
Peter Dannegger schrieb:
> Den 2. Interrupthandler und die Pullups.
Viele Input-Pins sind im Sleep abgetrennt und intern gegrounded.
Also meine Vermutung ist, dass er nicht in den Schlafmodus geht.
Fehlt da noch etwas?
Mike Mike schrieb:
> Fehlt da noch etwas?
Das Amperemeter. Muss kein Fluke sein. In solcher Anwendeng tuts ggf.
auch eines für 10€.
Achso, ist Brownoutdetection, Watchdog und der ADC standardmäßig an?
Das würde den Stromverbrauch natürlich erklären!
Mike Mike schrieb:
> Achso, ist Brownoutdetection, Watchdog und der ADC standardmäßig an?
Der AC ist es. Ich sehe aber grad, dass er es im Sleep nicht ist. ADC
hat der 2313 nicht.
Die anderen können per Fuses an sein, wenn du das so eingestellt hast.
Okay, werde mal die Fuses schnell ansehen.
Und ich habe gerade mal mit dem Amperemeter gemessen -> 3mA
Hätte nur gedacht, es wäre im µA Bereich... Hätte wohl lieber gleich
messen sollen.
Ich schaue mal nach, was sich ändert, muss aber erst ein paar Kabel
anlöten, um den Controller wieder programmieren zu können.
Diese Funkmodule (z.B. nRF) sicher schlafen zu legen ist nicht so
einfach. Die wachen gerne mal durch einen Brownout auf, und sitzen dann
wach da, wartend und Elektronen fressend.
Ich kappe denen inzwischen komplett die Stromversorgung um sicher zu
sein.
LG, Sebastian
Auch gut zu wissen, danke.
Ich sehe gerade, er geht garnicht in den Schlafmodus!
Nach dem Schlafmodus werden dennoch Befehle ausgeführt...
Habe gerade mal eine LED angelötet, und die blinkt fröhlich, obwohl er
schlafen sollte ...
Ich sehe gerade, wenn ich die im GIMSK Register INT0 und INT1 setze,
wacht er direkt wieder auf.
Wenn ich das nicht mache, schläft er.
Vielleicht solltest du doch mal das Unzumutbare auf dich nehmen und
einen Schaltplan malen.
Toll,
wenn ich GIMSK |= 1<<PCIE setze, schläft er und es klappt auch alles...
Muss natürlich die anderen Masken noch anpassen, aber so schläft er.
Verstehe ich nicht ganz, aber okay? Kann mir das wer erklären?
Setze ich INT0 und INT1, schläft er nicht.
Mike Mike schrieb:
> Ich sehe gerade, wenn ich die im GIMSK Register INT0 und INT1 setze,
> wacht er direkt wieder auf.
Welche Art des Triggers konfigurierst du denn für INT0 und INT1 mit
ISC11, ISC10, ISC01, ISC00 in MCUSR? Der Default scheint ein
LOW-interrupt zu sein. Hast du externe Pullups an PD2 und PD3?
Ausserdem: Wieso PB3 und PB5?
LG, Sebastian
Sorry, PB3 und PB0
Da ist einiges durcheinander geraten, bin gerade etwas unkonzentriert.
Also ich habe die Interruptmask auf PCIE gestellt, und bei PCMSK war
auch ein Fehler, habe die Falschen Pins im Kopf gehabt.
Hier gehörten PCINT0 und PCINT3 im PCMSK gesetzt.
So klappt es, und ich habe nun 0mA (habe leider kein µAmperemeter)
Aber viel besser als 3mA.
So sieht der Code aus, der auch funktioniert: 1 | #include <avr/interrupt.h>
| 2 | #include <avr/sleep.h>
| 3 |
| 4 |
| 5 | void setup(void) {
| 6 | PORTB |= _BV(PB3) | _BV(PB0);
| 7 | PCMSK |= (1<<PCINT0) |(1<<PCINT3);
| 8 | GIMSK |= 1<<PCIE;
| 9 | }
| 10 |
| 11 | void go_to_sleep(){
| 12 | set_sleep_mode(SLEEP_MODE_PWR_DOWN);
| 13 | sleep_enable();
| 14 | sei();
| 15 | sleep_cpu();
| 16 | cli();
| 17 | }
|
Sebastian Wangnick schrieb:
> Der Default scheint ein
> LOW-interrupt zu sein
Ja default ist LOW.
Pullups waren schon gesetzt.
Ein Freund hat grad ein Multimeter mit µA vorbeigebracht.
Jetzt braucht das Teil 0.5µA, ich denke das ist okay
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
|