Bonjour,

je poste un nouveau topic dans le salon assembleur, ayant déjà un topic d'ouvert pour un sujet dans le domaine du C++ dérivant vers l'assembleur.

Pour en connaitre le sujet : envoi trame via liaison série

Le programme que je vous présente est intégré dans un module esclave, répondant, en théorie, à son maitre un PC, via RS485.

Je dois faire une communication entre eux : PC <---> module.

Je dois faire une tram requête en C++ pour que ce module la comprenne et me réponde. Je suis bloqué à ce niveau là. Dans ce programme se trouve les clés à mon problème, or je ne comprend pas vraiment le langage assembleur.

Merci de m'apporter de l'aide.

Le programme :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
;******************************************************************************
;     PROGRAMATION  DU  8031  POUR  LA  MISE  EN RESEAU  DE  PHOTOCOPIEUSES   *
;                           protocole    JBUS                                 *
;******************************************************************************
 
                        cpu     "8051.TBL"
                        hof     "INT8"
                        incl    "REGDAL.ASM"
 
                        org     0000H           ;reset
                        ljmp    INIT
 
                        org     0BH             ;interruption Timer 0
                        ljmp    IT_TIMER0
 
                        org     23H             ;interruption du port s‚rie
                        ljmp    IT_SERIE
 
 
;******************************************************************************
;           declaration des registres de travail                              *
;******************************************************************************
 
        NB_COPIEL:      equ     30H           ;nbre de photocopies,val basse
        NB_COPIEH:      equ     31H           ;val haute
 
        ETAPER_L:       equ     32H           ;etape grafcet reception
        ETAPER_H:       equ     33H
 
        ETAPET_L:       equ     34H           ;etape grafcet emission
        ETAPET_H:       equ     35H
 
        TEMPO0:         equ     36H
        TEMPO1:         equ     37H
        TEMPO2:         equ     38H
 
        ADRL:           equ     39H           ;adresse station
        ADRH:           equ     3AH
 
        CLIGNOT1:       equ     3BH
        CLIGNOT2:       equ     3CH
 
;                registres bits
 
        ETAT0:          equ     00H
        ETAT1:          equ     01H
        ENVOI_REP:      equ     02H
        AT_RET:         equ     03H
        AUTO_COPIE:     equ     04H
        TRANS:          equ     05H
        CLIGNOT:        equ     06H
 
;                I/O
 
        E_DEF:          equ     P3_3     ;( P3_3)
        E_TOP:          equ     P3_2     ;( P3_2)
        S_RELAIS:       equ     P1_2
        S_LED:          equ     P1_5
        S_TXD:          equ     P1_7
        S_RXD:          equ     P1_6
 
 
 
;******************************************************************************
;                INITIALISATION REGISTRES                                     *
;******************************************************************************
 
                        org      100h
 
        INIT:           mov      A,#50H         ;Validation du Timer 0
                        mov      TCON,A         ;Validation du Timer 1
 
                        mov      A,#22H         ;  Timer0 en mode 2
                        mov      TMOD,A         ;  Timer1 en mode 2
 
                        mov      A,#00H         ;chargement de TH0 pour avoir une
                        mov      TH0,A          ;interruption pour 0.278 ms
                                                ; (256*12/11.059)
 
                        mov      A,#0FDH        ;chargement de TH1 pour avoir une
                        mov      TH1,A          ;transmission … 9600 bauds
                                                ;0FE pour 7,3728  Mhz
                                                ;0FD pour 11,059  Mhz
 
                        mov      A,#0D0H        ;liaison serie mode 3 (1 bit START,8 bits
                        mov      SCON,A         ;DONNEES,1 bit PARITE,1 bit STOP )
 
                        clr      S_TXD           ; RS485 en reception
                        clr      S_RXD
 
                        mov      ETAPER_L,#{LOW ETAPER_0}
                        mov      ETAPER_H,#{HIGH ETAPER_0}
 
                        mov      ETAPET_L,#{LOW ETAPET_0}
                        mov      ETAPET_H,#{HIGH ETAPET_0}
 
 
                        mov      A,#92H         ; Validation Interruption s‚rie
                        mov      IE,A           ; et timer 0
 
                        mov      NB_COPIEL,#00H ; initialise nbre de photocopies
                        mov      NB_COPIEH,#00H
 
                        mov      CLIGNOT1,#05H
                        setb     AUTO_COPIE
 
;******************************************************************************
;                          PROGRAMME PRINCIPAL                                *
;******************************************************************************
 
        PRGP:           mov      DPTR,#0FFFFH     ;lecture de
                        movx     A,@DPTR          ; l'adresse
                        acall    HEX_ASCII
                        mov      ADRL,DPL         ; recup‚ration adresse basse
                        mov      ADRH,DPH
 
                        mov      C,AUTO_COPIE
                        mov      S_RELAIS,C
 
                        jnb      E_TOP,sst1
                        clr      ETAT1
                        mov      TEMPO1,#28H
                        mov      A,TEMPO0
                        jnz      sst3
                        setb     ETAT0
                        sjmp     sst2
        sst1:           mov      TEMPO0,#80H
                        mov      A,TEMPO1
                        jnz      sst3
                        setb     ETAT1
        sst2:           jnb      ETAT0,sst3
                        jnb      ETAT1,sst3
                        clr      ETAT0
                        clr      ETAT1
                        mov      DPH,NB_COPIEH
                        mov      DPL,NB_COPIEL
                        inc      DPTR
                        mov      NB_COPIEH,DPH
                        mov      NB_COPIEL,DPL
 
        sst3:           jb       AT_RET,cont5          ; Attente de retournement en cours
                        jnb      ENVOI_REP,cont4       ; Emission d'une r‚ponse
                        clr      ENVOI_REP
                        setb     AT_RET
                        mov      TEMPO2,#20H
 
        cont5:          mov       A,TEMPO2
                        cjne      A,#00,cont4
                        clr       AT_RET
                        setb      TRANS
                        setb      S_TXD                  ; RS485 en ‚mission
                        setb      S_RXD
                        mov       A,#"="
                        acall     PARITE
                        mov       SBUF,A                ; Envoi du premier caractŠre
 
; Conditions d'allumage de la LED
 
        cont4:          mov       c,E_TOP
                        cpl       c                      ; Entree TOP
 
                        orl       c,TRANS                ; Transmission
 
                        jb        E_DEF,cont7            ; Entr‚e defaut
                        orl       c,clignot
 
        cont7:          jb        AUTO_COPIE,cont8       ; Autorisation copie
                        orl       c,clignot
 
        cont8:                            ;   ( rien )
                        mov       S_LED,c
                        sjmp      PRGP
 
;******************************************************************************
;   GESTION DES INTERRUPTIONS SERIES  (RI ET TI)                              *
;******************************************************************************
 
        IT_SERIE:       push     ACC
                        push     PSW
                        push     REG0
                        push     REG1
                        push     DPH
                        push     DPL
                        jb       TI,IT_TRS
                        mov      A,SBUF
                        clr      RI
                        mov      DPH,ETAPER_H
                        mov      DPL,ETAPER_L
                        acall    APPEL_ETAPE
                        sjmp     FIN_IT_SERIE
 
        IT_TRS:         clr      TI                  ; gestion de l'interruption
                        mov      DPH,ETAPET_H
                        mov      DPL,ETAPET_L
                        acall    APPEL_ETAPE
 
        FIN_IT_SERIE:   pop      DPL
                        pop      DPH
                        pop      REG1
                        pop      REG0
                        pop      PSW
                        pop      ACC
                        reti
 
        APPEL_ETAPE:    push     ACC
                        mov      A,#00H                    ;appel d'‚tapes
                        jmp      @A+DPTR
 
 
;******************************************************************************
 
 
        ETAPER_0:       pop      ACC
                        cjne     A,#"?",SAUTR
                        mov      ETAPER_L,#{LOW ETAPER_1}
                        mov      ETAPER_H,#{HIGH ETAPER_1}
                        ret
 
        ETAPER_1:       pop      ACC
                        cjne     A,ADRH,IDENTIF                  ;Test d‚but adresse
                        mov      ETAPER_L,#{LOW ETAPER_2}
                        mov      ETAPER_H,#{HIGH ETAPER_2}
                        ret
         IDENTIF:       cjne     A,#"*",SAUTR
                        mov      ETAPER_L,#{LOW ETAPER_30}
                        mov      ETAPER_H,#{HIGH ETAPER_30}
                        ret
 
        ETAPER_2:       pop      ACC
                        cjne     A,ADRL,SAUTR                   ;Test fin de l'adresse
                        mov      ETAPER_L,#{LOW ETAPER_3}
                        mov      ETAPER_H,#{HIGH ETAPER_3}
                        ret
 
        ETAPER_3:       pop      ACC
                        cjne     A,#"0",F1
                        mov      ETAPER_L,#{LOW ETAPER_4}        ;Fonction 0
                        mov      ETAPER_H,#{HIGH ETAPER_4}       ;Lecture ‚tat
                        ret
        F1:             cjne     A,#"1",F2
                        mov      ETAPER_L,#{LOW ETAPER_10}       ;Fonction 1
                        mov      ETAPER_H,#{HIGH ETAPER_10}      ;Raz compteur
                        ret
        F2:             cjne     A,#"2",F3
                        mov      ETAPER_L,#{LOW ETAPER_20}       ;Fonction 2
                        mov      ETAPER_H,#{HIGH ETAPER_20}      ;Autorisation copie
                        RET
        F3:             cjne     A,#"3",SAUTR
                        mov      ETAPER_L,#{LOW ETAPER_21}       ;Fonction 3
                        mov      ETAPER_H,#{HIGH ETAPER_21}      ;Interdiction copie
                        ret
 
        SAUTR:          mov      ETAPER_L,#{LOW ETAPER_0}    ;initialisation des ‚tapes
                        mov      ETAPER_H,#{HIGH ETAPER_0}
                        ret
 
 
;******************************************************************************
;*       Fonction 0 = Envoi de l'‚tat du photocopieur                         *
;******************************************************************************
 
        ETAPER_4:       pop      ACC
                        cjne     A,#0DH,SAUTR                     ;Attend  CR
                        setb     ENVOI_REP
                        mov      ETAPET_L,#{LOW ETAPET_0}
                        mov      ETAPET_H,#{HIGH ETAPET_0}
                        sjmp     SAUTR
 
        ETAPER_10:      pop      ACC
                        cjne     A,#0DH,SAUTR                     ;Attend  CR
                        mov      NB_COPIEH,#00H
                        mov      NB_COPIEL,#00H
                        setb     ENVOI_REP
                        mov      ETAPET_L,#{LOW ETAPET_0}
                        mov      ETAPET_H,#{HIGH ETAPET_0}
                        sjmp     SAUTR
 
        ETAPER_20:      pop      ACC
                        cjne     A,#0DH,SAUTR                     ;Attend  CR
                        mov      NB_COPIEH,#00H
                        mov      NB_COPIEL,#00H
                        setb     AUTO_COPIE
                        setb     ENVOI_REP
                        mov      ETAPET_L,#{LOW ETAPET_0}
                        mov      ETAPET_H,#{HIGH ETAPET_0}
                        sjmp     SAUTR
 
        ETAPER_21:      pop      ACC
                        cjne     A,#0DH,SAUTR                     ;Attend  CR
                        mov      NB_COPIEH,#00H
                        mov      NB_COPIEL,#00H
                        clr      AUTO_COPIE
                        setb     ENVOI_REP
                        mov      ETAPET_L,#{LOW ETAPET_0}
                        mov      ETAPET_H,#{HIGH ETAPET_0}
                        sjmp     SAUTR
 
 
 
        ETAPER_30:      pop      ACC
                        cjne     A,#0DH,SAUTR                     ;Attend  CR
                        mov      ETAPET_L,#{LOW ETAPET_20}
                        mov      ETAPET_H,#{HIGH ETAPET_20}
                        setb     ENVOI_REP
                        sjmp     SAUTR
 
        ETAPET_0:       pop      ACC
                        mov      A,ADRH                      ;adresse station pds fort
                        acall    PARITE
                        mov      SBUF,A
                        mov      ETAPET_L,#{LOW ETAPET_1}
                        mov      ETAPET_H,#{HIGH ETAPET_1}
                        ret
 
        ETAPET_1:       pop      ACC
                        mov      A,ADRL                       ;adresse station pds faible
                        acall    PARITE
                        mov      SBUF,A
                        mov      ETAPET_L,#{LOW ETAPET_2}
                        mov      ETAPET_H,#{HIGH ETAPET_2}
                        ret
 
        ETAPET_2:       pop      ACC
                        jnb      E_DEF,SET
                        mov      A,#7FH
                        anl      NB_COPIEH,A   ; mise … 0 du 16Š bit
                        ljmp     APRES
        SET:            mov      A,#80H
                        orl      NB_COPIEH,A   ; mise … 1 du 16Š bit
        APRES:          jnb      AUTO_COPIE,SET2
                        mov      A,#0BFH
                        anl      NB_COPIEH,A   ; mise … 0 du 16Š bit
                        ljmp     APRES2
        SET2:           mov      A,#40H
                        orl      NB_COPIEH,A   ; mise … 1 du 15Š bit
        APRES2:         mov      A,NB_COPIEH
                        acall    HEX_ASCII
                        mov      A,DPH
                        acall    PARITE
                        mov      SBUF,A
                        mov      ETAPET_L,#{LOW ETAPET_3}
                        mov      ETAPET_H,#{HIGH ETAPET_3}
                        ret
 
        ETAPET_3:       pop      ACC
                        mov      A,NB_COPIEH                  ;valeur compteur pds fort
                        acall    HEX_ASCII
                        mov      A,DPL
                        acall    PARITE
                        mov      SBUF,A
                        mov      ETAPET_L,#{LOW ETAPET_4}
                        mov      ETAPET_H,#{HIGH ETAPET_4}
                        ret
 
        ETAPET_4:       pop      ACC
                        mov      A,NB_COPIEL                  ;valeur compteur pds faible
                        acall    HEX_ASCII
                        mov      A,DPH
                        acall    PARITE
                        mov      SBUF,A
                        mov      ETAPET_L,#{LOW ETAPET_5}
                        mov      ETAPET_H,#{HIGH ETAPET_5}
                        ret
 
        ETAPET_5:       pop      ACC
                        mov      A,NB_COPIEL                  ;valeur compteur pds faible
                        acall    HEX_ASCII
                        mov      A,DPL
                        acall    PARITE
                        mov      SBUF,A
                        mov      ETAPET_L,#{LOW ETAPET_6}
                        mov      ETAPET_H,#{HIGH ETAPET_6}
                        ret
 
        ETAPET_6:       pop      ACC
                        mov      A,#0DH                       ;envoi CR
                        acall    PARITE
                        mov      SBUF,A
                        mov      ETAPET_L,#{LOW ETAPET_7}
                        mov      ETAPET_H,#{HIGH ETAPET_7}
                        ret
 
        ETAPET_7:       pop     ACC
                        clr     S_TXD                         ; RS485 en reception
                        clr     S_RXD
                        clr     TRANS
                        ret
 
        ETAPET_20:      pop      ACC
                        mov      A,ADRH                      ;adresse station pds fort
                        acall    PARITE
                        mov      SBUF,A
                        mov      ETAPET_L,#{LOW ETAPET_21}
                        mov      ETAPET_H,#{HIGH ETAPET_21}
                        ret
 
        ETAPET_21:      pop      ACC
                        mov      A,ADRL                       ;adresse station pds faible
                        acall    PARITE
                        mov      SBUF,A
                        mov      ETAPET_L,#{LOW ETAPET_22}
                        mov      ETAPET_H,#{HIGH ETAPET_22}
                        ret
 
        ETAPET_22:      pop      ACC
                        mov      A,#0DH                       ;envoi CR
                        acall    PARITE
                        mov      SBUF,A
                        mov      ETAPET_L,#{LOW ETAPET_23}
                        mov      ETAPET_H,#{HIGH ETAPET_23}
                        ret
 
        ETAPET_23:      pop     ACC
                        clr     S_TXD                         ; RS485 en reception
                        clr     S_RXD
                        clr     TRANS
                        ret
 
;*****************************************************************************
;*                        CALCUL DE PARITE                                   *
;*****************************************************************************
 
 
        PARITE:         mov     C,PSW0                       ;calcul de parite paire
                        cpl     C                            ;parite paire -> impaire
                        mov     TB8,C                        ;mise de la parite ds TB8
                        ret
 
;*****************************************************************************
;*                   CONVERSION  8 Bits vers Hexa Ascii
;*                    Entr‚e = ACC      retour : DPTR
;*****************************************************************************
 
 
        HEX_ASCII:      push    ACC
                        anl     A,#0FH                ; partie basse
                        acall   HEX_ASCII4
                        mov     DPL,A
                        pop     ACC
                        swap    A
                        anl     A,#0FH                ; partie haute
                        acall   HEX_ASCII4
                        mov     DPH,A
                        ret
 
        HEX_ASCII4:     cjne    A,#0AH,TEST
        TEST:           jc      T2
                        add     A,#37H
                        ret
        T2:             add     A,#30H
                        ret
 
;*****************************************************************************
;*                       INTERRUPTION TIMER 0
;*****************************************************************************
 
 
        IT_TIMER0:      push     ACC
                        push     PSW
                        mov      A,TEMPO0
                        jz       STI0
                        dec      TEMPO0
        STI0:           mov      A,TEMPO1
                        jz       STI1
                        dec      TEMPO1
        STI1:           mov      A,TEMPO2
                        jz       STI2
                        dec      TEMPO2
        STI2:
                        djnz     CLIGNOT2,STI5
                        djnz     CLIGNOT1,STI5
                        mov      C,CLIGNOT
                        cpl      C
                        mov      CLIGNOT,C
                        mov      CLIGNOT1,#05H
 
        STI5:           pop      PSW
                        pop      ACC
                        retI
 
        VERSION:        dfb      "V0.1  02/09/91"
Je me trompe peut être, mais il semblerait que l'esclave attende en premier caractère un "?" (ETAPER_0 dans le programme).