avrcpmではソフトウエアでリフレッシュを行っている。
方法はCAS before RAS リフレッシュ
私が使っているメモリはTMS44C256 (262,144 x 4bit)なので 8msecに1回リフレッシュが必要
->RAS 9bit を8msecなので、1秒間に64000回リフレッシュが必要となる
(512回 / 8msec = 64000回/秒)
avrcpmのソフトでは、1回の割り込みで2アドレス分リフレッシュする。
このため32000回/秒の割り込みが必要。
1回あたりのリフレッシュでは、割り込み処理(call類似+rjmp)5cycle + (リフレッシュ)19cycle =24cycle
これは 1.5usec(16MHz)必要なことからavr自身は約95%の速度でエミュレーションを行うことになる
(1.5usecx32000=0.048秒)
関連部分ソース
#config.inc
#define F_CPU 16000000
#define REFR_RATE 64000
#init.asm
Init timer2. Refresh-call 8ms/512
#define REFR_PRE 8 /* prescale 1/8 */
#define REFR_CNT F_CPU / REFR_RATE /REFR_PRE
ldi temp,REFR_CNT*2
outm8 OCR2A,temp
#dram_refresh.asm
; ------------------- DRAM Refresh Interrupt --------------------
.cseg
INTERRUPT OC2Aaddr
; reti ; only for SRAM
sbis P_RAS,ram_ras ;2
reti
; CAS RAS
cbi P_CAS,ram_cas ;2 1| 1|
; 1| 1|
cbi P_RAS,ram_ras ;2 |0 1|
; |0 1|
nop ;1 |0 |0
sbi P_RAS,ram_ras ;2 |0 |0
; |0 |0
cbi P_RAS,ram_ras ;2 |0 1|
; |0 1|
sbi P_CAS,ram_cas ;2 |0 |0
; |0 |0
sbi P_RAS,ram_ras ;2 1| |0
; 1| |0
; 1| 1|
reti ;4
RAS -----+ +--------+ +----
+-----------+ +-----------+
CAS --+ +-------------
+-----------------------------+