aboutsummaryrefslogtreecommitdiffstats
path: root/Lab2A.X/Lab2A.s
blob: 407def80041ab098c635301a06f9cf7a053bf8d6 (plain) (blame)
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