1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
.include "xc.inc" ; required "boiler-plate" (BP)
;the next two lines set up the actual chip for operation - required
config __CONFIG2, POSCMOD_EC & I2C1SEL_SEC & IOL1WAY_OFF & OSCIOFNC_ON & FCKSM_CSECME & FNOSC_FRCPLL & SOSCSEL_LPSOSC & WUTSEL_FST & IESO_OFF
config __CONFIG1, WDTPS_PS1 & FWPSA_PR32 & WINDIS_OFF & FWDTEN_OFF & BKBUG_ON & GWRP_ON & GCP_ON & JTAGEN_OFF
.bss ; put the following labels in RAM
counter:
.space 2 ; a variable that takes two bytes (we won?t use
; it for now, but put here to make this a generic
; template to be used later).
stack:
.space 32 ; this will be our stack area, needed for func calls
.text ; BP (put the following data in ROM(program memory))
;because we are using the C compiler to assemble our code, we need a "_main" label
;somewhere. (There's a link step that looks for it.)
.global _main ;BP
;your functions go here
_main:
bclr CLKDIV,#8 ;BP
nop
;; --- Begin your main program below here ---
mov #0x9fff,w0
mov w0,AD1PCFG ; Set all pins to digital mode
mov #0b1111111111111110,w0
mov w0,TRISA ; set pin RA0 to output
mov #0x0000,w0
mov w0,LATA ; set pin RA0 low
call delay_100us
call setColor
call foreverLoop
wait_24cycles:
; 2 cycles for function call
repeat #17 ; 1 cycle to load and prep
nop ; 17+1 cycles to execute NOP 18 times
return ; 3 cycles for the return
wait_32cycles: ; 2
repeat #24 ; 1
nop ; 25+1 cycles = 26
return ; 3
delay_100us:
repeat #1593
nop
return
delay_1ms:
repeat #15993
nop
return
write_bit_stream:
call wait_24cycles ; 24 cycles
clr LATA ; set pin RA0 low = 1 cycle
call wait_32cycles ; 32 cycles
inc LATA ; set pin RA0 high = 1 cycle
return
write_0: ;2 cycles for function call
inc LATA ;1
repeat #3 ;1 for load
nop ;3+1=4 nop
clr LATA ;1
repeat #6 ;1 for load
nop ;1+6=7 nop
return ;3 return
write_1: ;2 cycle call
inc LATA ;1
repeat #10;1 load
nop ;1+10=11 nop
clr LATA ;1
nop ;1
return ;3 return
setColor:
;Set R
call write_1
call write_1
call write_1
call write_1
call write_1
call write_1
call write_1
call write_1
;Set G
call write_1
call write_0
call write_0
call write_1
call write_1
call write_0
call write_1
call write_1
;Set B
call write_0
call write_0
call write_0
call write_0
call write_0
call write_0
call write_0
call write_0
return
foreverLoop:
; call write_bit_stream
nop
bra foreverLoop
.end
|