endm
movlw_movwf_spbrg macro
+ if serial_spbrg > 0
+ else
+ error "unsupported clock speed (serial_spbrg)"
+ endif
movlw serial_spbrg
movwf SPBRG,0
endm
local t0scale
local t0cycles
if clock==20000 ; Fosc=20MHz, Fcy=5MHz ie 200ns
-t0scale equ 0011b ; 1:8 => 1.6us
+t0scale equ 0010b ; 1:8 => 1.6us
t0cycles equ 41250 ; * 1.6us = 66ms
endif
- if clock==2000 ; Fosc=2MHz ie 500ns, Fcy=2us
-t0scale equ 1000b ; do not use prescaler
-t0cycles equ 33000 ; * 2us = 66ms
+ if clock==5000 ; Fosc=5MHz ie 200ns, Fcy=800ns
+t0scale equ 0000b ; 1:2 => 1.6us
+t0cycles equ 41250 ; * 1.6us = 66ms
endif
- if clock==1000 ; Fosc=1MHz ie 1us, Fcy=4us
-t0scale equ 1000b ; do not use prescaler
-t0cycles equ 16500 ; * 4us = 66ms
+ if clock<=3900
+t0scale equ 1000b ; do not use prescaler ; cycle is 4/clock ms
+t0cycles equ (33 * clock) / 2 ; (4/clock) * (33*clock)/2 = 2*33 = 66ms
+ endif
+ if t0cycles > 0
+ else
+ error "unsupported clock speed (t0cycles)"
endif
movlw t0con_other | t0scale
movwf T0CON
endif
if lcount>=0
movlw (65535-t0cycles) & 0xff
- movwf hcount
+ movwf lcount
endif
endm
;----------------------------------------------------------------------
; busy-wait delay loop, originally from flasher.asm
- if clock==20000 ; each cycle 0.2us
-delay_fastloop equ 1 ; each medium loop = ~40ms
-delay_slowexp equ 2 ; 2^2 * 40ms = 160ms
- endif
- if clock==1000 ; each cycle 4us
-delay_fastloop equ 0 ; each medium loop = ~3ms
-delay_slowexp equ 6 ; 2^6 * 3ms = 192ms
- endif
-
implement_busywait_delay macro tclock
; we always leave each loop when its counter has reached 0, so on