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 ---
Forum général en BASIC et PASCAL !

Modérateur : Gérard

probleme avec programme mikropascal
aigle666
Membre
Membre
Messages : 2
Enregistré en : février 2017

#1 Message par aigle666 » dim. 18 juin 2017 20:11

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

 ! Message de modération :
rajout de balises "code"

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 := ;   // 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 := ;  // 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 := // mise a zéro du bit d'indication (flag) INTF
   
INTCON.INTE := // activation de l'interruption RB0/INT
   
INTCON.GIE  := // activation des générale des interruptions
   
INTCON.T0IE := // activation de l'interruptions TMR0
   
INTCON.T0IF := // mise a zéro du bit d'indication (flag) T0IF
   
TMR0 := ;

   while 
true do
   
// interruption détectée pour le Timer0, on fait maintenan ce qu'il faut

      
if bIntRB0 true then
                begin

                  PORTA.2 
:= // allumage de la LED cablée sur RA2
                  
Delay_ms(10000); // temps d'extinction de la LED
                  
PORTA.2 := // extinction de la LED RA2
                  
bIntRB0 := false // effacement de la variable
                  
INTCON.T0IF := // 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+// on incrémente le compteur de RB0
                
end
                       
else

                           
nop ;

      if 
bIntT0 true then
               begin

                 PORTA.3 
:= // allumage ou extinction de la LED cablée sur sur RA3
                 
Delay_ms(10000); // temps d'extinction de la LED
                 
PORTA.3 := // extinction de la LED
                 
bIntT0 := false // effacement de la variable bintT0
                 
INTCON.T0IF := // remise a zéro du (flag) T0IF
                 
TMR0 := $00 // remise a zéro du TMR0
                 
cmpt_TMR0 := cmpt_TMR0+// on incrémente le compteur
               
end
                       
else
                            
nop ;

      if 
INTCON.T0IF =1  then
               begin
               
                  INTCON
.T0IE := // on interdit les interruption TMR0
                  
INTCON.T0IF := // 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 
:= // activation broche RA0
                  
Delay_ms(10000); // temps d'extinction de la LED
                  
PORTA.0 := // désactivation de RA0
                  
                  
PORTA.1 := // activation broche RA1
                  
Delay_ms(10000) ; // temps d'extinction de la LED
                  
PORTA.1 := // désactivation de RA1
                  
                
end
                     
else
                          
nop ;
                          
end

probleme avec programme mikropascal
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#2 Message par paulfjujo » mar. 20 juin 2017 20:15

bonsoir,

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 := // on interdit les interruption TMR0
                  
INTCON.T0IF := // 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
Aide toi, le ciel ou FantasPic t'aidera

probleme avec programme mikropascal
aigle666
Membre
Membre
Messages : 2
Enregistré en : février 2017

#3 Message par aigle666 » sam. 24 juin 2017 01:51

bonjour tout le monde , et Merci ! 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
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#4 Message par paulfjujo » sam. 24 juin 2017 08:51

bonjour,

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 := // on interdit les interruption TMR0
                  
INTCON.T0IF := // 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
Aide toi, le ciel ou FantasPic t'aidera


Retourner vers « Langage BASIC & PASCAL »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 20 invités