PowerDownMode, Mega88PB

  • 1
  • 2
  • Page 1 of 2
Mathias
Benutzer
Avatar
Gender: n/a
Location: Weingarten - Baden
Posts: 310
Registered: 07 / 2003
Subject:

PowerDownMode, Mega88PB

 · 
Posted: 07.03.2020 - 04:22  ·  #1
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
Mathias
Benutzer
Avatar
Gender: n/a
Location: Weingarten - Baden
Posts: 310
Registered: 07 / 2003
Subject:

Re: PowerDownMode, Mega88PB

 · 
Posted: 09.03.2020 - 19:51  ·  #2
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
Thomas.AC
Benutzer
Avatar
Gender: n/a
Age: 43
Posts: 308
Registered: 07 / 2013
Subject:

Re: PowerDownMode, Mega88PB

 · 
Posted: 11.03.2020 - 08:34  ·  #3
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.
Mathias
Benutzer
Avatar
Gender: n/a
Location: Weingarten - Baden
Posts: 310
Registered: 07 / 2003
Subject:

Re: PowerDownMode, Mega88PB

 · 
Posted: 11.03.2020 - 22:39  ·  #4
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.
Attachments
PowerDownMode, Mega88PB
Filename: Bodlevel0.PNG
Filesize: 10.21 KB
Title:
Download counter: 141
Thomas.AC
Benutzer
Avatar
Gender: n/a
Age: 43
Posts: 308
Registered: 07 / 2013
Subject:

Re: PowerDownMode, Mega88PB

 · 
Posted: 11.03.2020 - 23:31  ·  #5
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ß
Mathias
Benutzer
Avatar
Gender: n/a
Location: Weingarten - Baden
Posts: 310
Registered: 07 / 2003
Subject:

Re: PowerDownMode, Mega88PB

 · 
Posted: 12.03.2020 - 21:51  ·  #6
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;
Thomas.AC
Benutzer
Avatar
Gender: n/a
Age: 43
Posts: 308
Registered: 07 / 2013
Subject:

Re: PowerDownMode, Mega88PB

 · 
Posted: 17.03.2020 - 20:03  ·  #7
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.
Mathias
Benutzer
Avatar
Gender: n/a
Location: Weingarten - Baden
Posts: 310
Registered: 07 / 2003
Subject:

Re: PowerDownMode, Mega88PB

 · 
Posted: 18.03.2020 - 21:32  ·  #8
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.
  • 1
  • 2
  • Page 1 of 2
Selected quotes for multi-quoting:   0

Registered users in this topic

Currently no registered users in this section

The statistic shows who was online during the last 5 minutes. Updated every 90 seconds.
MySQL Queries: 16 · Cache Hits: 15   142   157 · Page-Gen-Time: 0.032873s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI