CLOCK GENERATION AND POWER MANAGEMENT

$mod186

 

 

 

name

example_PSU_code

 

;FUNCTION:

This function reduces CPU power consumption

;

 

by dividing the CPU operating frequency by a

;

 

divisor.

 

;

SYNTAX:

extern void far power_save(int divisor);

;

INPUTS:

divisor - This variable represents F0, F1 and F2

;

 

of PWRSAV.

 

; OUTPUTS:

None

 

 

;

NOTE:

Parameters are passed on the stack as required

;

 

by high-level languages

;substitute register offset

 

 

 

 

PWRSAV

equ

xxxxH

;Power-Save Register

RFTIME

equ

xxxxH

;Refresh Interval Count

 

 

 

 

;Register

RFCON

equ

xxxxH

;Refresh Control Register

PSEN

equ

8000H

;Power-Save enable bit

data

segment public 'data'

 

FreqTable

dw 1, 4, 8, 16, 32, 64, 0, 0

 

data

ends

 

 

lib_80C186

segment public 'code'

 

 

 

assume cs:lib_80C186, ds:data

 

 

 

public _power_save

 

_power_save

proc

far

 

 

 

push

bp

;save caller's bp

 

 

mov

bp, sp

;get current top of stack

 

 

push

ax

;save registers that will

 

 

push

dx

;be modified

_divisor

equ

word ptr[bp+6]

;get parameter off the

 

 

 

 

;stack

 

 

mov

dx, RFTIME

;get current DRAM refresh

 

 

in

ax, dx

;rate

 

 

and

ax, 01ffh

;mask off unwanted bits

 

 

div

FreqTable[_divisor]

;divide refresh rate

 

 

 

 

;by _divisor

 

 

out

dx, ax

;set new refresh rate

 

 

mov

dx, PWRSAV

;select Power-Save Register

 

 

mov

ax, _divisor

;get divisor

 

 

and

ax, 7

;mask off unwanted bits

 

 

or

ax, PSEN

;set enable bit

 

 

out

dx, ax

;divide frequency

 

 

pop

dx

;restore saved registers

 

 

pop

bx

 

 

 

pop

ax

 

 

 

pop

bp

;restore caller's bp

 

 

ret

 

 

_power_save

endp

 

 

lib_80C186

ends

 

 

 

 

end

 

 

 

 

 

 

 

Example 5-1. Initializing the Power Management Unit for Power-Save Mode

5-14

Page 153
Image 153
Intel 80C186XL, 80C188XL user manual Syntax