Prob de programme MAX232

xmaz57000 Messages postés 11 Date d'inscription lundi 20 juin 2005 Statut Membre Dernière intervention 13 octobre 2005 - 12 oct. 2005 à 09:32
xmaz57000 Messages postés 11 Date d'inscription lundi 20 juin 2005 Statut Membre Dernière intervention 13 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


xref _TA_bufemi,_TA_finemi
xref _TA_bufrec,_TA_finrec
xref _TemiSS1,_TemiSS2,_TemiSS3,_TemiSS4
xref _def_SS,_fnt_SS
xref _redemarrage


xdef _irqsci1,_irqsci2
; xdef _redemarrage
page
;*-------- definition des sorties series --------*/
;typedef struct {
; char vit;
; char bit;
; char stop;
; char parite; {"SANS ", "PAIRE", "IMP "};
; char protocol;
;} DEF_SS:
KDEF_SS: equ 5 ;taille de la structure DEF_SS
O_vit: equ 0 ;ofset vitesse
O_bit: equ 1 ;ofset nb de bits
O_stop: equ 2 ;ofset nb de stop
O_parite: equ 3 ;ofset parite
O_protocol: equ 4 ;ofset protocol
;@eeprom DEF_SS def_SS[Knb_SSmax];


;*-------- fonctionnement sorties series --------*
;typedef struct {
; char *Pemiecr; /* pointeur ecriture emission */
; char *Pemilec; /* pointeur lecture emission */
; char *Prececr; /* pointeur ecriture reception */
; char *Preclec; /* pointeur lecture reception */
; int nbcar; /* Nombre de car recus sur SS (a gerer si <0) */
; char kc; /* break sur entree serie */
; char bufocc; /* buffer emis. occupe */
; char prot0 /* protocole 0 temporaire */
;} FNT_SS;
KFNT_SS: equ 13 ;taille de la structure FNT_SS;
O_Pemiecr: equ 0 ;ofset pointeur ecriture emission
O_Pemilec: equ 2 ;ofset pointeur lecture emission
O_Prececr: equ 4 ;ofset pointeur ecriture reception
O_Preclec: equ 6 ;ofset pointeur lecture reception
O_nbcar: equ 8 ;ofset nbcar
O_kc: equ 10 ;ofset kc
O_bufocc: equ 11 ;buffer emis. occupe
O_prot0: equ 12 ;protocole 0 temporaire
page
;*-----------------------------------------------*
;* Definitions pour les registres du 68HC12A4 *
;*-----------------------------------------------*
;*---- Bits speciaux de SCxCR2 ----*
SBK: equ %00000001 ;send break
RWU: equ %00000010 ;wake up
RE: equ %00000100 ;validation reception
TE: equ %00001000 ;validation emission
ILIE: equ %00010000 ;validation idle
RIE: equ %00100000 ;validation IT reception
TCIE: equ %01000000 ;validation IT emission terminee
TIE: equ %10000000 ;validation IT emission


;*---- Bits speciaux de SCxSR1 ----*
PF: equ %00000001 ;parite erreur
FE: equ %00000010 ;framming erreur
NF: equ %00000100 ;bruit detecte
OR: equ %00001000 ;overrun
IDLE: equ %00010000 ;idle sur RXD
RDRF: equ %00100000 ;reception plein
TC: equ %01000000 ;emission terminee completement
TDRE: equ %10000000 ;emission prete


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


recu1: ldaa _SC0DRL ;car recu
psha ;car recu -> stack
clrb ;KSS1
ldaa _def_SS+O_protocol ;protocole pour SS1
bra recu1234
page
;*---- calcul adresse buffer reception ----*
;char * const TA_bufrec[Knb_SSmax] = {TrecSS1, TrecSS2, TrecSS3, TrecSS4};
zbufX: ldy #_TA_bufrec
aslb
ldy b,y ;adresse buffer rec
sty O_Prececr,x
sty O_Preclec,x
clr y ;securite
rti


;*---- fin reception message STXETX ----*
finrecX: ldd O_nbcar,x ;d=nbcar
subd #1
nega ;nbcar = - (nbcar - 1)
negb
sbca #0
std O_nbcar,x
rti
page
;*---------------------------------------------------*
;* Orientation de la reception suivant le protocole *
;* !! caractere recu dans le stack *
;*---------------------------------------------------*
recu1234: tst O_prot0,x ;protocole 0 temporaire
bne rec1car ;car recu -> stack
; cmpa #protSTXETX ;a=protocole
; beq recuSTXETX ;x=@fnt_SS[KSS1]
;>>>> !! suite = rec1car
;*-----------------------------------------------*
;* gestion reception des sorties series internes *
;* pour le protocole standard *
;* [mailto:x=@fnt_SS[b x=@fnt_SS[b]], b=KSSx, a=car recu *
;*-----------------------------------------------*
;*---- adresses buffer reception ----*
;char * const TA_bufrec[Knb_SSmax] = {TrecSS1, TrecSS2, TrecSS3, TrecSS4};
;char * const TA_finrec[Knb_SSmax] =
; {TrecSS1 + Kmaxrec, TrecSS2 + Kmaxrec, TrecSS3 + Kmaxrec, TrecSS4 + Kmaxrec};
rec1car: ldy O_Prececr,x
pula ;car recu <- stack
staa y ;stoke car recu
iny
aslb ;b = b x 2
pshx
ldx #_TA_finrec
cpy b,x ;fin buffer ?
bcs bony
ldx #_TA_bufrec
ldy b,x ;debut buffer
bony: pulx
cpy O_Prececr,x
beq plein
sty O_Prececr,x
rti
plein: rti
page
ifdef SS34
xdef _irq
;*-----------------------------------------------*
;* Emission sur sortie 3 *
;*-----------------------------------------------*
chcar3: ldx #_fnt_SS+(KFNT_SS * 2) ;x=@fnt_SS[KSS3]
ldy O_Pemilec,x
;*---- Emission caractere (y=adresse buffer emission) ----*
cpy O_Pemiecr,x
beq fimp3
ldaa #1
staa O_bufocc,x ;emis. en cours
ldaa y ;car a emettre
iny
cpy #_TemiSS3+Kmaxemi ;fin buffer ?
bcs sty3
ldy #_TemiSS3 ;remet le ptr au debut
sty3: sty O_Pemilec,x
;*---- emission caractere sur SS3 (a=car a emettre) ----*
staa _TXA ;envoi car
rti


fimp3: move #$18,_CRA ;fin emission
clr O_bufocc,x ;emis. plus en cours
rti


;*-----------------------------------------------*
;* Emission sur sortie 4 *
;*-----------------------------------------------*
chcar4: ldx #_fnt_SS+(KFNT_SS * 3) ;x=@fnt_SS[KSS4]
ldy O_Pemilec,x
;*---- Emission caractere (y=adresse buffer emission) ----*
cpy O_Pemiecr,x
beq fimp4
ldaa #1
staa O_bufocc,x ;emis. en cours
ldaa y ;car a emettre
iny
cpy #_TemiSS4+Kmaxemi ;fin buffer ?
bcs sty4
ldy #_TemiSS4 ;remet le ptr au debut
sty4: sty O_Pemilec,x
;*---- emission caractere sur SS4 (a=car a emettre) ----*
staa _TXB ;envoi car
rti


fimp4: move #$18,_CRB ;fin emission
clr O_bufocc,x ;emis. plus en cours
rti
page
;*-----------------------------------------------*
;* Interruption sortie serie DUART *
;*-----------------------------------------------*
_irq: ldaa _ISR
bita #2 ;RXRDYA full
bne recu3
bita #$20 ;RXRDYB full
bne recu4
bita #1 ;TXRDYA pret
bne chcar3
bita #$10 ;TXRDYB pret
bne chcar4
rti


recu3: ldx #_fnt_SS+(KFNT_SS*2) ;x=@fnt_SS[KSS3]
ldaa _SRA
bita #$f0 ;break, fram, parite err, ov
bne break3
ldaa _RXA ;car recu
psha ;car recu -> stack
ldab #KSS3 ;KSS3
ldaa _def_SS+(KDEF_SS*2)+O_protocol ;protocole pour SS3
bra recu1234


break3: ldaa #2
staa O_kc,x
clrd
std O_nbcar,x ;int nbcar
move #$41,_CRA ;efface flags err, valide rec
rti


recu4: ldx #_fnt_SS+(KFNT_SS*3) ;x=@fnt_SS[KSS4]
ldaa _SRB
bita #$f0 ;break, fram, parite err, ov
bne break4
ldaa _RXB ;car recu
psha ;car recu -> stack
ldab #KSS4 ;KSS4
ldaa _def_SS+(KDEF_SS*3)+O_protocol ;protocole pour SS4
bra recu1234


break4: ldaa #2
staa O_kc,x
clrd
std O_nbcar,x ;int nbcar
move #$41,_CRB ;efface flags err, valide rec
rti


endif
end

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

Merci d'avance

1 réponse

xmaz57000 Messages postés 11 Date d'inscription lundi 20 juin 2005 Statut Membre Dernière intervention 13 octobre 2005
13 oct. 2005 à 08:54
Personne ne peux m'aider ? plzzzzz
0
Rejoignez-nous