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).
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