Précédent   Forum des professionnels en informatique > Autres langages > Assembleur > Autres architectures
Autres architectures Toutes les autres architectures (PIC, MIPS, ARM, 68K, Z80...) et leurs outils
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/02/2012, 20h22   #1
Invité de passage
 
Inscription : 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
titititi38 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2012, 11h39   #2
Membre régulier
 
Avatar de aslo92
 
Homme
Ingénieur développement logiciels temps réel
Inscription : 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 : 70
Points : 70
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
aslo92 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h44.


 
 
 
 
Partenaires

Hébergement Web