je viens de trouver un programme assembleur pour telecommande infrarouge mais je comprend pas grand chose quelqu'un peu le convertir en c stp pour que je puisse le comprendre stp
Tele16s.asm
.title "interface serie 16 sorties"
.vers "st6225"
.input "6225_reg.asm"
.w_on
; ============================== ============================== ====
; | Telecommande I.R. 16 sorties asynchrone 300 bauds |
; ============================== ============================== ====
;
; microcontroleur ST6 de SGS-THOMSON
;
; PROTOCOLE DE COMMUNICATION
;
;
; $Ax : Activation de la sortie numero x ( x = 0, 1, ..., 15 )
; $Dx : desactivation de la sortie numero x ( x = 0, 1, ..., 15 )
; $FA : Activation de toutes les sorties
; $FD : Desactivation de toutes les sorties
;
; TRANSMISSION SERIE ASYNCHRONE
;
; Vitesse de transmission determinee par le temps d'execution des instructions
;
; 13
; Temps d'un cycle instruction Tcy = -------
; Fquartz
;
; Toutes les instructions necessite 4 cycles Tcy sauf :
;
; - JRxx (sauts relatifs), RET, RETI, STOP, WAIT : 2 Tcy
; - JRR,JRS ( sauts relatifs selon etat d'un bit ) : 5 Tcy
;
; 1
; Temps de transmission d'un bit Tbit = ----
; baud
;
;
; RECEPTION: DETERMINATION DES CONSTANTES DE TEMPORISATION
;
; Tbit Fquartz
; 1/2 START BIT: ---- = ( 15* Tempbit0) * Tcy ==> Tempbit0 = -----------
; ------------- 2 390 * Baud
;
; Fquartz
; BIT 0 : Tbit = (10* Tempbit1 + 24) * Tcy ==> Tempbit1 = ------- - 2,4
; --- 130*Baud
;
; Fquartz
; BIT 1 … 7 : Tbit = (10* Tempbit1 + 47) * Tcy ==> Tempbit1 = ------- - 4,7
; --- 130*Baud
;
; cette derniŠre est utilis‚e pour d‚terminer Tempbit1
; Fquartz
; STOP BIT: Tbit = (10* Tempbit2 + 08) * Tcy ==> Tempbit2 = ------- - 0,8
; ---------- 130*Baud
;
;
;
; tableau recapitulatif pour une vitesses de transmission de 300 bauds avec
; un quartz de 8,000 Mhz
;
; ------------------------------------------------
; | Baud | tempbit0 | tempbit1 | tempbit2 |
; |--------|------------|------------|-----------|
; | 300 | 68 | 201 | 204 |
; ------------------------------------------------
;
;------------------------------------------------------------------------------
; Definition des constantes
;------------------------------------------------------------------------------
chien .equ 0FEh ; valeur du chien de garde a la valeur maxi.
tbit0_r .equ 68 ; tempo 1/2 start ( pour 1200 bauds )
tbit1_r .equ 201 ; tempo bit ( pour 1200 bauds )
tbit2_r .equ 204 ; tempo stop bit ( pour 1200 bauds )
rx .equ 6 ; PC6 = RX
;------------------------------------------------------------------------------
; Definition des variables en ram $84 … $BF
;------------------------------------------------------------------------------
copypa .def 084h ; pour maniplation bits du port A
copypb .def copypa+1 ; pour maniplation bits du port B
copypc .def copypb+1 ; pour maniplation bits du port C
caracter .def copypc+1 ; Sauvegarde caractere emis./recep.
commande .def caracter+1 ; commande recue.
;------------------------------------------------------------------------------
; Programme
;------------------------------------------------------------------------------
.org 080h
; -- Definition de la table des bits de masquage --
maskbit1 .byte 1 , 2 , 4 , 8 , 16 , 32 , 64 , 128
maskbit0 .byte 0FEh , 0FDh , 0FBh , 0F7h , 0EFh , 0DFh , 0BFh , 7Fh
; -- initialisation PC4 a PC7 = entree avec resistance de pull-up
; PB et PA = sortie push-pull ( 16 sorties logiques )
; PA0 … PA7 = S1 … S8
; PB0 … PB7 = S9 … S16
init_pgm ldi wdr,chien
clr a
ld pcdir,a
ld pcopt,a
ld pc,a
ld copypc,a
ldi padir,0FFh
ldi paopt,0FFh
ld pa,a
ld copypa,a
ldi pbdir,0FFh
ldi pbopt,0FFh
ld pb,a
ld copypb,a
clr ior
interp call recep ; attend commande
ld commande,a ; memorise la commande
andi a,0F0h ; Teste la nature de la commande
cpi a,0F0h ; commande globale ?
jrz CmdGlob ; oui, alors traitement global
jp interp0 ; non, autre commande...
CmdGlob ld a,commande ; activation ou desactivation globale ?
andi a,0Fh
cpi a,0Ah ; activation ?
jrnz Glob_0 ; non, va tester si desactivation
clr a ; oui, alors toutes les sorties a 1
com a
ld copypa,a
ld pa,a
ld copypb,a
ld pb,a
jp FinGlob
Glob_0 cpi a,0Dh ; Desactivation ?
jrnz FinGlob ; non, alors c'est visiblement une erreur!
clr a ; oui, alors toutes les sorties a 0
ld copypa,a
ld pa,a
ld copypb,a
ld pb,a
FinGlob jp interp ; retour a la case depart
interp0 cpi a,0A0h ; commande activation locale ?
jrz CmdAcLoc ; oui, traitement de la commande
jp interp1 ; non, autre commande...
CmdAcLoc ld a,commande ; recupere numero de sortie
andi a,0Fh
jrs 3,a,AcLocB ; teste si port B concerne
jp AcLocA ; sinon, c'est le port A
AcLocB andi a,07h ; Port B concerne
ldi drwr,maskbit1.w ; pointe, via reg. X, la table des masques
ldi x,maskbit1.d
add a,x ; adresse le bon masque
ld x,a ; X pointe masque relatif au bit … mettre … 1
ld a,copypb ; le port B est concerne...
and a,(x)
jrz AcLocB0 ; si le bit est deja a 1, on ne fait rien !
jp AcLocFin
AcLocB0 ld a,copypb
add a,(x)
ld copypb,a
ld pb,a
jp AcLocFin
AcLocA andi a,07h ; Port A concerne
ldi drwr,maskbit1.w ; pointe, via reg. X, la table des masques
ldi x,maskbit1.d
add a,x ; adresse le bon masque
ld x,a ; X pointe masque relatif au bit a mettre a 1
ld a,copypa ; le port A est concerne...
and a,(x)
jrz AcLocA0 ; si le bit est deja a 1, on ne fait rien !
jp AcLocFin
AcLocA0 ld a,copypa
add a,(x)
ld copypa,a
ld pa,a
AcLocFin jp interp ; retour a la case depart
interp1 cpi a,0D0h ; commande de desactivation locale ?
jrz CmdDesLoc ; oui, traitement de la commande
jp interp ; non, c'etait une erreur...retour case depart
CmdDesLoc ld a,commande ; recupere numero de sortie
andi a,0Fh
jrs 3,a,DsLocB ; teste si port B concerne
jp DsLocA ; sinon, c'est le port A
DsLocB andi a,07h ; le port B est concerne
ldi drwr,maskbit0.w ; pointe, via reg. X, la table des masques
ldi x,maskbit0.d
add a,x
ld x,a ; X pointe masque relatif au bit a mettre a 0
ld a,copypb ; port B concerne...
and a,(x) ; mise a 0 du bit.
ld copypb,a
ld pb,a
jp DsLocFin
DsLocA andi a,07h ; le port A est concerne
ldi drwr,maskbit0.w ; pointe, via reg. X, la table des masques
ldi x,maskbit0.d
add a,x
ld x,a ; X pointe masque relatif au bit a mettre a 0
ld a,copypa ; port A concerne...
and a,(x) ; mise a 0 du bit.
ld copypa,a
ld pa,a
jp DsLocFin
DsLocFin jp interp ; retour a la case depart
-----