assembly_project/FonctionEtape2.asm

161 lines
No EOL
4.5 KiB
NASM

;***************************************************************************
THUMB
REQUIRE8
PRESERVE8
;**************************************************************************
; Fichier Vierge.asm
; Auteur : V.MAHOUT
; Date : 12/11/2013
;**************************************************************************
;***************IMPORT/EXPORT**********************************************
EXPORT Set_SCLK
EXPORT Reset_SCLK
EXPORT DriverGlobal
;**************************************************************************
;***************CONSTANTES*************************************************
include REG_UTILES.inc
;**************************************************************************
;***************VARIABLES**************************************************
AREA MesDonnees, data, readwrite
;**************************************************************************
SCLK EQU 5
SIN1 EQU 7
PF DCD (1<<31)
Barette1 DCB 0xff,0,0
DCB 0,0xff,0
DCB 0,0,0xff
DCB 0xff,0,0
DCB 0xff,0xff,0
DCB 0xff,0xff,0xff
DCB 0xff,0,0
DCB 0,0xff,0
DCB 0,0,0xff
DCB 0xff,0,0
DCB 0xff,0xff,0
DCB 0xff,0xff,0xff
DCB 0xff,0,0
DCB 0xff,0xff,0
DCB 0xff,0xff,0xff
DCB 0x0f,0xff,0x00
;**************************************************************************
;***************CODE*******************************************************
AREA moncode, code, readonly
;**************************************************************************
Set_SCLK PROC
PUSH {R0-R2} ;On stocke R0 à R2
LDR R1,=GPIOBASEA ;R1 -> Adresse de GPIOA
LDRH R2,[R1,#OffsetOutput] ;Valeur à l'adresse d'ODR : R2 = GPIOA->ODR
ORR R2, R2,#(0x01 << 5) ;similaire à GPIOA->ODR |= (1<<5)
STRH R2,[R1,#OffsetOutput] ;Etat du port B (R5) stocké dans ODR
BX LR ;Retour
ENDP
Set_X PROC
PUSH {R1,R2} ;On stocke R0 à R4 dans SP
MOV R1, #1 ;*******
LSL R0, R1, R0 ;1<<Arg
LDR R1,=GPIOBASEA ;R1 -> Adresse de GPIOA
LDRH R2,[R1,#OffsetOutput] ;Valeur à l'adresse d'ODR : R2 = GPIOA->ODR
ORR R2, R2, R0 ;similaire à GPIOA->ODR |= (1<<Arg)
STRH R2,[R1,#OffsetOutput] ;Etat du port B (R5) stocké dans ODR
POP{R1,R2} ;Déchargement de la pile
BX LR ;Retour
ENDP
Reset_X PROC
PUSH {R1,R2} ;On stocke R0 à R4 dans SP
MOV R1, #1 ;*******
LSL R0, R1, R0 ;1<<Arg
MVN R0, R0 ;~(1<<Arg)
LDR R1,=GPIOBASEA ;R1 -> Adresse de GPIOA
LDRH R2,[R1,#OffsetOutput] ;Valeur à l'adresse d'ODR : R2 = GPIOA->ODR
AND R2, R2, R0 ;similaire à GPIOA->ODR &= ~(1<<Arg)
STRH R2,[R1,#OffsetOutput] ;Etat du port B (R5) stocké dans ODR
POP{R1,R2} ;Déchargement de la pile
BX LR ;Retour
ENDP
Reset_SCLK PROC
PUSH {R0-R2} ;On stocke R0 à R2 dans SP
LDR R1,=GPIOBASEA ;R1 -> Adresse de GPIOA
LDRH R2,[R1,#OffsetOutput] ;Valeur à l'adresse d'ODR : R2 = GPIOA->ODR
AND R2, R2,#~(0x01 << 5) ;similaire à GPIOA->ODR &= ~(1<<5)
STRH R2,[R1,#OffsetOutput] ;Etat du port B (R5) stocké dans ODR
BX LR ;Retour
ENDP
;****************************************************************************
;R1 = *ValCourante
;R2 = NBLed (i)
;R3 = ValCourante[i]
;****************************************************************************
DriverGlobal PROC
MOV R0, #SCLK ;Argument SCLK
BL Set_X; ;Set_X(SCLK)
LDR R1,=Barette1;On recupère l'adresse de base
MOV R2, #0; ;*************************
WHILE_NBLED ;for(int i=0;i<48;i++)
LDRB R3,[R1,R2] ;ValCourante[i]
LSL R3,#24 ;ValCourante[i]<<24
LDR R0,=PF
LDR R5,[R0,#0] ;R5 = (1<<31)
MOV R4, #0 ;*************************
WHILE_NBBIT ;for(int j=0;j<12;j++)
MOV R0, #SCLK ;Argument SCLK
BL Reset_X; ;Reset_X(SCLK)
MOV R0, #SIN1 ;Argument SIN1
AND R6,R3,R5 ;ValCourante[i] &= (1<<31) (<- PF)
CMP R6,R5 ;if(PF == 1)
BEQ PoidFortOKIF ;{ Set_X(SIN1) }
BL Reset_X; ;else { Reset_X(SIN1) }
PoidFortOKJUMP ;Fin Si
LSL R3,#1 ;ValeurCourante[i]<<1
MOV R0, #SCLK ;Argument SCLK
BL Set_X; ;Set_X(SCLK)
ADD R4, R4, #1 ;On incrémente NBBit
CMP R4, #11 ;SI NBBIT==11 alors on arrête la boucle
BNE WHILE_NBBIT
ADD R2, R2, #1 ;On incrémente NBLed
CMP R2, #47 ;SI NBLED==47 alors on arrête la boucle
BNE WHILE_NBLED
MOV R0, #SCLK ;Argument SCLK
BL Reset_X; ;Reset_X(SCLK)
;LDR R0,= ;DataSend <- 0
B . ;while(1)
PoidFortOKIF
BL Set_X ;Set_X(SCLK)
B PoidFortOKJUMP ;After Reset8X
ENDP
;**************************************************************************
END