forked from YannickTurcotte/GPSDO-YT
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserial.asm
492 lines (477 loc) · 15.2 KB
/
serial.asm
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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
;
;
;Serial routine
.equ baud=9600 ;Baud rate
.equ fosc=10000000 ;Crystal frequency
USART_Init:
in temp, pinb ;check si jumper sur pb3. Si oui on est a 4800 au lieu de 9600
andi temp, 0b00001000
cpi temp, 0
breq onesta4800
ldi r17, high(fosc/(16*baud)-1)
ldi r16, low(fosc/(16*baud)-1)
rjmp setbaudrate
onesta4800:
ldi r17, high(fosc/(16*4800)-1)
ldi r16, low(fosc/(16*4800)-1)
setbaudrate:
STORE UBRR0H, r17
STORE UBRR0L, r16
ldi r16, (1<<RXEN0)|(1<<TXEN0) |(0<<RXCIE0) ; Enable receiver and transmitter, interrupt rx disabled
STORE UCSR0B,r16
ldi r16, (0<<USBS0)|(3<<UCSZ00) ; Set frame format: 8data, 1stop bit
STORE UCSR0C,r16
ret
RX: ; Wait for data to be received
load r17,UCSR0A
sbrs r17,RXC0 ;This flag bit is set when there are unread data in the receive buffer and cleared when the receive buffer is empty. 1 = unread
rjmp RX ;donc loop ici jusqu'au temps que rxc0 vaut 1
lds r16, UDR0 ; Get and return received data from buffer
ret
TX: ; Wait for empty transmit buffer
load r17,UCSR0A ;Load into R17 from SRAM UCSR0A. The UDRE0 Flag indicates if the transmit buffer (UDR0) is ready to receive new data. If UDRE0 is one,
sbrs r17,UDRE0 ;the buffer is empty, and therefore ready to be written.. Skip next instruction If Bit Register is set
rjmp TX
STORE UDR0,r16 ; Put data (r0) into buffer, sends the data
ret
;Ramasse le nombre de satellite et le met dans sateiilteh,l
checkgpgga: ;$GPGGA pour neo 6m MAIS GNGGA sur neo 8M Donc je regarde pour seulement GGA
wdr
rcall rx
cpi temp, $47 ;G
brne checkgpgga
rcall rx
cpi temp, $47 ;G
brne checkgpgga
rcall rx
cpi temp, $41 ;A
brne checkgpgga
;ici on a detecter $GPGGA on doit rammaser le nombre de satellite
clr r18
kjkj: ;on compte 7 virgules. Ensuite on lit le nombre de satellites.
rcall rx
cpi temp, $2C ;,
brne kjkj
inc r18
cpi r18, $07
brne kjkj ;compte 7 virgules
;ici s'en vienne les 2 nombres ascii. Exemple 31, 32 pour 12.
;Addition de code pour gerer les gps module qui envois 9 au lieu de 09.
rcall rx
sts satelliteh, temp
rcall rx
sts satellitel, temp ;ici le nombre de satellites est en ascii dans satelliteh:satellitel exemple 31:32 pour afficher 12.
cpi temp, $2c ;regarde si nous avous recu 9 virgule au lieu de 09
breq pasmoduleublox
ret
pasmoduleublox:
lds temp, satelliteh ;prend 9
sts satellitel, temp ;on le met dans le low
ldi temp, $30
sts satelliteh, temp ;et on met 30 dans le high pour afficher le 0 ---- > 09
ret
;*********************************************************************************************************
;*********************************************************************************************************
affichesatellite:
load r16, UCSR0A ;regarde si ya de quoi qui a été recu par le serial
sbrs r16, RXC0 ;skip if bit in register is set
ret ;rxc0 est a 0 on a rien recu
;on a recu de quoi sur le serial
lds temp, affichesatelliteflag
cpi temp, $01
breq onpeut
ret
onpeut:
adiw yh:yl, $01 ;incremente le compteur du wait car on pert ici une seconde.
rcall checkgpgga ;on ramasse le nombre de satellite
rcall posi2
ldi r31,high(data30*2) ;sat locked =
ldi r30,low(data30*2)
rcall message
lds temp, satelliteh
rcall afficheascii
rcall tx
lds temp, satellitel
rcall afficheascii
rcall tx
rcall nextline
call SatelliteLedDriver
ret
;*********************************************************************************************************
;*********************************************************************************************************
;S=12
affichesatellite2:
load r16, UCSR0A ;regarde si ya de quoi qui a été recu par le serial
sbrs r16, RXC0
ret ;rxc0 est a 0 on a rien recu
rcall checkgpgga ;on ramasse le nombre de satellite
rcall posisat
ldi temp, $53 ; S
rcall afficheascii
call tx
ldi temp, $3d ; =
rcall afficheascii
call tx
lds temp, satelliteh
rcall afficheascii
call tx
lds temp, satellitel
rcall afficheascii
call tx
ldi temp, $2c ;,
call tx
call SatelliteLedDriver
ret
;*********************************************************************************************************
;*********************************************************************************************************
SatelliteLedDriver:
;dois comparer si on a plus que 3 sat et allumer le led sinon le fermer..
lds temp, satelliteh ;39 2c
subi temp, $30
lsl temp
lsl temp
lsl temp
lsl temp
lds r17, satellitel
subi r17, $30
add temp, r17
cpi temp, $3
brge onallumeleled22
;sinon on ferme le led
call SatLedOff
ret
onallumeleled22:
call SatLedOn
ret
;*********************************************************************************************************
;*********************************************************************************************************
;*********************************************************************************************************
;*********************************************************************************************************
;$GPGGA,hhmmss.ss,llll.ll,a,yyyyy.yy,a,x,xx,x.x,x.x,M,x.x,M,x.x,xxxx*hh
afficheheureposition:
;affiche heure pour 10 secondes
rcall videecran
call nextline
load r16, UCSR0A ;regarde si ya de quoi qui a été recu par le serial
sbrs r16, RXC0 ;skip if bit in register is set
rjmp nosat ;rxc0 est a 0 on a rien recu pas de signal
ldi r26, 10
afseconde:
call nextline
rcall checkgpggahp ;ramasse les valeur (heure)
rcall posi1
lds temp, heureh
rcall afficheascii
call tx
lds temp, heurel
rcall afficheascii
call tx
ldi temp, $3A ; :
rcall afficheascii
call tx
lds temp, minuteh
rcall afficheascii
call tx
lds temp, minutel
rcall afficheascii
call tx
ldi temp, $3A ; :
rcall afficheascii
call tx
lds temp, secondeh
rcall afficheascii
call tx
lds temp, secondel
rcall afficheascii
call tx
rcall espace
call espaceserial
ldi temp, $55 ;U
rcall afficheascii
call tx
ldi temp, $54 ;T
rcall afficheascii
call tx
ldi temp, $43 ;C
rcall afficheascii
call tx
attendprochaineseconde:
load r16, UCSR0A ;regarde si ya de quoi qui a été recu par le serial
sbrs r16, RXC0 ;skip if bit in register is set
rjmp attendprochaineseconde ;rxc0 est a 0 on a rien recu
dec r26
brne afseconde
;le temps vien d'etre afficher 10 seconde maintenant latitude et longitude
rcall videecran
call nextline
ldi r26, 10 ;pour 10 seconde
debutdeaffichagelatitudelongitude:
;affiche position pour 10 secondes
rcall ramassegga ;ramasse la string gga au complet incluant l'heure
rcall posi1
call nextline
ldi zh, high(gga) ;adresse de RAM $240 dans Z
ldi Zl, low(gga)
ldi r18, 2 ;on passe 2 virgule pour se rendre a la latitude. On passe par dessus l'heure
aflatitude:
ld r0, z+ ;charge r0 avec le contenu de l'adresse que pointe z
mov temp, r0 ;
cpi temp, $2c ;compare avec virgule
brne aflatitude
dec r18
brne aflatitude
;debut latitude
ld r0, z+ ;4
mov temp, r0 ;
rcall afficheascii
call tx
ld r0, z+ ;6
mov temp, r0 ;
rcall afficheascii
call tx
ldi temp, $27 ;`
rcall afficheascii
call tx
suitelatitude:
ld r0, z+ ;
mov temp, r0 ;compare avec virgule.... pourquoi ? parce que dans différent module il n'y a pas toujours le meme nombres de chiffre apres le point.
cpi temp, $2c ;,
breq emisphere
rcall afficheascii
call tx
rjmp suitelatitude
emisphere:
rcall espace
call espaceserial
ld r0, z+ ;on ecris N ou S
mov temp, r0 ;
rcall afficheascii
call tx
rcall posi2
call nextline
ld r0, z+ ;passe virgule
ld r0, z+
mov temp, r0 ;
rcall afficheascii ;0
call tx
ld r0, z+
mov temp, r0
rcall afficheascii ;7
call tx
ld r0, z+
mov temp, r0
rcall afficheascii ;2
call tx
ldi temp, $27 ;`
rcall afficheascii
call tx
nextline2:
ld r0, z+ ;on affiche le reste jusqua la virgule.
mov temp, r0
cpi temp, $2c
breq nextlinefini
rcall afficheascii
call tx
rjmp nextline2
nextlinefini:
rcall espace
call espaceserial
ld r0, z+ ;W ou E
mov temp, r0
rcall afficheascii
call tx
call nextline
dec r26 ;decremene 26 et on recommence sinon fini
brne debutdeaffichagelatitudelongitude2
ret
debutdeaffichagelatitudelongitude2:
rjmp debutdeaffichagelatitudelongitude
nosat:
call nextline
rcall posi1
ldi r31,high(data36*2) ;P 1 1 sec
ldi r30,low(data36*2)
rcall message
ret
;****************************************************************************************************************************************************************************************
;****************************************************************************************************************************************************************************************
;****************************************************************************************************************************************************************************************
;check heure seulement
checkgpggahp: ;$GPGGA pour neo 6m MAIS GNGGA sur neo 8M Donc je regarde pour seulement GGA
;checkgga heure position et store dans memoire heure et position
;$xxGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47
wdr
rcall rx
cpi temp, $47 ;G
brne checkgpggahp
rcall rx
cpi temp, $47 ;G
brne checkgpggahp
rcall rx
cpi temp, $41 ;A
brne checkgpggahp
clr r18
kjkj1: ;on compte 1 virgules.
rcall rx
cpi temp, $2C ;,
brne kjkj1
inc r18
cpi r18, $01
brne kjkj1 ;compte 1 virgules
;ici s'en vienne les 6 nombres ascii. Exemple 31, 32 pour 12.
rcall rx
sts heureh, temp
rcall rx
sts heurel, temp ;
rcall rx
sts minuteh, temp
rcall rx
sts minutel, temp ;
rcall rx
sts secondeh, temp
rcall rx
sts secondel, temp ;
ret
;****************************************************************************************************************************************************************************************
;****************************************************************************************************************************************************************************************
;****************************************************************************************************************************************************************************************
ramassegga: ;$ramasse toute la string de gga. et la met dans $240 +
wdr
rcall rx
cpi temp, $47 ;G
brne ramassegga
rcall rx
cpi temp, $47 ;G
brne ramassegga
rcall rx
cpi temp, $41 ;A
brne ramassegga
; rcall rx ;passe la virgule
;ici on a detecter $GPGGA on doit rammaser la string
ldi zh, high(gga) ;adresse de RAM $240 dans Z
ldi Zl, low(gga)
prochainbytes:
rcall rx
mov r0,temp
st z+, R0 ;R0 dans ce que pointe Z ici $240 en montant
cpi temp, $24 ;regarde si rx recoit $. Si oui = veut dire qu'on a ramasser gga au complet
breq donegga
rjmp prochainbytes
donegga:
ret
; 46`19.81427 m. N
;**********************************************************************************************
;**********************************************************************************************
;**********************************************************************************************
affichenombreSerial: ;affiche un nombre DCB. Exemple si 0x17 est dans temp. 17 sera affiché sur port serie
push temp ;17 ;On additionne 30 sur lsb et msb donc 17 = 31 + 37
swap temp ;71
andi temp, $0F ;1
subi temp, -$30 ;31
rcall tx
pop temp ;17
andi temp, $0F
subi temp, -$30 ;31
rcall tx
ret
;***************************************************************************************
affichenombreSerialhigh: ;affiche un nombre DCB. Exemple si 0x17 est dans temp. 17 sera affiché sur port serie
push temp
swap temp ;71
andi temp, $0F ;1
subi temp, -$30 ;31
rcall tx
pop temp
ret
affichenombreSeriallow:
push temp
andi temp, $0F
subi temp, -$30 ;31
rcall tx
pop temp
ret
;***************************************************************************************
messageserial:
lpm ;lpm = load program memory. Le contenu de l'adresse pointé par Z se retrouve dans R0
mov temp, r0 ;comparons r0 avec 04 pour vois si le message est à la fin
cpi temp, $04
breq finmessageserial
mov temp, r0 ;Il faut séparer la valeur lu, exemple:(41) en 40 et 10 pour envoyer à l'afficheur
rcall tx
adiw ZH:ZL,1 ;incremente zh,zl et va relire l'addresse suivante
rjmp messageserial
finmessageserial:
ret
;************************************************************************************
affichegate1ksserial:
ldi r31,high(data37*2) ;Gate 1000s
ldi r30,low(data37*2)
rcall messageserial
ldi temp, $2c ;,
rcall tx
ret
;***************************************************************************************
affichegate10ksserial:
ldi r31,high(data34*2) ;Gate 10000s
ldi r30,low(data34*2)
rcall messageserial
ldi temp, $2c ;,
rcall tx
ret
;***************************************************************************************
affichesatellite2serial:
load r16, UCSR0A ;regarde si ya de quoi qui a été recu par le serial
sbrs r16, RXC0
ret ;rxc0 est a 0 on a rien recu
rcall checkgpgga ;on ramasse le nombre de satellite
ldi temp, $53 ; S
rcall tx
ldi temp, $3d ; =
rcall tx
lds temp, satelliteh
rcall tx
lds temp, satellitel
rcall tx
ldi temp, $2c ;,
rcall tx
ret
;**************************************************************************************
nextline:
ldi temp, $d
rcall tx
ldi temp, $a
rcall tx
ret
;**************************** affichememoireserial *************************************
;affiche le contenu tel quel. exemple si $3a est dans temp 3a sera afficher
affichememoireserial:
push temp
swap temp ;exemple 3A
andi temp, $0f ;on garde le 3
ldi r31,high(hexa*2) ;pointe l'addresse le la database dans R0
ldi r30,low(hexa*2) ; l'addresse de mémoire;
add ZL, temp ;augmente l'adresse pour pointer le bon chiffre (r31 et r30 constitue zh et zl)
brcc okpasdedepassementqserial ;(branch if carry est 0) si le carry est a 1 (il y a une retenue) = plus que FF on incrémente donc zh. Sinon il passe et laisse zl normal
inc zh
okpasdedepassementqserial:
lpm
mov temp,r0
rcall tx
pop temp
andi temp, $0f ;on garde le 3
ldi r31,high(hexa*2) ;pointe l'addresse le la database dans R0
ldi r30,low(hexa*2) ; l'addresse de mémoire;
add ZL, temp ;augmente l'adresse pour pointer le bon chiffre (r31 et r30 constitue zl et zh)
brcc okpasdedepassement7qserial ;(branch if carry est 0) si le carry est a 1 (il y a une retenue) = plus que FF on incrémente donc zh. Sinon il passe et laisse zl normal
inc zh
okpasdedepassement7qserial:
lpm
mov temp,r0
rcall tx ;3 est afficher
ret
espaceserial:
push temp
ldi temp, $20
call tx
pop temp
ret