Bikelight2.asm


1
.include "m16def.inc"  
2
3
.cseg
4
.ORG $2A
5
6
;Register_Usage----------------------------------------------------------
7
;.def  Temp1  =R16
8
;.def  Temp2  =R17
9
;.def  Temp3  =R18
10
;.def  Sevseg  =R19
11
;.def  Flags  =R20
12
;.def  TWIReg  =R21
13
14
;------------------------------------------------------------------------
15
;------------------------------------------------------------------------
16
;Reset_and_interrupt_vector     ;VNr.  Beschreibung
17
;
18
  rjmp  MAIN  ;Reset Handler
19
20
;Start,_Power_ON,_Reset
21
22
23
MAIN:
24
  ldi    r16,low(RAMEND)
25
  out    SPL,r16
26
  ldi    r16,high(RAMEND)
27
  out    SPH,r16
28
  
29
  ldi   r21,0B11100001
30
  out    DDRC,r21
31
  ldi   r21,0B00000000
32
  out   PORTC,r21
33
  ldi   r21,0xff
34
  out    DDRA,r21;"
35
mainloop:
36
  ldi    r21,0B00000000  ;Port-B I/O Directions
37
  out    DDRB,r21  ; "   
38
  
39
  ldi    r21,0B11100011  ;Port-D I/O Directions
40
  out    DDRD,r21  ; "              "
41
  ldi    r20,0B00000000  ;Initialize Flag register
42
  ldi    r21,0B01101111
43
  out    MCUCR,r21  ;INT1 and INT0 configured for rising edge / MCU in Power down
44
  ldi    r21,0B01000000
45
  out    MCUCSR,r21  ;INT2 configured for rising edge
46
  ldi    r21,0B11100000
47
  sei
48
  out    GICR,r21  ;All external interrupt sources enabled
49
  RCALL   COMMU
50
  out   PORTA,r23
51
endless:
52
  RJMP   endless
53
54
error:
55
56
  POP   R22
57
  POP    R21
58
  out    PORTA,r23
59
  RET
60
  
61
COMMU:
62
  PUSH   R21
63
  PUSH  R22  
64
  ldi    r22,0x22    ;Configure Bit Rate
65
  out    TWBR,r22    ;in Bitrate register
66
  ldi    r22,0B00000001  ;Configure Prescaler
67
  out   TWSR, r22    ;in Status register
68
  ldi    r22,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)|(1<<TWEA)
69
  out    TWCR,r22    ;Configure and enable I²C Interface / Bit5-Start
70
  
71
  out    PORTA,r23
72
  
73
wait1:
74
  in    r21,TWCR  ;Wait for TWINT flag set
75
  sbrs  r21,TWINT  ; "              "
76
  rjmp  wait1  ;
77
  in    r21,TWSR  ;read TW-Status register
78
  andi  r21,0B11111000  ;Check if START status
79
  cpi    r21,0B00001000  ; "               "
80
  brne  error  ;jump to error
81
  ldi   r17, 0B10010000
82
  out    TWDR,r17  ;DS2745's slave adress + write bit
83
  ldi   r17, (1<<TWINT)|(1<<TWEN)|(1<<TWEA) 
84
  out    TWCR,r17  ;Clear TWINT flag for transfering
85
86
wait2:
87
  in    r21,TWCR  ;Wait for TWINT flag set
88
  sbrs  r21,TWINT  ; "              "
89
  rjmp  wait2  ;
90
  ldi    r23,0b11000000
91
  out   porta,r23
92
  in    r21,TWSR  ;read TW-Status register
93
  andi  r21,0B11111000  ;Check if ACK was received
94
  cpi    r21,0B01000000  ; "                   "
95
  brne  error1  ;
96
97
  ldi   r17, 0x0D
98
  out    TWDR,r17  ;Memory Adress voltage MSB
99
  ldi   r17, 0B11000100
100
  out    TWCR,r17  ;Clear TWINT flag for transfering
101
  ldi    r23,0b11100010
102
  out    PORTA,r23
103
wait3:
104
  in    r21,TWCR  ;Wait for TWINT flag set
105
  sbrs  r21,TWINT  ; "              "
106
  rjmp  wait3  ;
107
  in    r21,TWSR  ;read TW-Status register
108
  andi  r21,0B11111000  ;Check if Databyte ACK was received
109
  cpi    r21,0B01010000  ; "                   "
110
  brne  error1  ;
111
  ldi    r23,0b11110000
112
  out    PORTA,r23
113
114
wait4: 
115
  ldi   r17,0B10100101;
116
  out    TWCR,r17  ;Configure for repeated start
117
  in    r21,TWCR  ;Wait for TWINT flag set
118
  sbrs  r21,TWINT  ; "                "
119
  rjmp  wait4  ;
120
121
  in    r21,TWSR  ;read TW-Status register
122
  andi  r21,0B11111000  ;Check if START status
123
  cpi    r21,0B00001000  ; "               "
124
  brne  error1  ;jump to error
125
126
  ldi   r17, 0B10010001
127
  out    TWDR,r17  ;DS2745's slave adress + read bit
128
  ldi   r17, 0B10000100
129
  out    TWCR,r17  ;Clear TWINT flag for transfering
130
  ldi    r23,0b11111000
131
  out    PORTA,r23
132
wait5:
133
  in    r21,TWCR  ;Wait for TWINT flag set
134
  sbrs  r21,TWINT  ; "              "
135
  rjmp  wait5  ;
136
  in    r21,TWSR  ;read TW-Status register
137
  andi  r21,0B11111000  ;Check if ACK was received
138
  cpi    r21,0B01100000  ; "                   "
139
  brne  error1  ;
140
141
  in    r22,TWDR  ;Voltage value stored in r22
142
143
  ldi   r17, 0B10000001
144
  out    TWCR,r17  ;Configure for no acknowledge
145
  ldi    r23,0b11111100
146
  out    PORTA,r23
147
wait6:
148
  in    r21,TWCR  ;wait for TWINT flag set
149
  sbrs  r21,TWINT  ;
150
  rjmp  wait6  ;
151
  in    r21,TWSR  ;read TW-Status register
152
  andi  r21,0B11111000  ;Check if Acknowledge was received
153
  cpi    r21,0B01010000  ;Status register must contain $50
154
  brne  error1  ;
155
  mov   r17,r22;
156
  ldi    r23,0b11111110
157
  out    PORTA,r23
158
  POP    r21
159
  pop    r22
160
  ret
161
162
error1:
163
164
  POP   R22
165
  POP    R21
166
  out    PORTA,r23
167
  RET