Exemples de code assembleur du TD2

Exemples de code assembleur du TD2

Pile

5/11/2019

Exemple 1 - Clignotement de la Led

L'environnement de développement est ST Visual Developp de ST Microelectronics.

La cible est le STM8S Discovery comportant un micro-controleur STM8S105C6.

On crée sous STVD un espace de travail et un projet assembleur en précisant bien le type de cible.

Les définitions des ports d'entrées-sorties sont dans le fichier fourni par ST "stm8s105c6.inc" que l'on inclut dans le fichier source.

Et on adjoint dans le projet le fichier ST "stm8s105c6.asm" qui déclare nos dispositifs d'entrées-sorties.

Schémas

Le schéma de la carte Discovery nous indique que la LED est reliée à la ligne 0 du port D,puis par l'intermédiaire d'une résistance à la tension VDD (+3.3V ou +5V).

[ /doc/19/11/xG5O9Uav.png]

Il s'agit donc bien d'un montage en Drain ouvert.

Montage Bit de ODR Etat de la ligne Led
Open drain 0 Vss (0v) Allumée
" 1 indéfinie Éteinte
Push pull 0 Vss (0v) Éteinte
" 1 Vdd (+3.3V ou +5V) Allumée

Code

Le code est limpide; on a une configuration des registres du Port D et une exploitation comportant une boucle infinie avec une inversion de l'état de la ligne de la led et une attente d'une seconde.

L'attente est simplement une triple boucle d'attente consommatrice de CPU (à éviter) définie dans une fonction pouvant être appelée de plusieurs endroits.

Cette fonction attend un seul paramètre dans l'accumulateur qui est le nombre de dixième de seconde à consommer avant de retourner de la fonction.

Cette fonction est propre, c'est à dire qu'elle sauve les registres X et Y sur la pile avant de les modifier, et les restaure avant de revenir au programme appelant.

	; _Configuration_
	; La Led est sur PD0
	; On leve PD_DDR_0 et on ne modifie pas les autres bits
	LD A,PD_DDR; chargement du GPIOD_DDR
	OR A,#1 ; On fait un OU avec le masque correspondant au seul bit qui nous interesse
	LD PD_DDR,A
	; On abaisse PD_CR1_0 et on ne modifie pas les autres bits
	LD A,PD_CR1
	AND A,#$FE ; on fait un ET avec le complement du masque 
	LD PD_CR1, A
	; On abaisse PD_CR2_0 et on ne modifie pas les autres bits
	LD A,PD_CR2
	AND A,#$FE ; on fait un ET avec le complement du masque 
	LD PD_CR2, A
	
	; Pour vérifier le fonctionnement en Open Drain, à retirer apres test
	BSET PD_ODR,#0; OPEN DRAIN => SET => EXTINCTION
	BRES PD_ODR,#0; OPEN DRAIN => RESET => ALLUMAGE
	
	; _Exploitation_
infinite_loop.l
	BTJF PD_IDR,#0,allume
	BRES PD_ODR,#0 ; Allumage
	JRA suite
allume
	BSET PD_ODR,#0 ; Extinction
suite
	LD A,#10
	CALL my_delay ; Appel d'une fonction d'attente
	jra infinite_loop

my_delay
	; A contient le nombre de 1/10s a attendre
	PUSHW X ; Sauvegarde de X
	PUSHW Y ; Sauvegarde de Y
	JREQ	my_delay_end
	DEC A
	LDW X,#$3
my_delay_1
	LDW Y,#$ffff
my_delay_2
	DECW Y
	JRNE my_delay_2
	DECW X
	JRNE my_delay_1
	JRA my_delay
my_delay_end
	POPW Y ; Restauration de Y
	POPW X ; Restauration de X
	RET