Bienvenue aux nouveaux arrivants sur FantasPic !
- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.
--- L’équipe FantasPic ---
- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.
--- L’équipe FantasPic ---
Modérateur : Gérard
probleme avec programme mikropascal
bonjour a tous , j'ai un petit probleme avec mon progrmme qui est ecrit en mikropascal , j'utilise un 16f84a et le debordement du TMR0 et RB0/int , a chaque debordement du TMR0 j'increment une variable cmpt_TMR0 et a chaque fois que RB0/int reçois une impultion j'increment une autre variable cmpt_RB0
puis je compare les deux variable et si cmpt_TMR0 > cmpt_RB0 j'active les RA0 et RA1 , mais qu'on je fais la simulation mon programme bug il m'active a chaque foie les pin RA0 et RA1 RA2 RA3 voici le programme et quelqu'un pourrais voir
puis je compare les deux variable et si cmpt_TMR0 > cmpt_RB0 j'active les RA0 et RA1 , mais qu'on je fais la simulation mon programme bug il m'active a chaque foie les pin RA0 et RA1 RA2 RA3 voici le programme et quelqu'un pourrais voir
Code : Tout sélectionner
program TMR0 ;
var
cmpt_RB0 : byte ;
cmpt_TMR0 : byte ;
val_TMR0 : byte;
bIntRB0 : boolean ;
bIntT0 : boolean ;
procedure Interrupt ;
begin
// interruption liée a l'etat logique de RB0 ?
if INTCON.INTF = 1 then
begin
INTCON.INTF := 0 ; // remise a zéro du bit d'état de l'interruption RB0/INT
bIntRB0 := true ;
end;
// interruption liée au TMR0 ?
if INTCON.T0IF = 1 then
begin
INTCON.T0IF := 0 ; // remise a zéro du bit d'état de l'interruption Timer0
bIntT0 := true ; // en garde ce bit pour l'éxploiter plus tard
end;
end;
begin
TRISA := %00000000 ; //toutes les ligne du port A en sortie
TRISB := %11111111 ; //toutes les ligne du port B en entrée
OPTION_REG := %01000000 ;
INTCON.INTF := 0 ; // mise a zéro du bit d'indication (flag) INTF
INTCON.INTE := 1 ; // activation de l'interruption RB0/INT
INTCON.GIE := 1 ; // activation des générale des interruptions
INTCON.T0IE := 1 ; // activation de l'interruptions TMR0
INTCON.T0IF := 0 ; // mise a zéro du bit d'indication (flag) T0IF
TMR0 := 0 ;
while true do
// interruption détectée pour le Timer0, on fait maintenan ce qu'il faut
if bIntRB0 = true then
begin
PORTA.2 := 1 ; // allumage de la LED cablée sur RA2
Delay_ms(10000); // temps d'extinction de la LED
PORTA.2 := 0 ; // extinction de la LED RA2
bIntRB0 := false ; // effacement de la variable
INTCON.T0IF := 0 ; // remise a zéro du (flag) T0IF
TMR0 := $00; //remise a zéro du TMR0
cmpt_RB0 := $00 ; // remise a zéro de cmpt_RB0
cmpt_RB0 := cmpt_RB0+1 ; // on incrémente le compteur de RB0
end
else
nop ;
if bIntT0 = true then
begin
PORTA.3 := 1 ; // allumage ou extinction de la LED cablée sur sur RA3
Delay_ms(10000); // temps d'extinction de la LED
PORTA.3 := 0 ; // extinction de la LED
bIntT0 := false ; // effacement de la variable bintT0
INTCON.T0IF := 0 ; // remise a zéro du (flag) T0IF
TMR0 := $00 ; // remise a zéro du TMR0
cmpt_TMR0 := cmpt_TMR0+1 ; // on incrémente le compteur
end
else
nop ;
if INTCON.T0IF =1 then
begin
INTCON.T0IE := 0 ; // on interdit les interruption TMR0
INTCON.T0IF := 0 ; // remise a zéro du (flag) T0IF du TMR0
TMR0 := val_TMR0 ; // on lit la valeur du TMR0 et on l'affect a val_TMR0
end
else
nop ;
if cmpt_TMR0 > cmpt_RB0 then
begin
PORTA.0 := 1 ; // activation broche RA0
Delay_ms(10000); // temps d'extinction de la LED
PORTA.0 := 0 ; // désactivation de RA0
PORTA.1 := 1 ; // activation broche RA1
Delay_ms(10000) ; // temps d'extinction de la LED
PORTA.1 := 0 ; // désactivation de RA1
end
else
nop ;
end.
probleme avec programme mikropascal
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
bonsoir,
j'ai pas bien compris le but de ce programme..
Je ne pratique pas le pascal MikroE..mais j'ai eu pratiqué Pascal3 et Delphi 5
mais je pense que lesdites incrementation doivent se faire DANS l'interruption
vu les grandes tempos utilisées dans le traitement des flags BIntRB0 et BintT0
de meme
cette partie doit etre dans l'interrupt de TMR0
pas dans le main
j'ai pas bien compris le but de ce programme..
a chaque debordement du TMR0 j'increment une variable cmpt_TMR0 et a chaque fois que RB0/int reçois une impultion j'increment une autre variable cmpt_RB0
Je ne pratique pas le pascal MikroE..mais j'ai eu pratiqué Pascal3 et Delphi 5
mais je pense que lesdites incrementation doivent se faire DANS l'interruption
vu les grandes tempos utilisées dans le traitement des flags BIntRB0 et BintT0
de meme
cette partie doit etre dans l'interrupt de TMR0
pas dans le main
Code : Tout sélectionner
if INTCON.T0IF =1 then
begin
INTCON.T0IE := 0 ; // on interdit les interruption TMR0
INTCON.T0IF := 0 ; // remise a zéro du (flag) T0IF du TMR0
TMR0 := val_TMR0 ; // on lit la valeur du TMR0 et on l'affect a val_TMR0
end
probleme avec programme mikropascal
bonjour tout le monde , et paulfjujo pour votre réponse , le bute du programme du programme et tré simple , mon PIC16f84a reçois une fréquence précise c_a_d des impulsion qui son reçue dans la pin RB0 , et si il ya pas cette fréquence précise j'active les pin RA0 et RA1 du portA normalement il est claire le but du programme et merci encore pour vos réponse
probleme avec programme mikropascal
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
bonjour,
il y a de fortes chances que ce bout de code soit jamais executé
vu que Intcon.T0IF est Razé dans l'interrupt .
Pourqoi ne pas integrer les actions directement dans le main
pour allumer la led..
et dans le main, si le drapeau est lévé, l'eteindre apres une tempo.
ou sinon utiliser TMR0 comme compteur sur entree RA4
et un timer1 de 1sec pour mesurer cycliquement la frequence.en HZ.
et un seuil dans le main pour allumer ou pas la led
il y a de fortes chances que ce bout de code soit jamais executé
vu que Intcon.T0IF est Razé dans l'interrupt .
Code : Tout sélectionner
if INTCON.T0IF =1 then
begin
INTCON.T0IE := 0 ; // on interdit les interruption TMR0
INTCON.T0IF := 0 ; // remise a zéro du (flag) T0IF du TMR0
TMR0 := val_TMR0 ; // on lit la valeur du TMR0 et on l'affect a val_TMR0
end
else
nop ;
Pourqoi ne pas integrer les actions directement dans le main
pour allumer la led..
et dans le main, si le drapeau est lévé, l'eteindre apres une tempo.
ou sinon utiliser TMR0 comme compteur sur entree RA4
et un timer1 de 1sec pour mesurer cycliquement la frequence.en HZ.
et un seuil dans le main pour allumer ou pas la led
Retourner vers « Langage BASIC & PASCAL »
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 39 invités