IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Autres architectures Assembleur Discussion :

[8051] Projet d'étudiant chronomètre


Sujet :

Autres architectures Assembleur

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2024
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2024
    Messages : 2
    Points : 1
    Points
    1
    Par défaut [8051] Projet d'étudiant chronomètre
    Bonjour à tous et à toutes,

    Je suis étudiant et dans le cadre de mes études nous sommes amenés à réaliser un programme faisant un chronomètre sur 6 afficheurs 7 segments avec chaque groupement de 2 segment représentant les unités et les dizaines des heures, des minutes et des secondes.

    J'ai plusieurs problème pour commencer je n'arrive pas à afficher mes 6 afficheurs 7 segments sur mon logiciel, on utilise la version Keil uVision5 et on a un plugin 7 segment qui est régi par un code XML mais je ne comprend pas comment faire pour ajouter mes afficheurs et surtout pour que cela fonctionne.

    Deuxièmement j'ai réussi à faire mon chronomètre mais uniquement pour les secondes et les unités des minutes car quand je souhaite ajouter d'autres pins le programme me dis que c'est impossible car ils sont déjà utilisé ailleurs.

    Je vous remercie par avance de toute l'aide que vous pourrez m'apporter.

    (Je ne peux apparemment pas mettre mon fichier sur le forum je vous envoie donc le code brut est une copie écran du résultat)

    Code asm : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    ; Initialisation des adresses mémoire pour les variables
    ORG 0H
    		RAM1 EQU 007Ch
    		RAM2 EQU 007Dh
    		RAM3 EQU 007Eh
     
    		; Déclaration des variables pour les unités, dizaines et centaines
    		Unites DATA RAM1
    		Dizaines DATA RAM2
    		Centaines DATA RAM3
     
    		; Constantes pour les valeurs THIGH et TLOW
    		THIGH EQU 0CBH
    		TLOW EQU 0EAH
     
    		; Définition de la deuxième page de la mémoire
    		RAM EQU 07FH  ; 7F = 128 bits
     
    		; Déclaration des variables Itr et COMPT
    		Itr DATA RAM
    		COMPT DATA RAM - 1
     
    		; Définition de la valeur de NCYC
    		NCYC EQU 1  ; Changez cette valeur si nécessaire
     
    		; Saut vers l'adresse 50H pour démarrer le programme
    		LJMP 50H
     
    ; Vecteur d'interruption INT0 (START/STOP)
    ; Utilisez la fonction CPL pour Démarrer/Arrêter le temporisateur
    ORG 0003H
    		LJMP INT0_ISR
     
    ; Implémentation de la routine d'interruption INT0
    INT0_ISR:
    		SETB P3.2       ; Activer le port P3.2
    		CPL TR0         ; Inverser l'état du compteur TIMER0
    		RETI            ; Retour de l'interruption
     
    ; Vecteur d'interruption TIMER0
    ORG 000BH
    		LJMP T0ISR
     
    ; Vecteur d'interruption INT1
    ORG 0013H
    		LJMP INT1_ISR
     
    ; Implémentation de la routine d'interruption INT1
    INT1_ISR:
    		SETB P3.3       ; Activer le port P3.3
    		JB TR0, NOT_RUNNING ; Vérifier si le compteur TIMER0 est arrêté
    		CLR TR0         ; Si oui, arrêter le compteur TIMER0
     
    		; Réinitialiser les variables Unites, Dizaines et Centaines à zéro
    		MOV Centaines, #0
    		MOV Dizaines, #0
    		MOV Unites, #0
     
    		; Affichage des centaines, dizaines et unités
    		MOV A, Centaines
    		CALL LED7
    		MOV R2, A
     
    		MOV A, Dizaines
    		CALL LED7
    		MOV R1, A
     
    		MOV A, Unites
    		CALL LED7
    		MOV R0, A
     
    		; Sauter à la sortie de l'interruption
    		LJMP EXIT_ISR
     
    ; Si le compteur TIMER0 n'est pas arrêté, sortir de l'interruption
    NOT_RUNNING:
    		LJMP EXIT_ISR
     
    ; Sortie de l'interruption
    EXIT_ISR:
    		RETI
     
    ; Initialisation du programme principal
    ORG 50H
    		CLR P3.7            ; Effacer le port P3.7
    		MOV R0, #00         ; Initialiser R0 à zéro
    		MOV COMPT, #00      ; Initialiser COMPT à zéro
    		MOV Itr, #NCYC      ; Initialiser Itr à NCYC
     
    		; Configuration du TIMER0
    		MOV TMOD, #00000001B ; Gated 16-bit TIMER0 
    		MOV TCON, #00000001B ; Exécution de TIMER0 et configuration de EXT0 sur front négatif
    		MOV IE, #10000111B   ; Autorisation des interruptions pour TIMER0 et EXT0
     
    		; Initialisation des valeurs pour le TIMER0
    		MOV TH0, #THIGH      ; Initialiser TH0 à THIGH
    		MOV TL0, #TLOW       ; Initialiser TL0 à TLOW
     
    boucle:
    		MOV P0, R0      ; Afficher les unités
    		MOV P0, #0      ; Rafraîchir l'afficheur 7 segments
    		MOV P1, R1      ; Afficher les dizaines
    		MOV P1, #0      ; Rafraîchir l'afficheur 7 segments
    		MOV P2, R2      ; Afficher les centaines
    		MOV P2, #0      ; Rafraîchir l'afficheur 7 segments
    		SJMP boucle     ; Boucle infinie
     
    ; Routine d'interruption TIMER0
    T0ISR:
    		DJNZ Itr, SAUT  ; Décrémenter Itr et sauter à SAUT si différent de zéro
    		LJMP SORTIE     ; Sauter à SORTIE si Itr est nul
     
    SAUT:
    		CLR TR0         ; Arrêter le TIMER0
    		MOV TH0, #THIGH ; Réinitialiser TH0 à THIGH
    		MOV TL0, #TLOW  ; Réinitialiser TL0 à TLOW
    		SETB TR0        ; Activer le TIMER0
    		RETI            ; Retour de l'interruption
     
    SORTIE:
    		CLR TR0         ; Arrêter le TIMER0
    		MOV TH0, #THIGH ; Réinitialiser TH0 à THIGH
    		MOV TL0, #TLOW  ; Réinitialiser TL0 à TLOW
    		SETB TR0        ; Activer le TIMER0
    		CPL P3.7        ; Inverser l'état de P3.7
    		MOV Itr, #NCYC  ; Réinitialiser Itr à NCYC
    		INC Unites      ; Incrémenter les unités
     
    		; Vérifier si les unités sont égales à 10
    		MOV A, Unites
    		CJNE A, #10, EndIf_Unites
    		INC Dizaines    ; Incrémenter les dizaines
    		MOV Unites, #0  ; Réinitialiser les unités à zéro
    EndIf_Unites:
     
    		; Vérifier si les dizaines sont égales à 10
    		MOV A, Dizaines
    		CJNE A, #6, EndIf_Dizaines
    		INC Centaines   ; Incrémenter les centaines
    		MOV Dizaines, #0 ; Réinitialiser les dizaines à zéro
    EndIf_Dizaines:
     
    		; Vérifier si les centaines sont égales à 10
    		MOV A, Centaines
    		CJNE A, #10, EndIf_Centaines
    		MOV Centaines, #0 ; Réinitialiser les centaines à zéro
    EndIf_Centaines:
     
    		; Affichage des centaines
    		MOV A, Centaines
    		CALL LED7
    		MOV R2, A
     
    		; Affichage des dizaines
    		MOV A, Dizaines
    		CALL LED7
    		MOV R1, A
     
    		; Affichage des unités
    		MOV A, Unites
    		CALL LED7
    		MOV R0, A
     
    		RETI
     
    	; Tableau de correspondance pour l'affichage des chiffres sur l'afficheur 7 segments
    LED7:
    		INC A
    		MOVC A,@A+PC
    		RET
    TABLE:
    		DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H, 6FH, 0FFH, 0
     
    END ; Mot clé indiquant la fin du code
    Fichiers attachés Fichiers attachés

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 124
    Points : 177
    Points
    177
    Par défaut
    Il aurait été bien de nous dire de quel assembleur il s'agit (on dirait du Z80) et de la façon dont on commande les afficheurs.
    Un petit schéma ou même une description logicielle serait un plus.
    Par exemple, à quoi servent les variables THIGH, TLOW et autres Itr, COMPT ou NCYC, bref, l'environnement du bout de code que tu nous montres...

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2024
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2024
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Oui vous avez raison mais je ne suis pas très bien calé sur le sujet je vais faire de mon mieux pour transmettre ce que j'ai compris.
    Notre micropro est le 8051 est on utilise l'assembleur ASM51 si je ne me trompe pas.
    Pour le fonctionnement de l'afficheur je n'ai moi même pas très bien compris mais chaque port correspond à un afficheur et celui ci vient être actualisé à l'aide de la commande CALL LED7

    Concernant les variables celle ci était déjà initialisé dans l'extrait de code qu'on nous a fourni, de ce que j'ai compris COMPT c'est le compteur mais finalement avec mon approche je crois que je ne l'utilise pas vraiment
    THIGH et TLOW sont les valeurs max du chronomètre
    NCYC permet de jouer sur la durée réelle d'une seconde quand on l'initialise à 100 on obtient un chronomètre qui respectent la durée de 1s

    Je n'ai malheureusement pas de schéma, on est un peu livrés a nous même

Discussions similaires

  1. Qu'est ce qu'un grand projet ?
    Par Geronimo dans le forum Débats sur le développement - Le Best Of
    Réponses: 62
    Dernier message: 04/04/2013, 15h52
  2. [Delphi] Association composants-projet
    Par Pierre Castelain dans le forum Composants VCL
    Réponses: 6
    Dernier message: 31/07/2002, 17h20
  3. Parametrage des options de projet
    Par ares7 dans le forum EDI
    Réponses: 7
    Dernier message: 22/07/2002, 16h33
  4. Réponses: 6
    Dernier message: 21/06/2002, 15h48
  5. Les fichiers d'un projet
    Par Manolo dans le forum C++Builder
    Réponses: 4
    Dernier message: 07/05/2002, 18h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo