Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 2 sur 2
  1. #1
    Invité de passage
    Inscrit en
    février 2012
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : février 2012
    Messages : 1
    Points : 0
    Points
    0

    Par défaut Problème call dans une interruption 80C51

    Bonjour à tous, je suis en train de m'autoformer à la programmation des microcontroleurs de type 80c51 (j'utilise un P89V51RD2), en langage assembleur. J'ai déja reussi à faire pas mal de choses comme allumer des leds, piloter un afficheur LCD, dialoguer avec le PC via la connexion UART RS232, mais là j'attaque le chapitre des interruptions et je bloque.

    J'ai un programme tout bête qui allume des leds une à une avec une tempo de 0.2s entre deux. J'arrive à génerer 2 interruptions exterieurs avec 2 BP, un sur l'entrée INT0 et l'autre sur l'entrée INT1.
    Quand j'appuie sur le 1er BP ça allume toutes les leds du port P0, et instantanement après, le programme principal reprend son cours là où il en était resté.
    Quand j'appuie sur le 1er BP ça allume toutes les leds du port P2, et instantanement après, le programme principal reprend son cours là où il en était resté.

    Là ca fonctionne bien.

    Maintenant si je rajoute l'instruction CALL TEMPO (en bleu), et que j'appui par exemple sur le 1er BP, toutes les leds du port P0 s'allume, mais après le micro met environ 30s pour retourner au programme principal.
    Pourquoi ?
    La tempo générée par le sous-programme TEMPO ne dure que 0.2s. C'est la même utilisée dans le programme principal.
    A-t-on le droit d'utiliser l'instruction CALL ou LCALL dans une interruption?

    Je développe avec Keil µvision3 et je programme le micro avec flash magic.
    Voici mon programme :

    Merci d'avance pour votre aide.

    Code :
    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
    ORG 0000h
    JMP 053h
    
    ORG 0003h				 // Interruption INT0
    MOV P0,#0h							
    CALL TEMPO
    RETI
    
    
    ORG 0013h				 // Interruption INT1
    MOV P2,#0h
    CALL TEMPO
    RETI
    
    ORG 053h
    
    MOV 0A8h, #0h			 // Tout le registre d'activation des interruptions est mis a 0 inactif
    SETB 0AFh				 // Activation generale des interruptions
    SETB 0A8h				 // Activation de l'interruption INT0
    SETB 0AAh				 // Activation de l'interruption INT1
    
    SETB 88h				 // Declenchement de l'interruption INT0 par front descendant
    SETB 8Ah				 // Declenchement de l'interruption INT1 par front descendant
    
    MOV 0B8h, #0h			 // Tout le registre de gestion des priorites des interruptions est mis a 0 priorite basse
    
    DEBUT :
    MOV P0, #0FFh
    MOV P1, #0FFh
    MOV P2, #0FFh
    MOV P3, #0FFh
    
    MOV P1, #0FEh
    CALL TEMPO
    MOV P1, #0FCh
    CALL TEMPO
    MOV P1, #0F8h
    CALL TEMPO
    MOV P1, #0F0h
    CALL TEMPO
    MOV P1, #0E0h
    CALL TEMPO
    MOV P1, #0C0h
    CALL TEMPO
    MOV P1, #080h
    CALL TEMPO
    MOV P1, #00h
    CALL TEMPO
    
    MOV P3, #0EFh
    CALL TEMPO
    MOV P3, #0CFh
    CALL TEMPO
    MOV P3, #08Fh
    CALL TEMPO
    MOV P3, #0Fh
    CALL TEMPO
    
    MOV P0, #0FEh
    CALL TEMPO
    MOV P0, #0FCh
    CALL TEMPO
    MOV P0, #0F8h
    CALL TEMPO
    MOV P0, #0F0h
    CALL TEMPO
    MOV P0, #0E0h
    CALL TEMPO
    MOV P0, #0C0h
    CALL TEMPO
    MOV P0, #080h
    CALL TEMPO
    MOV P0, #00h
    CALL TEMPO
    
    MOV P2, #07Fh
    CALL TEMPO
    MOV P2, #03Fh
    CALL TEMPO
    MOV P2, #01Fh
    CALL TEMPO
    MOV P2, #0Fh
    CALL TEMPO
    MOV P2, #07h
    CALL TEMPO
    MOV P2, #03h
    CALL TEMPO
    MOV P2, #01h
    CALL TEMPO
    MOV P2, #00h
    CALL TEMPO
    
    JMP DEBUT
    
    TEMPO :
    MOV 32h,#3
    bcl3: MOV 30h,#255
    bcl2: MOV 31h,#255
    bcl1: DJNZ 31h,bcl1
    DJNZ 30h,bcl2
    DJNZ 32h,bcl3
    RET
    
    END

  2. #2
    Membre régulier Avatar de aslo92
    Homme Profil pro
    Ingénieur développement logiciels temps réel
    Inscrit en
    février 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels temps réel
    Secteur : Industrie

    Informations forums :
    Inscription : février 2012
    Messages : 43
    Points : 72
    Points
    72

    Par défaut

    bonjour titititi38

    Je vais peut-être dire une bétise, mais pourquoi n'utilises tu pas les timers du microcontrolleur pour faire tes temporisations ?

    Je programmerai une interruption timer dans la routine d'interruption et je placerai l'allumage de la LED dans les routines du timer.

    Tu peux trouver des infos sur la programmation des timers 8051 ici:

    http://www.engineersgarage.com/tutor...mming-tutorial

    Ton sous-programme TEMPO ne me semble pas très précis vu qu'il utilise 3 boucles imbriquées pour réaliser un délai.

    De plus je confirme que le temps passé dans une routine d'interruption doit être le plus court possible

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •