xmaz57000
Messages postés11Date d'inscriptionlundi 20 juin 2005StatutMembreDernière intervention13 octobre 2005
-
12 oct. 2005 à 09:32
xmaz57000
Messages postés11Date d'inscriptionlundi 20 juin 2005StatutMembreDernière intervention13 octobre 2005
-
13 oct. 2005 à 08:54
Bonjour,
Je fais appel à votre aide car j'ai un problème avec du code en assembleur et à vrai dire, je n'y connais quasiment rien :/
Le problème est qu'actuellement nous avons une électronique munie de 4 ports séries.
J'ai fait un programme PC qui permet d'envoyer des trames de plusieurs octets.
Donc je lance 2 fois le programme.
Sur un programme j'envoi une trame de 12octects toute les 2s. (COM1)
Sur un autre programme j'envoi une trame de 70octects toutes les 333ms. (COM2)
Aucun problème quand je ne lance qu'un programme mais dès que je lance les 2 en meme temps, j'ai des pertes de caractères en entrée des ports série :/ (je perds un ou deux caractères de temps en temps dans la trame, ce qui fait que le CRC est décallé et donc la chaine éronée).
Si qqun ici pouvait me dire au moins où chercher ou alors corriger le bug dans le code, ça serait parfait
Voici le code qui gére les ports série :
;*===========================================================*
;* Fichier: INTSER4.S *
;* Sous programmes sorties_series lies au materiel (hard) *
;*===========================================================*
nolist
include "ioa4.i"
include "bioad4.i"
include "config4.i"
include "confss4.i"
include "kcar.i"
include "maccos12.i"
include "bio2692.i"
list
KSS1: equ 0 ;no de la 1ere SS
KSS2: equ 1 ;no de la 2eme SS
KSS3: equ 2 ;no de la 3eme SS
KSS4: equ 3 ;no de la 4eme SS
protSTXETX: equ 1 ;protocole STXETX
page
switch .text
;*-----------------------------------------------*
;* Emission sur sortie 1 *
;*-----------------------------------------------*
chcar1: ldy O_Pemilec,x ;x=@fnt_SS[0]
;*---- Emission caractere (y=adresse buffer emission) ----*
cpy O_Pemiecr,x
beq fimp1
ldaa #1
staa O_bufocc,x ;emis. en cours
ldaa y ;car a emettre
iny
cpy #_TemiSS1+Kmaxemi ;fin buffer ?
bcs sty1
ldy #_TemiSS1 ;remet le ptr au debut
sty1: sty O_Pemilec,x
;*---- emission caractere sur SS1 (a=car a emettre) ----*
outSS1: brclr _SC0SR1,#TDRE,outSS1;attente emis.prete
staa _SC0DRL ;envoi car
; bra chcar1
rti
fimp1: bclr _SC0CR2,#TIE ;fin emission (att fin complete)
clr O_bufocc,x ;emis. plus en cours
rti
;*-----------------------------------------------*
;* Emission sur sortie 2 *
;*-----------------------------------------------*
chcar2: ldy O_Pemilec,x ;x=@fnt_SS[1]
;*---- Emission caractere (y=adresse buffer emission) ----*
cpy O_Pemiecr,x
beq fimp2
ldaa #1
staa O_bufocc,x ;emis. en cours
ldaa y ;car a emettre
iny
cpy #_TemiSS2+Kmaxemi ;fin buffer ?
bcs sty2
ldy #_TemiSS2 ;remet le ptr au debut
sty2: sty O_Pemilec,x
;*---- emission caractere sur SS2 (b=car a emettre) ----*
bset _PORTT,#S_RTS2 ;Met SS2 en emission
outSS2: brclr _SC1SR1,#TDRE,outSS2 ;attente emis.prete
staa _SC1DRL ;envoi car
rti
fimp2: bset _SC1CR2,#TCIE ;attente fin emission
bclr _SC1CR2,#TIE ;arret emission
rti
page
;*-----------------------------------------------*
;* Interruption sortie serie 2 *
;*-----------------------------------------------*
_irqsci2: ldx #_fnt_SS+KFNT_SS ;x=@fnt_SS[1]
ldaa _SC1SR1
bita #OR|FE ;OV ou FE
bne break2
bita #NF|PF ;bruit ou par
bne nogood2 ;!!!!
bita #RDRF ;car recu ?
bne recu2
bita #TDRE ;emission ?
beq rti1
;---- IT emission. Terminee ou non ? ----*
bita #TC ;emission terminee ?
beq chcar2 ;emission, [mailto:x=@fnt_SS[1 x=@fnt_SS[1]]
brclr _SC1CR2,#TCIE,chcar2 ;attente TC ?
termine2: bclr _SC1CR2,#TIE|TCIE ;arret IT emission
bclr _PORTT,#S_RTS2 ;Met SS2 en reception
clr O_bufocc,x ;emis. plus en cours
rti1: rti
break2: ldaa #2
staa O_kc,x
clrd
std O_nbcar,x ;int nbcar
bclr _SC1CR2,#RIE ;plus IT reception
nogood2: ldaa _SC1DRL ;cl it
rti
recu2: ldaa _SC1DRL ;car recu
psha ;car recu -> stack
ldab #KSS2 ;KSS2
ldaa _def_SS+KDEF_SS+O_protocol ;protocole pour SS2
bra recu1234
page
;*-----------------------------------------------*
;* Interruption sortie serie 1 *
;*-----------------------------------------------*
_irqsci1: ldx #_fnt_SS ;x=@fnt_SS[KSS0]
ldaa _SC0SR1
; bita #OR|FE ;OV ou FE
; bne break1
bita #NF|PF ;bruit ou parite
bne nogood1 ;!!!!
bita #RDRF ;car recu ?
bne recu1
bita #TDRE ;emission ?
beq nogood1
bra chcar1 ;emission, [mailto:x=@fnt_SS[1 x=@fnt_SS[1]]
break1: ldaa #2
staa O_kc,x
clrd
std O_nbcar,x ;int nbcar
bclr _SC0CR2,#RIE ;plus IT reception
nogood1: ldaa _SC0DRL ;cl it
rti
BON, ça fait po mal de code, mais comme je l'ai dit en haut, si qqun pouvait au moins me dire où peut se situer le bug, je suis preneur parce que la vraiment je vois po