Bonjour,

Je suis débutant en assembleur et j'ai un souci avec le programme que j'ai fait sur Keil Micro Vision pour un microcontrôleur 8051, C8051F99x-C8051F98x.
J'aimerais créer deux interruptions :

  • une interruption pour le Timer 0 : j'aimerais que le timer se resette toutes les 1ms, et compter le nombre de débordements qu'il fait ;
  • une interruption extérieure 0 qui, lorsqu'elle se passe, incrémente dans une variable le nombre de fois qu'elle est arrivée et, lorsque cette variable vaut 14, alors je fais le calcul 2014/nombre de débordements du timer 0.

Mon programme fonctionne jusqu'à : MOV TH0,#0F8H;Ensuite j'ai le message :
*** Power Down Mode invoked. Continue with RESET ***
Puis je relance le programme et j'ai :
*** error 65: access violation at C:0x0732 : no 'execute/read' permission
J'ai l'impression que mon timer 0 commence à compter depuis le début et qu'il déborde mais n'arrive pas à accéder à ce qu'il doit faire en cas de débordement, pourtant le SETB TR0 est mis bien plus loin dans mon programme.
Si vous pouviez m'aider je vous en serais très reconnaissant.

Cordialement,


Code : 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
DEBORDEMENT EQU 0F1H ; déclaration de la variable qui compte le nombre de débordement du timer 0 
COMPTEUR_ROUE EQU 0F2H ; déclaration de la variable qui compte de TOP du codeur incrémental
TEMPS_1TOUR_ROUE EQU 0F3H;
CONSTANTE_MULTIPLICATIVE EQU 0F4H;
VITESSE_KM_H EQU 0F5H;
TOUR_DE_ROUE EQU 0F6H;
 
 
ORG 00H ; 
AJMP initialisation
 
 
ORG 060H;
main:
 
JB TOUR_DE_ROUE,Saut
Saut: lcall Calcul
;JB TF0,Saut2
 
 
;CJNE A,#014H,Compteurr ; saut pour incrémenter le compteur si le compteur n'est pas égal à 20
 
 
SJMP main
 
 
 
ORG 3H;la prochaine instruction sera à l'adresse 03H, adresse correspondant à l'interruption extérieure 0
LJMP Compteurr
 
ORG 0BH;la prochaine instruction sera à l'adresse 03H, adresse correspondant à l'interruption timer 0
LJMP Debordementt
 
 
 
ORG 90H ; la prochaine instruction sera à l'adresse 0H, adresse correspondant à l'interruption du RESET
initialisation:
;Registre
SETB EA
MOV SCON, #00000000b;
MOV SBUF, #00000000b;
MOV TMOD, #00000001b; choix du mode 1, timer en 16 bits
MOV TCON, #00000001b;
MOV PCON, #00000000b;
 
;Timer 0
MOV TH0,#0F8H; mise à zéro des 8 bits de poids forts du timer 0
MOV TL0,#030H; mise à zéro des 8 bits de poids faibles du timer 0
 
;Timer 1
MOV TH1,#0FH; mise à zéro des 8 bits de poids forts du timer 1
MOV TL1,#0FH; mise à zéro des 8 bits de poids faibles du timer 1
 
;Initialisation des ports
MOV P0,#0H
MOV P1,#0H
MOV P2,#0H
MOV P3,#11111100b
 
;Interruptions
MOV IP, #00000000b;
MOV IE, #10000101b;activation de l'interruption externe 0
 
;Variables
MOV COMPTEUR_ROUE,#0; initilisation à zéro du compteur
MOV Debordement,#0
MOV TEMPS_1TOUR_ROUE,#0
;MOV CONSTANTE_MULTIPLICATIVE,#1518H; (1,5*3600) permet de convertir un temps en mms en km/h, en utilisant un perimètre de 1,5 mètre
 
SETB TR0; lancement du timer 0
ljmp main
 
;fin initialisation    
 
ORG 70H
Compteurr:
Push ACC
INC COMPTEUR_ROUE
MOV A,COMPTEUR_ROUE
CJNE A,#014H,Retour
SETB TOUR_DE_ROUE
Retour:
POP ACC
RETI
 
ORG 80H
Calcul: ;Calcul_du_temps_d'un_tour_de_roue
MOV TEMPS_1TOUR_ROUE,DEBORDEMENT ; valeur du temps d'un tour de roue en millisecondes
;DIV CONSTANTE_MULTIPLICATIVE,TEMPS_1TOUR_ROUE;
;MOV VITESSE_KM_H,CONSTANTE_MULTIPLICATIVE
RET
 
ORG 0A0H
Debordementt:
CLR TF0 ; remise à zéro du flag de débordement du timer 0
INC DEBORDEMENT
RETI
 
END