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
Tobi Xx, warum zeigst Du deinen Code nebst Makefile nicht ?
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.
Karl M. schrieb: > Tobi Xx, > > warum zeigst Du deinen Code nebst Makefile nicht ? Warum plenkst du?
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.
> 'floating' Pins den Stromverbrauch rapide ansteigen lassen
nicht bei Power-down
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(); |
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
Schlecht: ich habe hier eine ganze Stange ATtiny85-20PU, also 50 Stück, von 1706, aber Rev. B.
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...
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.
PS: Jedenfalls steht nirgendwo auf den Dingern ein "C".
> ... welcher der Codes die Revision ...
Sehe ich das richtig, Sie wissen gar nicht, welche Revision Sie haben?
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.
Ich weiß nicht, vielleicht sah Atmel keine Notwendigkeit, die Produktion umzustellen; Papier, pardon PDF, ist geduldig.
> 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
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 |
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.
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.
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.
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!
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"
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.
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
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 | }
|
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).
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.