closed

Loginbox

Please enter your username and password into the following fields to log in.


  • Username:
  • Password:
  •  
  • Auto log in on every visit.


  •  

PowerDownMode, Mega88PB



Mathias offline
Benutzer
Avatar
Gender: n/a
Location: n/a  Stutensee
Age:
Posts: 254
Registered: 07 / 2003
Private message
Subject: PowerDownMode, Mega88PB  -  Posted: 07.03.2020 - 04:22   -  
Hallo,
möchte den BOD schlafen legen anschließend den ganzen MC:
Code

{ Main Program }
{$IDATA}
Begin
  MDelay(10);                    // 10 msec warten.
  CLKPR:=  %1000 0000;  // Clock Prescaler Change Enable.
  CLKPR:=  %0000 0001;  // Clock Prescale = 4MHz.
  pInitPorts;
  EnableInts;
  incl(PUD);                      // Pull-up Disable
  PRR:= %1111 1111;
  // ; -, Bods, Bodse, PUD, -, -, IVSEL, IVCE;
  MCUCR:= MCUCR Or  %0110 0000;
  MCUCR:= MCUCR And %1101 1111;
  CPUsleep (SMCR or %0000 0101);


Irgendwie meine ich es klappt so nicht den BOD abzuschalten.
Dazu muß eine bestimmte Sequenz eingehalten werden.
Datenblatt, Seite 85
Kann man den WatchDog-Oszillator auch abschalten?
Wenn ja, wie?
Kann mir jemand helfen?

Was sollte man noch abschalten damit im PowerDownMode so wenig wie möglich Strom gebraucht wird?
Momentan sind es 24 µA, da geht bestimmt noch was.
Bin um Tipps mit Code-Anweisung dankbar.

Danke

Datenblatt:
http://ww1.microchip.com/downl...01909A.pdf
go down go up
Mathias offline
Benutzer
Avatar
Gender: n/a
Location: n/a  Stutensee
Age:
Posts: 254
Registered: 07 / 2003
Private message
Subject: Re: PowerDownMode, Mega88PB  -  Posted: 09.03.2020 - 19:51   -  
Kriege den BOD zur Laufzeit nicht abgeschaltet.
Hat jemand einen Tipp bzw. etwas Assenbler für mich?

Hier der Datenblattauszug:
Bit 6 – BODS: BOD Sleep
The BODS bit must be written to '1' in order to turn off BOD during sleep. Writing to the BODS bit is
controlled by a timed sequence and the enable bit BODSE. To disable BOD in relevant sleep modes, both
BODS and BODSE must first be written to '1'. Then, BODS must be written to '1' and BODSE must be
written to zero within four clock cycles.
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.
Bit 5 – BODSE: BOD Sleep Enable
BODSE enables setting of BODS control bit, as explained in BODS bit description. BOD disable is
controlled by a timed sequence.

Danke
This post has been edited 1-times. Last edit: 09.03.2020 - 19:53 by Mathias.
go down go up
Thomas.AC offline
Benutzer
Avatar
Gender: n/a
Location: n/a 
Age: 39
Posts: 261
Registered: 07 / 2013
Private message
Subject: Re: PowerDownMode, Mega88PB  -  Posted: 11.03.2020 - 08:34   -  
Ohne Test und Gewähr.
Code

                        IN        _ACCA, MCUCR
                        ORI       _ACCA, 060h
                        MOV       _ACCB, _ACCA
                        ANDI      _ACCB, 0DFh
                        OUT       MCUCR, _ACCA
                        OUT       MCUCR, _ACCB



und die Interrupts erst danach, vor cpuSleep, einschalten.
This post has been edited 1-times. Last edit: 11.03.2020 - 08:36 by Thomas.AC.
go down go up
Mathias offline
Benutzer
Avatar
Gender: n/a
Location: n/a  Stutensee
Age:
Posts: 254
Registered: 07 / 2003
Private message
Subject: Re: PowerDownMode, Mega88PB  -  Posted: 11.03.2020 - 22:39   -  
Danke Thomas,
leider keine Besserung.

Wenn bei "Define_Fuses" das FuseBits1 ausgeklammert wird so ist im Programmermenü trotzdem das "Bodlevel0" Bit gesetzt.
Wieso?
Erst, wenn das Häckchen explizit beim "Bodlevel0" im Programmermenü rausgenommen wird, ist BOD nicht mehr aktiv und die Stromaufnahme sinkt um 24µA.

Code

Device = mega88pb, VCC=3.6;
{ $BOOTRST $03800}         {Reset Jump to $03800}

Define_Fuses
  Override_Fuses;
  NoteBook   = A;
  COMport    = USB;
  SPIclk     = 1000000;
  LockBits0  = [LockBit2];
  FuseBits0  = [CKSEL0, CKSEL2, CKSEL3, SUT0, CKDIV8];   // Oszillator=intern 8MHz / 8 = 1 MHz.  // CKDIV8
//  FuseBits1  = [BODLEVEL0];            // Reset bei 1,8V
  ProgMode   = SPI;
  ProgFuses  = true;
  ProgLock   = true;
  ProgFlash  = true;
  ProgEEprom = false;

Import SysTick; //, WatchDog;
From System Import PCINTserv2;

Define
  ProcClock      = 4000000;              // Hertz
  SysTick        = 1;                    // msec
//  WatchDog       = msec250;              // presc = 4
  StackSize      = 20, iData;
  FrameSize      = 20, iData;


Code

{ Main Program }
{$IDATA}
Begin
  MDelay(10);                  // 10 msec warten.
  CLKPR:=  %1000 0000;  // Clock Prescaler Change Enable.
  CLKPR:=  %0000 0001;  // Clock Prescale = 4MHz.
  PRR:= %1111 1111;             // Power reduction: prTWI, prTIMER2, prTIMER0, -, prTIMER1, prSPI, prUSART, prADC,    0 = enable
  pInitPorts;
ASM;
  IN        _ACCA, MCUCR
  ORI       _ACCA, 060h
  MOV       _ACCB, _ACCA
  ANDI      _ACCB, 0DFh
  OUT       MCUCR, _ACCA
  OUT       MCUCR, _ACCB
  sei
  LDI       _ACCA, 005h
  OUT        SMCR, _ACCA
  sleep
  nop
  OUT        SMCR, 000h
  OUT       MCUCR, 000h
ENDASM;
  Loop
    Nop;
  Endloop;
End Mega88PB_PDown.
You must be logged in or your permissions are to low to see this Attachment(s).
go down go up
Thomas.AC offline
Benutzer
Avatar
Gender: n/a
Location: n/a 
Age: 39
Posts: 261
Registered: 07 / 2013
Private message
Subject: Re: PowerDownMode, Mega88PB  -  Posted: 11.03.2020 - 23:31   -  
Sieht schon sehr vielversprechend aus.
Ich glaube der sleep Befehl kommt zu spät. Zwischen dem setzten von Bods und sleep dürfen maximal 3 clock cycles vergehen.
Die opcodes Sei, ldi und out sind bereits 3 cycles zusammen, glaube ich. Vielleicht ist es möglich das smcr register vorher zu schreiben um cycles zu gewinnen.
Kann gerne asm code dazu schreiben, aber nicht jetzt am Handy.
Bezüglich Fuses würde ich
fusebits1 = []
probieren anstatt auszukommentieren.

Gruß
This post has been edited 5-times. Last edit: 12.03.2020 - 19:25 by Thomas.AC.
go down go up
Mathias offline
Benutzer
Avatar
Gender: n/a
Location: n/a  Stutensee
Age:
Posts: 254
Registered: 07 / 2003
Private message
Subject: Re: PowerDownMode, Mega88PB  -  Posted: 12.03.2020 - 21:51   -  
Danke das war es, die drei Zyklen wurden überschritten.
Das smcr Register beschreiben wird nun vorhergemacht.
Code

ASM;
  LDI       _ACCA, 005h
  OUT        SMCR, _ACCA
  IN        _ACCA, MCUCR
  ORI       _ACCA, 060h
  MOV       _ACCB, _ACCA
  ANDI      _ACCB, 0DFh
  OUT       MCUCR, _ACCA
  OUT       MCUCR, _ACCB
  sei
  sleep
  nop
  OUT        SMCR, 000h
  OUT       MCUCR, 000h
ENDASM;
go down go up
Thomas.AC offline
Benutzer
Avatar
Gender: n/a
Location: n/a 
Age: 39
Posts: 261
Registered: 07 / 2013
Private message
Subject: Re: PowerDownMode, Mega88PB  -  Posted: 17.03.2020 - 20:03   -  
Sehr schön!
Perfekt ist die Lösung noch nicht, da zwischen den Assemblerbefehlen sei und Sleep ein Interrupt auftreten könnte. Mit der Folge, dass der Brown-out-detector nicht abschaltet im Sleep Modus.
Vielleicht wäre es besser die Interrupts vorher einzeln zu sperren und nach dem Aufwecken wieder zu aktivieren.
go down go up
Mathias offline
Benutzer
Avatar
Gender: n/a
Location: n/a  Stutensee
Age:
Posts: 254
Registered: 07 / 2003
Private message
Subject: Re: PowerDownMode, Mega88PB  -  Posted: 18.03.2020 - 21:32   -  
Hatte einen Interrupt-Disable schon vorher eingefügt.
Code

  excl(ADEN);                   // AD-Wandler Aus.
  PRR:= %1110 1111;             // Power reduction: prTWI, prTIMER2, prTIMER0, -, prTIMER1, prSPI, prUSART, prADC,    0 = enable
  pPinChangeIntEnable;
  DisableInts;
  WatchDogStop;
  ASM;
    LDI       _ACCA, 005h
    OUT        SMCR, _ACCA
    IN        _ACCA, MCUCR
    ORI       _ACCA, 060h
    MOV       _ACCB, _ACCA
    ANDI      _ACCB, 0DFh
    OUT       MCUCR, _ACCA
    OUT       MCUCR, _ACCB
    sei
    sleep
    nop
    OUT        SMCR, 000h
    OUT       MCUCR, 000h
  ENDASM;


Den AD-Wandler abschalten, WatchDogStop, usw. bringen nix.
Gibt's vielleicht sonst noch etwas um den Stromverbrauch zu reduzieren?
Bin momentan bei 6µA mit Peripherie.
go down go up
Thomas.AC offline
Benutzer
Avatar
Gender: n/a
Location: n/a 
Age: 39
Posts: 261
Registered: 07 / 2013
Private message
Subject: Re: PowerDownMode, Mega88PB  -  Posted: 19.03.2020 - 22:02   -  
Quote by Mathias

Hatte einen Interrupt-Disable schon vorher eingefügt.


Das ist egal. Durch die Codesequenz
Code

sei
Sleep

ist der globale Interrupt wieder aktiv bevor Sleep aufgerufen wird, oder nicht?

Gruß
go down go up
Mathias offline
Benutzer
Avatar
Gender: n/a
Location: n/a  Stutensee
Age:
Posts: 254
Registered: 07 / 2003
Private message
Subject: Re: PowerDownMode, Mega88PB  -  Posted: 24.03.2020 - 15:12   -  
Ja, muss doch auch.
Denke ich.
Aufgeweckt soll er wieder werden über "PinChangeInterupt".
Also einem Pegelwechsel (Wake-up on pin change) an einem PortPin.
Das funktioniert prima.
Oder verstehe ich etwas nicht?
go down go up
Thomas.AC offline
Benutzer
Avatar
Gender: n/a
Location: n/a 
Age: 39
Posts: 261
Registered: 07 / 2013
Private message
Subject: Re: PowerDownMode, Mega88PB  -  Posted: 25.03.2020 - 22:24   -  
Vielleicht habe ich auch etwas falsch verstanden oder interpretiert.

Quote

BODS and BODSE must first be written to '1'. Then, BODS must be written to '1' and BODSE must be
written to zero within four clock cycles.
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


Soweit ich das verstehe stehen nach dem Deaktivieren des Brown-Out-Detektors maximal 3 Clocks zur Verfügung um den Sleep Befehl aufzurufen, damit der der Detektor sich auch wirklich deaktiviert. Das Aktivieren des Interrupts vor dem Sleep Befehl könnte jedoch dazu führen, dass vor der Ausführung des Sleep Befehls noch ein Interrupt abgearbeitet wird und somit mehr als 3 Clocks vergehen und folglich der Detektor nicht deaktiviert wird im Sleep-Modus.

Dies ist ein Dilemma, da der Interrupt für das Wake-Up benötigt wird. Daher die Idee, den Interrupt nicht global, sondern einzeln zu deaktivieren mit Ausnahme des pin-change-interrupts in deinem Fall.
go down go up
Mathias offline
Benutzer
Avatar
Gender: n/a
Location: n/a  Stutensee
Age:
Posts: 254
Registered: 07 / 2003
Private message
Subject: Re: PowerDownMode, Mega88PB  -  Posted: 30.03.2020 - 00:30   -  
Im Prinzip hast Du recht, daß eventuell noch ein Interrupt dazwischenfunken kann.
Etwas weiter vorher werden Timer, usw. abgeschaltet. Die können keinen Interrupt mehr machen.
Code

  PRR:= %1110 1111;             // Power reduction: prTWI, prTIMER2, prTIMER0, -, prTIMER1, prSPI, prUSART, prADC,    0 = enable

Werde noch nach deinem Vorschlag die Interrupts einzeln deaktivieren und dann runterfahren.
Dann kann nichts mehr passieren.
go down go up
Thomas.AC offline
Benutzer
Avatar
Gender: n/a
Location: n/a 
Age: 39
Posts: 261
Registered: 07 / 2013
Private message
Subject: Re: PowerDownMode, Mega88PB  -  Posted: 30.03.2020 - 20:01   -  
Quote
Dazwischenfunken

Genau das meine ich. Danke für die Antwort.
Auch an Systick denken.
go down go up
Mathias offline
Benutzer
Avatar
Gender: n/a
Location: n/a  Stutensee
Age:
Posts: 254
Registered: 07 / 2003
Private message
Subject: Re: PowerDownMode, Mega88PB  -  Posted: 31.03.2020 - 11:02   -  
Ich danke dir :-)
go down go up
Thomas.AC offline
Benutzer
Avatar
Gender: n/a
Location: n/a 
Age: 39
Posts: 261
Registered: 07 / 2013
Private message
Subject: Re: PowerDownMode, Mega88PB  -  Posted: 02.04.2020 - 21:59   -  
Quote

Was sollte man noch abschalten damit im PowerDownMode so wenig wie möglich Strom gebraucht wird?
Momentan sind es 24 µA, da geht bestimmt noch was.
Bin um Tipps mit Code-Anweisung dankbar.

Hab mal gelesen, dass 0,3uA möglich sind
https://www.mikrocontroller.net/articles/Sleep_Mode
go down go up
 


Registered users in this topic
Currently no registered users in this section

Delete cookies of this forum  •  FAQ / Help  •  Team page  •  Imprint   |  Local time: 01.06.2020 - 03:48