TP assembleur 3IMACS Baguette magique Fichier aide de l'étape 6 du TP asm Voir sujet http://www.lesia.insa-toulouse.fr/~acco/acco_wiki/doku.php?id=hard:asm:2009_10:accueil Le programme de découpe en 4 parties : 1. Acquisition de la chaine de caractère et son affichage = 'Polling_Saisie_Affichage' dans le fichier du même nom 2. Conversion de la chaine de caractère affiché en une trame grâce à la table des fonts de caractère = 'Mise_a_jour_trame' dans Handller_diode 3. Une interruption régulière qui balaye la trame de gauche à droite et vice-versa et affiche chaque "ligne" sur les diodes. Se bloque à chaque fois qu'elle à atteint un bout de la trame = 'SysTick_Handler' dans Handller_diode! Initialisation par 'Demarre_Systick' voir lib_baguette.inc 4. Une interruption qui détecte les phases du mouvement à vitesse constante et active l'affichage de la trame (SysTick_Handle) dans le sens voulu. = 'ADC_IRQHandler' dans handler_detection.s! Initialisation par 'INIT_ADC_IRQHandler' dans handler_detection.s Convention C utilisée : lors des appels de fonctions seul les registres R0-R3,PC sont modifiés Kevin ROCARD
MAIN MAIN : Initialise les whatchdogs puis appel en boucle l'acquisition et traitement des boutons (Polling_Saisie_Affichage) Kevin ROCARD
U:\documents\Informatique\3annee\Assembleur\colis_tp_asm_v20009_10_1\proj_cm3...\main.s PRESERVE8 THUMB IMPORT Lib$$Request$$armlib assure l'initialisation des variables après un reset fichier main de l'étape 5 du TP asm voir sujet http://www.lesia.insa-toulouse.fr/~acco/acco_wiki/doku.php?id=hard:asm:200 9_10:accueil Convention C utilise lors des appels de fonctions seuls les registres R0-R3,PC sont modifies INCLUDE../objs_lib_baguette/lib_baguette.inc VARIABLES initialisées AREA RESET, DATA CONSTANTES MEMOIRE AREA RESET, DATA, READONLY CONSTANTES ETIQUETTES CODE AREA.text, CODE, READONLY, ALIGN=2 EXTERN Polling_Saisie_Affichage DANS Polling_Saisie_Affichage EXTERN SysTick_Handler DANS handler_diode2.s EXTERN INIT_ADC_IRQHandler DANS handler_detection main PROC EXPORT main IN : rien OUT : rien REGS : R3 = R4 = R5 = R6 = R7 = Page: 1
U:\documents\Informatique\3annee\Assembleur\colis_tp_asm_v20009_10_1\proj_cm3...\main.s ATTENTION : fonction bloquante te Init des periphs à faire avant toute utilisation d'une fonction de lib_baguet voir lib_baguette.inc pour les détails BL Init_Baguette BL Demarre_Systick BL INIT_ADC_IRQHandler Pour_Toujours BL Polling_Saisie_Affichage B Pour_Toujours ENDP main END module asm Ici on peut écrire de la pôésie par exemple :-) Page: 2
Polling_Saisie_Affichage Polling_Saisie_Affichage : Acquisition des caractères, mise à jour de l'écran, mise à jour de la trame Kevin ROCARD
U:\documents\Informatique\3annee\Assembleur\colis_tp_asm_...\Polling_Saisie_Affichage.s PRESERVE8 THUMB IMPORT Lib$$Request$$armlib assure l'initialisation des variables après un reset INCLUDE../objs_lib_baguette/lib_baguette.inc déclaration des fonction de la librai rie Convention C utilise lors des appelles de fonctions seul les registres R0-R3,PC sont modifier VARIABLES initialisées AREA RESET, DATA Caractere DCB 'Q' Texte_Baguette DCB "DEFO" Num_car DCB 0 Pas DCW 0xFFF/26 Passer en adressage direct Entre_ancien DCB 0 Annulation_ancien DCB 0 CONSTANTES MEMOIRE AREA RESET, DATA, READONLY CONSTANTES ETIQUETTES Echelle equ 0xFFF/26 CODE AREA.text, CODE, READONLY, ALIGN=2 EXTERN Mise_a_jour_trame DANS handler_diode2.s Polling_Saisie_Affichage PROC EXPORT Polling_Saisie_Affichage IN : rien OUT : rien REGS : R3 = caractère selectioné R4 = Pas de décomposition de des 2^12 bit du du potentiometre en 26 letre de l'alp habet R5 = Etat du bouton Effacement R6 = Etat du bouton Entré R7 = Etat diode \\Debug inutilisé REG. ALT. : R0-R2,R14,R15 ATTENTION : ALGO: Aquisition du caractère selectioné SI le caractère actuelle!= caractère précedent Met à jour l'ecran avec le charactère Page: 1
U:\documents\Informatique\3annee\Assembleur\colis_tp_asm_...\Polling_Saisie_Affichage.s Enregistre le caractère actuelle Aquisition: -entre -annulation Si ancien 'entrée' > nouveau entre (front descendant) SI nombre_caractère < 4 Ajout du caractère Mise à jour de l'ecran Mise à jour de la trame Si ancien 'annulation' > nouveau entre (front descendant) Remet le curseur (Num_car) au début (0) Remplis le texte de l'ecran d'espace Mise à jour de l'ecran Mise à jour de la trame Enregistre l'etats des boutons dans la memoire PUSH {R4,R5,R6,R7,LR} LDR R4,=Echelle Aquisition du caractère selectioné int Lire_ADC(int channel) IN: R0: canal à lire 0 = valeur du potentiomètre de saisie (ADC_POTENTIOMETR E) 1 = mesure de l'accélération de l'axe X (ADC_X) l'axe e st indiqué sur la baguette. 2 = mesure de l'accélération de l'axe Y (ADC_Y) l'axe e st indiqué sur la baguette. LDR R0,=0 li le canal potentiometre BL Lire_ADC OUT: R0: Résultat de la conversion sur 16 bits alignés à droite REG. ALT. : R0-R2,R14,R15 UDIV R3,R0,R4 adapte l'echelle 0->0 FFF->26 ADD R3,#'A' ajoute la valeur ASCI de 'A' =>R3 contient le caractère courant Compare le nouveau caractère avec l'ancien LDR R5,=Caractere LDRB R0,[R5] CMP R0,R3 BEQ PAS_CHANGEMENT appel de MAJ_Ecran (texte_baguette,caractere) LDR R0,=Texte_Baguette MOV R1,R3 BL MAJ_Ecran lib_baguette.inc > REG. ALT. : R0-R2,R14,R15 Mise à jour du caractère selectionné STRB R3,[R5] PAS_CHANGEMENT R5=>Effacement R6=>Entré lis Efacement LDR R0,=1 BL Lire_Touche MOV R5, R0 Memorisation de Effacement dans R5 lis Entree Page: 2
U:\documents\Informatique\3annee\Assembleur\colis_tp_asm_...\Polling_Saisie_Affichage.s LDR R0,=2 BL Lire_Touche MOV R6, R0 Memorisation de Entré dans R6 Anciens sauvegarde par pile POP {R0} recupère anciens entree CMP R0, R6 PUSH {R0} recupère ancien entree LDR R1,=Entre_ancien LDRB R0, [R1] s petits then orme :< ante 5 test front dessandant Entré! detecte tout les frond descendant memem le Nouveau == 0 & Ancien!=0 CMP R6, R0 BHS pas_front_descendant_entre if Nouvelle_entré<Ancient LDR R1,=Num_car LDRB R0,[R1] R0 correspond à la nème letre du mots que l'on f test si 4 caractère n'on pas déja été rentré (Buffer overflow) CMP R0, #4 BHS pas_front_descendant_entre pas très structuré Ajoute le caratère courant au texte LDR R2,=Texte_Baguette ADD R2, R0 R2 correspond à l'adresse de la letre cour STRB R3,[R2] R3 correspond à la letre selectioner ADD R0,#1 STRB R0, [R1] Mise à jour de l'ecran LDR R0,=Texte_Baguette MOV R1, R3 BL MAJ_Ecran lib_baguette.inc > REG. ALT. : R0-R2,R14,R1 Mise à jour de la trame par passage d'argument par R0 LDR R0,=Texte_Baguette LDR R0, [R0] BL Mise_a_jour_trame pas_front_descendant_entre Clignoté diode \\debuggage R7 =>etat diode MVN R0,R7 inversion ds états des diode BL Ecrit_LED Anciens sauvegarde par pile POP {R0,R1} recupère anciens entrees et Annulation CMP R1, R5 Compare Ancien et nouveau Annulation PUSH {R0,R1} recupère ancien Annulation LDR R1,=Annulation_ancien LDRB R0, [R1] t<0 then test front dessandant Annulation CMP R5, R0 BHS pas_front_descendant_annulation if Nouvelle_entré-Ancien Ecris 0 dans le numero de caratère edité LDR R1,=Num_car R0 pointe vers le compteur du nombre de le Page: 3
U:\documents\Informatique\3annee\Assembleur\colis_tp_asm_...\Polling_Saisie_Affichage.s tre dans le mot que l'on forme LDR R0,=0 STRB R0, [R1] on met a 0 le compteur de caractère Ecris des espaces dans les charactère LDR R0,=Texte_Baguette LDR R1,=0x20202020 0x20202020 =" " (4 espaces) qui n'est p as directement pris??? STR R1,[R0] Met à jour l'ecran LDR R1, =Caractere LDR R1, [R1] BL MAJ_Ecran lib_baguette.inc > REG. ALT. : R0-R2,R14,R15 Met à jour la trame diode LDR R0,=Texte_Baguette LDR R0,[R0] BL Mise_a_jour_trame pas_front_descendant_annulation enregistre l'etats des boutons dans la memoire LDR R0,=Annulation_ancien enregistre anciens Efacement STRB R5, [R0] LDR R0,=Entre_ancien enregistre anciens Entré STRB R6, [R0] POP {R4,R5,R6,R7,LR} BX LR ENDP Polling_Saisie_Affichage END module asm Page: 4
handler_diode Handler_diode : Affiche sur les diodes, à chaque appel, un octet de la Trame. Dans le sens croissant puis décroissant. Mise_a_jour_trame : Mets à jour la trame grâce aux 4 caractères passés en argument Kevin ROCARD
U:\documents\Informatique\3annee\Assembleur\colis_tp_asm_v20009_10...\handler_diodes2.s PRESERVE8 THUMB IMPORT Lib$$Request$$armlib assure l'initialisation des variables après un reset INCLUDE../objs_lib_baguette/lib_baguette.inc déclaration des fonction de la librai rie Convention C utilise lors des appelles de fonctions seul les registres R0-R3,PC sont modifier VARIABLES initialisées AREA RESET, DATA Etat_diode DCB 0 Trame SPACE 1+8*4+1 =34 Trame DCB 0x00 DCB 0xfc, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xf0, 0x00 P DCB 0x00, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0x76, 0x00 a DCB 0x00, 0x00, 0xfc, 0x98, 0x30, 0x64, 0xfc, 0x00 z DCB 0x18, 0x3c, 0x3c, 0x18, 0x18, 0x00, 0x18, 0x00! DCB 0x00 Position_trame DCB 1 Sens_lecture DCB 1 Activaton_handler_diode DCB 1 CONSTANTES MEMOIRE AREA RESET, DATA, READONLY CONSTANTES ETIQUETTES CODE AREA.text, CODE, READONLY, ALIGN=2 EXTERN Rotation [PROC] not reconised DANS font8.c SysTick_Handler PROC EXPORT SysTick_Handler IN : rien OUT : rien REGS : R0=>Octet courant de la trame (char R1=Trame [position_trame]) R1=>Pointeur de trame (char * R2 =Trame) R2=>Sens_lecture (char) R3=>pointeur sur Sens_lecture (char *) R4=>position dans la trame (nème octet apres de debut) (char R4=position_tra me) R5=>pointeur de position_trame (char * R3 =&position_trame) REG. ALT. : R15 Page: 1
U:\documents\Informatique\3annee\Assembleur\colis_tp_asm_v20009_10...\handler_diodes2.s La fonction affiche sur les diodes, à chaque appele, un octet de la Trame. Dans le sens croissant puis decroissant ALGO: SI Activaton_handler_diode =0 FIN recuperation de : -l'emplacement dans la trame -sens de lecture Recuperation des 8 état des diodes grace un tableau indexé Allume les led en fonction de ces états SI sens de lecture = croissant ALORS emplacement dans la trame ++ SINON emplacement dans la trame -- SI on à depasse la fin de trame ALORS sens de lecture = decroissant Activaton_handler_diode = 0 emplacement dans la trame -- SI on à depasse le début de trame ALORS sens de lecture = croissant Activaton_handler_diode = 0 emplacement dans la trame ++ sauvegarde (nouvelle emplacement dans la trame) LDR R0,=Activaton_handler_diode LDR R0,[R0] CBZ R0, Fin_SysTick_Handler push {R4,R5,LR} Clignoté diode R1 =>etat diode LDR R1,=Etat_diode LDRB R0,[R1] MVN R0, R0 inversion de l'états des diodes STRB R0,[R1] recuperation de l'emplacement dans la trame LDR R5,=Position_trame LDRB R4,[R5] recuperation du sens de lecture LDR R3, =Sens_lecture LDRB R2, [R3] Recuperation de l'octet dans la trame LDR R1,=Trame ADD R1,R4 LDRB R0,[R1,#-1] Allume les led en fonctions de R0.0-R0.7 PUSH {R2,R3} MVN R0,R0 BL Ecrit_LED POP {R2,R3} Modification de la position dans la trame CBNZ R2, decroissant Detection sens de lecture de la trame ADD R4,#-1 Si Affichage decroissant de la trame decroissant CBZ R2, croissant ADD R4,#1 Si Affichage croissant de la trame croissant Page: 2
U:\documents\Informatique\3annee\Assembleur\colis_tp_asm_v20009_10...\handler_diodes2.s test si on à depasse la fin de trame CMP R4,#34 BLO pas_depasse_fin_trame passage en mode decroissant (0) MOV R2,#0 STRB R2, [R3] desactivation handler_diode LDR R0,=Activaton_handler_diode MOV R1,#0 STRB R1,[R0] emplacement dans la trame -- ADD R4,#-1 pas_depasse_fin_trame test si on à depasse le début de trame CBNZ R4, pas_depasse_deb_trame passage en mode croissant (1) MOV R2,#1 STRB R2, [R3] desactivation handler_diode LDR R0,=Activaton_handler_diode MOV R1,#0 STRB R1,[R0] emplacement dans la trame ++ ADD R4,#1 pas_depasse_deb_trame sauvegarde (nouvelle emplacement dans la trame) STRB R4,[R5] pop {R4,R5,LR} Fin_SysTick_Handler BX LR ENDP SysTick_Handler EXTERN font8data Mise_a_jour_trame PROC EXPORT Mise_a_jour_trame IN : R0 OUT : rien REGS : R0=>Les 4 caractère à metre dans la trame (double) R1=>Adresse de la tagle de convertion code ASCI => font des caractères (cha r font []) R2=>Compteur de 0 à 3 pour parcourir les 4 caractères (char) R3=>Caractère actuelement traité (char) puis font de ce caractère (int) R4=>2eme moitier de la font du caractère R5=>Adrèsse du caractère actuellement traité dans la font (char *) puis adresse de la trame REG. ALT. : R15 La fonction met à jour la trame grace au 4 caractère contenu dans R0 ALGO: Accisition de l'adresse de la table de font POUR numero_caractère DE 0 A 3 Extracton du caractère courant Calcul l'adresse de la font de ce caractère dans la table de font (font+8*car _ascii) Tourne cette font Acquisition cette font Page: 3
U:\documents\Informatique\3annee\Assembleur\colis_tp_asm_v20009_10...\handler_diodes2.s Calcul de l'adresse de cette font dans la trame Ecriture de la font dans la trame FIN POUR push {R4,R5,R6,LR} Recuperer l'adresse de la table de font LDR R1,=font8data LDR R2,=0 parcours, convertions et sauvegarde des 4 caractères de R0 for (R2=0R2<4*8R2+=8) parcour_caractere Selection du R2ème caractère LSR R3,R0,R2 R3=>Caractère actuelement traité (char) AND R3,#0x000000FF masque pour selectioné uniquement le caractère Calcul de l'adresse de sa font ADD R5,R1,R3,LSL #3 R5=>Adrèsse du caractère actuellement trai té dans la font (char *) tourne la font PUSH {R0,R1,R2,R3} MOV R0, R5 BL Rotation MOV R5, R0 POP {R0,R1,R2,R3} Acquisition de sa font LDR R3,[R5],#4 R3=>1er moitié font de ce caractère LDR R4,[R5] R4=>2eme moitié font de ce caractère Calcul de l'adresse de ce caractère dans la trame LDR R5,=Trame ADD R5,R2 R4=R4+8*R2 =>R4 adresse du caractère dans la trame ADD R5,#1 Ecriture de la font du caractère dans la trame STR R3,[R5],#4 STR R4,[R5] incrementation et test du for (R2=0R2<3R2++) ADD R2,#8 CMP R2,#4*8 BLO parcour_caractere pop {R4,R5,R6,LR} BX LR ENDP Mise_a_jour_trame Give_activation_SysTick_Handler PROC EXPORT Give_activation_SysTick_Handler IN : R0 OUT : rien ecrit R0 dans activaton_handler_diode Si R0=0 => désactivation de handler_diode LDR R1,=Activaton_handler_diode STRB R0,[R1] BX LR ENDP Give_activation_SysTick_Handler Give_sens_lecture_trame PROC EXPORT Give_sens_lecture_trame IN : rien OUT : R0 écrit R0 dans sens de lecture 1 => croissant 0 => décroissant Page: 4
U:\documents\Informatique\3annee\Assembleur\colis_tp_asm_v20009_10...\handler_diodes2.s LDR R1,=Sens_lecture STRB R0,[R1] BX LR ENDP Give_sens_lecture_trame END module asm Page: 5
handler_detection ADC_IRQHandler : Détecte les phases du mouvement et démarre les trames en fonction. INIT_ADC_IRQHandler : Initialise le whatchdog pour l'appel de ADC_IRQHandler Kevin ROCARD
U:\documents\Informatique\3annee\Assembleur\colis_tp_asm_v20009_...\handler_detection.s PRESERVE8 THUMB IMPORT Lib$$Request$$armlib assure l'initialisation des variables après un reset INCLUDE../objs_lib_baguette/lib_baguette.inc déclaration des fonction de la librai rie Convention C utilise lors des appelles de fonctions seul les registres R0-R3,PC sont modifier VARIABLES initialisées AREA RESET, DATA Etat DCB 0 CONSTANTES MEMOIRE AREA RESET, DATA, READONLY CONSTANTES ETIQUETTES Seuil_debut_lecture_decroissant equ (22000*0xFFF)/33000 Aceleration_trop_eleve_decroissant equ (10000*0xFFF)/33000 Seuil_debut_lecture_croissant equ (13000*0xFFF)/33000 Aceleration_trop_eleve_croissant equ (28000*0xFFF)/33000 contrainte : Aceleration_trop_eleve_croissant > Seuil_debut_lecture_decroissant > Seuil_debut_lecture_croissant >Aceleration_trop_eleve_decroissant Le mouvement se découpe en 4 partie : 0 : le mouvement change de sens arrive de gauche et y repart 1 : le mouvement est constant de gauche à gauche 2 : le mouvement change de sens arrive de droite et y repart 3 : le mouvement est constant de droite à droite ALGO : SWITCH (ETAT) CASE (0) : prochaine interuption quand l'acceleration sera \ infèrieur à Seuil_debut_lecture_decroissant ETAT = 1 break CASE (1) : Sens decroissant Activation de l'afichage de la trame prochaine interuption quand l'acceleration sera \ infèrieur à Aceleration_trop_eleve_decroissant ETAT = 2 break CASE (2) : prochaine interuption quand l'acceleration sera \ supèrieur à Seuil_debut_lecture_croissant Page: 1
U:\documents\Informatique\3annee\Assembleur\colis_tp_asm_v20009_...\handler_detection.s ETAT = 3 break CASE (3) : Sens croissant Activation de l'afichage de la trame prochaine interuption quand l'acceleration sera \ supèrieur à Aceleration_trop_eleve_croissant ETAT = 0 break acquittement CODE AREA.text, CODE, READONLY, ALIGN=2 EXTERN Give_sens_lecture_trame EXTERN Give_activation_SysTick_Handler ADC_IRQHandler PROC EXPORT ADC_IRQHandler PUSH {R4,R5} LDR R5, =Etat LDR R4, [R5] switch (ETAT) CASE(0) CBNZ R4, PAS_ETAT_0 Programmation next interruption LDR R0,=Seuil_debut_lecture_decroissant BL Analog_Dog_Watch_For_Lower_Than LDR R4,=1 STRB R4, [R5] B Fin_case break PAS_ETAT_0 CASE(1) debut de la lecture dans le sens decroissant CMP R4, #1 BNE PAS_ETAT_1 sens lecture decroissant MOV R0,#0 BL Give_sens_lecture_trame activation lecture trame MOV R0,#1 BL Give_activation_SysTick_Handler Programmation next interruption LDR R0,=Aceleration_trop_eleve_decroissant BL Analog_Dog_Watch_For_Lower_Than LDR R4,=2 STRB R4, [R5] B Fin_case break PAS_ETAT_1 CASE(2) CMP R4, #2 BNE PAS_ETAT_2 Programmation next interruption LDR R0,=Seuil_debut_lecture_croissant BL Analog_Dog_Watch_For_Higher_Than LDR R4,=3 STRB R4, [R5] B Fin_case PAS_ETAT_2 CASE(3) debut de la lecture dans le sens croissant CMP R4, #3 BNE PAS_ETAT_3 sens lecture croissant MOV R0,#1 Page: 2
U:\documents\Informatique\3annee\Assembleur\colis_tp_asm_v20009_...\handler_detection.s BL Give_sens_lecture_trame activation lecture trame MOV R0,#1 BL Give_activation_SysTick_Handler Programmation next interruption LDR R0,=Aceleration_trop_eleve_croissant BL Analog_Dog_Watch_For_Higher_Than LDR R4,=0 STRB R4, [R5] B Fin_case PAS_ETAT_3 Fin_case BL Acquite_ADC acquittement sinon l'interruption reste toujours active! POP {R4,R5} retour d'interruption LDR LR,=0xFFFFFFF9 (au cas ou LR ai été modifié par le code) BX LR ENDP INIT_ADC_IRQHandler PROC EXPORT INIT_ADC_IRQHandler PUSH {LR} LDR R0,=Aceleration_trop_eleve_decroissant BL Analog_Dog_Watch_For_Higher_Than POP {LR} BX LR ENDP END module asm Page: 3