Forum: Mikrocontroller und Digitale Elektronik Attiny85: Brown-Out-Detection via Software ausschalten


von Tobi X. (ranger81)


Lesenswert?

Hallo,

wie im Attiny85 Datenblatt auf Seite 35 genannt möchte ich gerne via 
Software die Brown-Out-Detection deaktivieren, bevor ich in den 
Power-Down Schlaf gehe. Diese Möglichkeit soll laut Datenblatt für 
Attiny85 ab Rev. C existieren. Hierfür benutze ich den "empfohlenen" 
Code von Atmel (ganz unten) 
http://www.atmel.com/webdoc/avrlibcreferencemanual/group__avr__sleep.html

Der Stromverbrauch nach dem Wechsel in den Power Down Sleep-Modus 
beträgt allerdings noch immer ca. 18.7uA. Wenn der BOD tatsächlich 
abgeschaltet wäre, würde ich hier aber unter 1uA erwarten. Somit scheint 
die Abschaltung nicht zu funktionieren. Fuse Settings des Attiny85 sind 
übrigens E:FF, H:DD, L:62. )Brown Out Detection auf 2.7V ist via Fuse 
aktiv, sonst Standard Fuses)

Habe inzwischen mehrere Attiny85 mit unterschiedlichen Date-Codes 
vergeblich getestet.

Könnt ihr das ggf. mal testen mit einem Attiny85, ob das bei euch 
funktioniert, oder mache ich etwas falsch?

PS: Testaufbau ist nur der blanke Attiny85, keine ext. Komponenten.

Danke,
Grüße

von Karl M. (Gast)


Lesenswert?

Tobi Xx,

warum zeigst Du deinen Code nebst Makefile nicht ?

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Schalte den BOD doch mal bitte per Fuse ab und messe dann den 
Stromverbrauch.
Beachte, das 'floating' Pins den Stromverbrauch rapide ansteigen lassen, 
es sollten also alle Pins definiert auf high oder low liegen.

von Dietrich (Gast)


Lesenswert?

Karl M. schrieb:
> Tobi Xx,
>
> warum zeigst Du deinen Code nebst Makefile nicht ?

Warum plenkst du?

von Karl M. (Gast)


Lesenswert?

Dietrich schrieb:
> Warum plenkst du?

Aha, die neue Rechtschreibung möchte es anders. Ok?

von Tobi X. (ranger81)


Lesenswert?

Matthias S. schrieb:
> Schalte den BOD doch mal bitte per Fuse ab und messe dann den
> Stromverbrauch.
> Beachte, das 'floating' Pins den Stromverbrauch rapide ansteigen lassen,
> es sollten also alle Pins definiert auf high oder low liegen.

Habe ich gemacht, dann liegt der Stromverbrauch bei den erwarteten ca 
200nA.

@Karl: Mein Code besteht ausschließlich aus dem genannten Beispielcode. 
Fuses sind genannt. Sollte also alles gesagt sein.

von S. Landolt (Gast)


Lesenswert?

> 'floating' Pins den Stromverbrauch rapide ansteigen lassen

nicht bei Power-down

von Karl M. (Gast)


Lesenswert?

Hallo,

bei mir liefert der gcc eine Fehlermedung.
"<m o d e>" , "(some_condition)"
1
set_sleep_mode(<mode>);
2
  cli();
3
  if (some_condition)
4
  {
5
    sleep_enable();
6
    sleep_bod_disable();
7
    sei();
8
    sleep_cpu();
9
    sleep_disable();
10
  }
11
  sei();

von Tobi X. (ranger81)


Lesenswert?

Karl M. schrieb:
> Hallo,
>
> bei mir liefert der gcc eine Fehlermedung.
> "<m o d e>" , "(some_condition)"
>
1
set_sleep_mode(<mode>);
2
>   cli();
3
>   if (some_condition)
4
>   {
5
>     sleep_enable();
6
>     sleep_bod_disable();
7
>     sei();
8
>     sleep_cpu();
9
>     sleep_disable();
10
>   }
11
>   sei();

ersetze <mode> mit SLEEP_MODE_PWR_DOWN und entferne die if-Bedingung.

: Bearbeitet durch User
von S. Landolt (Gast)


Lesenswert?

Schlecht: ich habe hier eine ganze Stange ATtiny85-20PU, also 50 Stück, 
von 1706, aber Rev. B.

von Tobi X. (ranger81)


Lesenswert?

S. Landolt schrieb:
> Schlecht: ich habe hier eine ganze Stange ATtiny85-20PU, also 50 Stück,
> von 1706, aber Rev. B.

Woran erkennst du denn die Revision? Da gibts es ja unzählige Mythen und 
Vermutungen welcher der Codes die Revision sein könnte...

von S. Landolt (Gast)


Lesenswert?

Das sind, wie gesagt, PU, also PDIP, auf der Unterseite steht:
1
A8V    B5A
2
B      1P
3
1706   e3
und da hatte ich jetzt einfach gedacht, das "B" in der Mitte links sei 
die Revision.

von S. Landolt (Gast)


Lesenswert?

PS: Jedenfalls steht nirgendwo auf den Dingern ein "C".

von S. Landolt (Gast)


Lesenswert?

> ... welcher der Codes die Revision ...
Sehe ich das richtig, Sie wissen gar nicht, welche Revision Sie haben?

von Tobi X. (ranger81)


Lesenswert?

S. Landolt schrieb:
>> ... welcher der Codes die Revision ...
> Sehe ich das richtig, Sie wissen gar nicht, welche Revision Sie haben?

Naja ich habe auch das "B" auf der unteren Seite, aber ich glaube kaum, 
dass das die Revision ist. Der Datecode besagt Herstellungsjahr 2016 und 
anhand der Änderungshistorie des Datasheets gibt's die Software BOD 
Deaktivierung wohl schon sehr sehr lange (ca 2008). Von daher gehe ich 
eigentlich schon davon aus, dass wir mittlerweile die nötigte Revision 
haben.

von S. Landolt (Gast)


Lesenswert?

Ich weiß nicht, vielleicht sah Atmel keine Notwendigkeit, die Produktion 
umzustellen; Papier, pardon PDF, ist geduldig.

von Thomas E. (thomase)


Lesenswert?

> sleep_bod_disable();

Ohne mir jetzt angesehen zu haben, was da hintersteckt, gehe ich davon 
aus, daß damit die automatische BOD-Abschaltung aktiviert wird. Das 
haben aber nur die P-Typen der Atmegas. Der Tiny 85 kann das nicht. Du 
wirst den BOD daher zu Fuß abschalten und auch wieder einschalten 
müssen.

S. Landolt schrieb:
> eine ganze Stange ATtiny85-20PU, also 50 Stück,
> von 1706

1706 gab es noch keine Mikrocontroller.

: Bearbeitet durch User
von S. Landolt (Gast)


Lesenswert?

Ich habe es mit einem von meinen probiert, die sind von diesem Jahr, 
aber BOD lässt sich nicht abschalten, die Stromaufnahme liegt bei 19 uA.
  Vielleicht sieht aber jemand einen Fehler im Programm:
1
.include "tn85def.inc"
2
.def    tmp0    = r16
3
    ldi     tmp0,(1<<SE)+(1<<SM1) + (1<<BODS)+(1<<BODSE)
4
    out     MCUCR,tmp0
5
    ldi     tmp0,(1<<SE)+(1<<SM1) + (1<<BODS)+(0<<BODSE)
6
    out     MCUCR,tmp0
7
    sleep

von Karl M. (Gast)


Lesenswert?

Hallo,

soweit ich das sehe, kann jeder ein Programm schreiben, dass das Bit 
BODS im Register MCUCR überprüft.

Kann man MCUCR.BODS = 1 setzen und auch erfolgreich wieder 
(zurück)lesen,
dann gibt es die Funktionalität beim attiny85.
Natürlich muss man das weiter unter beschriebene Zeitverhalten beachten!
1
if (MCUCR & (1<<BODS)) {
2
// ok MCUCR.BODS = 1 kann man setzen.
3
} else {
4
// fehler
5
}

*MCUCR – MCU Control Register*
The MCU Control Register contains control bits for power management.
• Bit 7 – BODS: BOD Sleep
BOD disable functionality is available in some devices, only. See 
“Limitations” on page 36.

In order to disable BOD during sleep (see Table 7-1 on page 34) the BODS 
bit must be written to logic one. This is controlled by a timed sequence 
and the enable bit, BODSE in MCUCR. First, both BODS and BODSE must be 
set
to one. Second, within four clock cycles, BODS must be set to one and 
BODSE must be set to zero.
The BODS bit is active three clock cycles after it is set. A sleep 
instruction must be executed while BODS is active in order to turn
off the BOD for the actual sleep mode. The BODS bit is automatically 
cleared after three clock cycles.
In devices where Sleeping BOD has not been implemented this bit is 
unused and will always read zero.

von Thomas E. (thomase)


Lesenswert?

Thomas E. schrieb:
> Ohne mir jetzt angesehen zu haben, was da hintersteckt, gehe ich davon
> aus, daß damit die automatische BOD-Abschaltung aktiviert wird. Das
> haben aber nur die P-Typen der Atmegas. Der Tiny 85 kann das nicht. Du
> wirst den BOD daher zu Fuß abschalten und auch wieder einschalten
> müssen.

Gerade gesehen, daß das offensichtlich Blödsinn ist.

von M. K. (sylaina)


Lesenswert?

Thomas E. schrieb:
> 1706 gab es noch keine Mikrocontroller.

KW 06 2017 solls keine Mikrocontroller gegeben haben? Wow, dann haben 
wir ja in den letzten 45 KWs ne Menge erreicht.

von Tobi X. (ranger81)


Lesenswert?

Karl M. schrieb:
> Kann man MCUCR.BODS = 1 setzen und auch erfolgreich wieder
> (zurück)lesen,
> dann gibt es die Funktionalität beim attiny85.
> Natürlich muss man das weiter unter beschriebene Zeitverhalten beachten!
>
1
if (MCUCR & (1<<BODS)) {
2
> // ok MCUCR.BODS = 1 kann man setzen.
3
> } else {
4
> // fehler
5
> }
>
> In devices where Sleeping BOD has not been implemented this bit is
> unused and will always read zero.

Das habe ich mal versucht, scheint als würde er immer 0 zurück lesen, 
auch wenn ich zuvor das Bit auf 1 gesetzt habe. Hatte das aber schnell 
mit Arduino getestet, daher bin ich mir nicht sicher, ob ich da alles 
richtig gemacht habe. Kann das einer von euch auch nochmal verifizieren?

Danke!

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Tobi X. schrieb:
> auch wenn ich zuvor das Bit auf 1 gesetzt habe.

Innerhalb von 3 Cycles nach dem Setzen des Bits wird es sowieso von 
alleine gelöscht. Wenn man es also lesen will, muss man das direkt nach 
der 'Enable BOD' Prozedur machen.
Übrigens - wenn auf der Unterseite ein B steht, ist es lt. Datenblatt 
auch Revision B:

"7.2.1         Limitations
BOD disable functionality has been implemented in the following devices, 
only:
• ATtiny25, revision E, and newer
• ATtiny45, revision D, and newer
• ATtiny85, revision C, and newer
Revisions are marked on the device package and can be located as 
follows:
• Bottom side of packages 8P3 and 8S2
• Top side of package 20M1"

von Karl M. (Gast)


Lesenswert?

Guten Morgen,

aus dem referierten Abschnitt des Datenblatts Attiny85 liest man:
"The BODS bit is active three clock cycles after it is set."

Darauf bezieht sich meine Anmerkung
> Natürlich muss man das weiter unter beschriebene Zeitverhalten beachten!

Somit kann man nur sicher testen, wenn man vorher immer den erzeugten 
Code C -> Assembler ansieht und die Zeiten eingehalten werden.
Man kann natürlich auch das Setzen und Zurücklesen aus in Assembler 
kodieren.

von Tobi X. (ranger81)


Lesenswert?

Habe zum Thema mal bei Microchip angefragt... Lt. Microchip müsste es 
z.B. mit dem C-Code (siehe Listing oben) funktionieren. Voraussetzung 
ist eben die Chip-Rev. C oder neuer. Die Revision lässt sich wohl auf 
der Unterseite (zweite Zeile, erster Buchstabe bei PDIP Package) 
erkennen. Bei mir ein "B" und somit klar, warum es nicht funktioniert.

Jetzt stellt sich mir nur die Frage, woher ich Rev. C Chips bekomme...

: Bearbeitet durch User
von Ach Du (Gast)


Lesenswert?

Danke! So ein Mist.

> In some devices it is possible to save power by disabling the BOD by software in 
Power-Down sleep mode.

Da wäre ein fetter Link auf

Matthias S. schrieb:
> 7.2.1 Limitations

schön gewesen ... und hätte mir viel rumprobieren erspart (3V, 5V, 
Pullup, PRR, ACSR). Ich dachte, ich hätte vielleicht einen "Schalter" 
übersehen.
Oder die Schreibsequenz (sleep_bod_disable(); 
http://www.nongnu.org/avr-libc/user-manual/group__avr__sleep.html).
Oder der AVR wäre defekt.
Ich hatte auch um die 15, 16, 17, 18 uA - bis ich den BOD in den 
BODLEVEL Fuses ausgeschaltet habe, dann 0.2 uA.

Zum Spielen:

1
// ATtiny85 @ 2V
2
// Fuses: E:FE, H:DE, L:E1
3
4
#define F_CPU 16000000UL
5
#include <stdint.h>
6
7
#include <avr/io.h>
8
#include <avr/sleep.h>
9
#include <avr/interrupt.h>
10
#include <avr/wdt.h>
11
#include <util/delay.h>
12
13
int main(void) {
14
    // init
15
    MCUSR = 0;
16
    GIFR = 0xFF;
17
18
    // watchdog
19
    wdt_disable();
20
21
    // POWER
22
    ACSR = (1<<ACD);
23
    PRR =  (1<<PRTIM1) | (1<<PRTIM0) | (1<<PRUSI) | (1<<PRADC);
24
25
    DDRB = 0;
26
    PORTB = 0xFF;
27
28
    // PCINT
29
    PCMSK = (1<<PCINT2);
30
    GIMSK = (1<<PCIE);
31
32
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);
33
    // sei();
34
    for(;;){
35
36
        cli();
37
        if (1)
38
        {
39
            sleep_enable();
40
            sleep_bod_disable(); // ! 7.2.1 Limitations
41
            sei();
42
            sleep_cpu();
43
            sleep_disable();
44
        }
45
        sei();
46
47
    };
48
}
49
50
ISR(PCINT0_vect) {
51
}

von Benedikt M. (bmuessig)


Lesenswert?

Tobi X. schrieb:
> Jetzt stellt sich mir nur die Frage, woher ich Rev. C Chips bekomme...

Das habe ich mich privat auch schon oft bei anderen Chips gefragt. Wenn 
in der Errata z.B. das beworbene I2S bei allen Revisionen, abgesehen von 
der Aktuellsten, defekt ist und man die Teile nicht direkt vom 
Hersteller bezieht, muss man wohl auf einen anderen Chip setzen (oder 
einen guten Draht zum Distributor haben).

von M. K. (sylaina)


Lesenswert?

Benedikt M. schrieb:
> oder
> einen guten Draht zum Distributor haben

Einfach mal anrufen und nicht nur blind bestellen. Viele Distributoren 
sind doch sehr hilfsbereit, auch "Laien" gegenüber ;)

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.