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 sur le langage C !

Modérateur : Jérémy

Interruption traitement invisible
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2597
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#1 Message par paulfjujo » jeu. 17 sept. 2020 16:42

Bonjour à tous,

Ayant participé à un post sur Edaboard pour tester un programme 16F887 gérant 2 servos avec 2 potars sur Entrées Analogiques
:mur: je suis tombé (ENCORE !) sur un problème

j'utilise MikroC 7.6.0
le source C original compilé tel quel, avec une definition
void Interrupt(){ ...etc
donne un HEX qui ne voit pas le code contenu dans l'interruption .. donc ne marche pas (chez moi )
avec Hardwre minimalise : 16F887 sur breadboard et FOSC interne

mais le *.HEX original compilé tel quel, par ailleurs .. avec hardware sur carte Explorer ! FOSC interne.
avec MikroC 7.6.0 ...
voit bien le traitement void Interrupt(){ ...etc .. programme *.Hex original OK' ! aussi sur mon Hardware .

mais si je modifie le source C en déclarant l'interrupt
void Interrupt() iv 0x0004 ics ICS_AUTO { <-via l'assistant mikroC interruptions
Le code interrupt est alors bien vu!
.. et le programme tourne OK

en regardant les fichiers log générés dans les 3 cas
1) avec le *.HEX original avec void Interrupt(){ ...etc
log original
RAM 13
ROM 267

2) si je recompile le source C original, sans le modifier :
log obtenu :
RAM 8
ROM 143
le code dans l'interrupt n'est pas vu ????
le programme ne marche pas .

si je change la syntaxe de l'interruption
void Interrupt() iv 0x0004 ics ICS_AUTO {
nouveau log obtenu
RAM 13
ROM 267
le programme tourne OK
le traitement interruption est vu !

est-ce un problème de version MikroC
malgré le visu sur une meme version 7.6.0 .. mais peut etre avec des patches.
:!!: j'ai une mise à jour automatique ..

Une ame charitable pour faire ce test de definition interruption ?

=========================================
Aide toi, le ciel ou FantasPic t'aidera

Interruption traitement invisible
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2597
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#2 Message par paulfjujo » jeu. 17 sept. 2020 16:45

EUREKA ! j'ai trouvé
:+1: il n'y a pas le panneau -1 !!!

Aides toi, le ciel t'aidera , ça marche ! même sans prier !

ça marche avec la syntaxe Correcte !
void interrupt() { ....

because j'ai
Tools
....Output
......compiler
........Case sensitive coché

:furieux:
ce n'est quand meme pas coherent avec l'assistant mikroC
qui permet Interrupt avec un I majuscule !
Aide toi, le ciel ou FantasPic t'aidera

Interruption traitement invisible
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2616
Enregistré en : juillet 2016
Localisation : Terre

#3 Message par Temps-x » ven. 18 sept. 2020 04:03

Bonsoir paulfjujo, et tout le forum,

paulfjujo a écrit :Source du message :+1: il n'y a pas le panneau -1 !!!

CAUDZYZ4.png


Tu peux maintenant utiliser le panneau -1

paulfjujo a écrit :Source du message ça marche avec la syntaxe Correcte !

oops ... Bon... la il manque encore un panneau, je te laisse deviner lequel ça peut être exit

==> A+
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

Interruption traitement invisible
venom
Avatar de l’utilisateur
Confirmé
Confirmé
Messages : 960
Âge : 38
Enregistré en : avril 2016
Localisation : Klyntar
Contact :

#4 Message par venom » ven. 18 sept. 2020 06:20

Bonjour à tous.

Content que tu ai résolu ton problème.
Qu'entend tu par Case sensitive coché ?






@++
Mon site web
Mon discord : venom#4888

Interruption traitement invisible
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2597
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#5 Message par paulfjujo » ven. 18 sept. 2020 12:45

bonjour à tous,



j'avais oublié de joindre le fichier ayant servi à ce test
Test_2_servo_16F887_forum_Hexreader_rev_2020_0917.c.txt


MoinsUnpluPlusUnegalZero.jpg



Venom a écrit :Content que tu ai résolu ton problème...


De fait , le probleme n'est pas de mon coté , le source original n'etant pas de moi ,
mais du fait que la definition "normale" de interrupt commence par une minusucle ..
le fait de decocher la case "case sensitive" permet beaucoup plus d'ecart entre les definitions de variables
et parfois des telescopages entre variables .. c'est pourquoi je m'astreins à utiliser Case sensitive cochée
ayant déja eu à faire avec ce genre de probleme.

je remarque aussi que MikroC est tres ( trop) permitif avec le nom de traitement interrupt
lorsqu'on utilise -> Tools --> Interrupt assistant
on peut mettre n'importe quoi dans le champ nom d'interruption , dont
Interrupt avec un I majuscule ..
et meme

Code : Tout sélectionner

 void Toto_le_Rigolo() iv 0x0004 ics ICS_AUTO 


ça marche aussi !


option case sensitive
MikroC_option_case_sensitive.jpg


MikroC_Tools_Interrupt_assistant.jpg
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Aide toi, le ciel ou FantasPic t'aidera

Interruption traitement invisible
venom
Avatar de l’utilisateur
Confirmé
Confirmé
Messages : 960
Âge : 38
Enregistré en : avril 2016
Localisation : Klyntar
Contact :

#6 Message par venom » ven. 18 sept. 2020 16:20

Ah d'accord, je n'avais pas connaissance de cette case. Merci pour les explications.






@++
Mon site web
Mon discord : venom#4888

Interruption traitement invisible
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2597
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#7 Message par paulfjujo » ven. 18 sept. 2020 17:57

bonsoir,


Version plus comprehensible avec usage de timer2 pour piloter les servos façon "state machine"

Code : Tout sélectionner



#define Version "2020_0918"
#define Directory  "C:\\_MikroC\\_MesProjets_MikroC\\_16F877_2servomoteurs"
#define Source     "Test_2_servo_16F887_using_State_Machine_TMR2_TMR1_2xEA_"
#define Project    "Test_2servo_16F887_State_Machine_TMR2_TMR1_2xEA_2020_09.mcppi"
#define MCU "P16F887 Dip40"
#define FOSC_INTERNE      // not needed if FOSC= 4MHZ , because is the default value
#define FOSC "4Mhz"

// voir SQA_test_cde_2servo_16F887_2020_0916.scana
//CONFIG1 : $2007 : 0x2CF4
//CONFIG2 : $2008 : 0x0700

#define Bavard

 //ac:pinout
 
  
//ac:SQA_analyze


// https://www.edaboard.com/threads/16f887-2-axis-joystick-drive-2-servomotors.394685/

// 2 axes joysticks drives 2 servos :
// Servo motor control signals on RB0 and RB1
// Analogue inputs on RA0 and RA1
// MCU : PIC 16F887, internal fosc 4 MHz
// Driving of 2 servomotors :   
// Timer2 drive State machine 
// one step to built the start pulse beginning at a minima of 1mS
// the Timer1 elapsed time value comes from EA0 or EA1  to complete the total time SERVO ON     
// maxima is 2mS !
//                  - servomotor LOWER (360 ° turn) on PORTD.B0 (pin 19),
//                  > Servomotor TOWER PRO MG995 (360 °),
//                  - servomotor UPPER (180 °/270 ° turn) on PORTD.B1 (pin 20),
//                  > Servomotor TOWER PRO MG996R (180 °/270 °),


// global variables
volatile unsigned int Consigne1=0;
volatile unsigned int Consigne2=0;
volatile unsigned int Value_Timer1 ;
int Step=0;

sbit Servo_Lower  at PORTD.B0   ;
sbit Servo_Upper  at PORTD.B1   ;
sbit Servo_Lower_dir  at TRISD.B0   ;
sbit Servo_Upper_dir  at PORTD.B1   ;
sbit SQA at PORTC.B3   ;
sbit SQA_dir  at TRISC.B3 ;
int i,j,k;
char CRam1[80];
char c1,cx;


// void Toto_le_Rigolo() iv 0x0004 ics ICS_AUTO {
//}
void Interrupts() iv 0x0004 ics ICS_AUTO {
//or
//void interrupt ()   // OK
//void Interrupt()    // <- BAD if "Case sensitive" option  is checkek for compiler !
//{
  //TXREG='@';  // to test if interrupt fire

  if ((TMR2IE_bit) && (TMR2IF_bit))
   {
    switch (Step)
    {
       case 0:              // 1rst ms ON on Servo Lower
           SQA=1;
           Servo_Lower=1;
           Servo_Upper=0;
           TMR1ON_bit=0;
           TMR1IF_bit=0;
           TMR1IE_bit=0;
           Step++;
           break;
       case 1:
           Servo_Lower=1;
           Servo_Upper=0;    // TON= 1ms + TMR1 time
           Value_Timer1= 65535-Consigne1;
           TMR1H= Value_Timer1>>8;
           TMR1L=  Value_Timer1 & 0x00FF;
           TMR1IF_bit=0;
           TMR1IE_bit=1;
           TMR1ON_bit=1;
           Step++;
           break;
       case 2 :
           Servo_Lower=0;    // 1rst ms ON on Servo UPPER
           Servo_Upper=1;
           TMR1IE_bit=0;
           TMR1ON_bit=0;
           TMR1IF_bit=0;
           Step++;
           break;
       case 3:
           Servo_Upper=1;    // TON= 1ms + TMR1 time
           Servo_Lower=0;
           Value_Timer1= 65535-Consigne2;
           TMR1H= Value_Timer1>>8;
           TMR1L=  Value_Timer1 & 0x00FF;
           TMR1IF_bit=0;
           TMR1IE_bit=1;
           TMR1ON_bit=1;
           Step++;
           break;
       case 4 :
           Servo_Lower=0;    // 1rst ms ON on Servo UPPER
           Servo_Upper=0;
           TMR1IE_bit=0;
           TMR1ON_bit=0;
           TMR1IF_bit=0;
           SQA=0;
           Step++;
           break;
       case 19 :
           Step=0;
           break;
       default:
           Step++;
           break;
       }
        PR2     = 249;
        TMR2IF_bit = 0;
   }
   // ----------  TMR1 --------------------
    if ( (TMR1IE_bit) && (TMR1IF_bit) )
    {                              // handle timer 1 interrupt

        if (Step==2)   Servo_Lower=0;
        if (Step==4)   Servo_Upper=0;
       TMR1ON_bit=0;
       TMR1IE_bit=0;
       TMR1IF_bit = 0;
    }
}


 void Init_Timer2()
 {
 // at Fosc=4MHz  Actual Interrupt Time : 1 ms
 //Prescaler 1:1; Postscaler 1:4; TMR2 Preload = 249;
  T2CON         = 0x1C;
  PR2           = 250;
  TMR2IE_bit    = 1;
  INTCON        = 0xC0;

}

//Timer1   at  Fosc=4MHz
//Prescaler 1:1; TMR1 Preload = 65036; Actual Interrupt Time : 500 us
//Place/Copy this part in declaration section
void Init_Timer1(){
  T1CON     = 0x01;
  TMR1IF_bit = 0;
  TMR1H     = 0xFE;
  TMR1L     = 0x0C;
  TMR1IE_bit     = 0;
  INTCON= 0x00;
}


void CRLF1(void)
{
    UART1_Write(13);
      UART1_Write(10);
}

void Print( char *T)
{
  while(*(T)>0)
  {
   UART1_Write(*(T++));
   }
 }

void CPrint(const char *T1)
{
  while(*(T1)>0)
  {
   UART1_Write(*(T1++));
   }
 }
 

void main
()
{
#ifdef FOSC_INTERNE
    OSCCON=0;
    OSCCON.IRCF2=1;   // 4MHz
    OSCCON.IRCF1=1;
    OSCCON.IRCF0=0;
    OSCCON.SCS=1;
  //OSCCON=0b01110001 ; // 8MHz (111) & SCS=1  (sinon 4 MHz par defaut)
  //OSCCON=0b01100001 ; // 4 MHz par defaut
  #endif
    ANSEL=0x03;
    TRISC = 0;      // all output
    TRISD = 0;      // all output
    PORTC = 0;      // all outputs low
    PORTD = 0; 
    SQA_dir
=0;
    SQA=0;
    
    ADC_Init
();
    UART1_Init(19200);
   // vider le registre de transmission
    if (UART1_Tx_Idle() == 1)   UART1_Write(' ');
    CRLF1();
    CPrint(" Compiler: MikroC 7.60 \r\n");
    CPrint(" Directory : "Directory"\r\n");
    CPrint(" Source : "Source"Version"Version"\r\n");
    CPrint(" Test 2 servo , MCU" MCU" FOSC="FOSC"\r\n");
    CPrint(" Servomotor LOWER 270° : TOWER PRO M996R (270°) \r\n");
    CPrint(" Servomotor UPPER x360° : TOWER PRO MG995 (360°)\r\n");
    CPrint(" Usage de Timer2 pour gerer une machine d'etat \r\n");
    CRLF1();
    // all outputs low


    Init_Timer1();

    PEIE_bit=1;
    GIE_bit=1;
    Init_Timer2();
    Step=0;


     // -------------- main loop   ---------------------------
     while(1)
    {
    // consigne  0 à 1000µS  + offset constant de 1ms généré par Timer2
    // soit  gamme de 1 à 2mS
    Consigne1 = ADC_Read(0);
    Consigne2 = ADC_Read(1);
    #ifdef Bavard
     CPrint(" Consigne1 Lower Servo :");
     WordToStr(Consigne1 ,CRam1);
     Print(CRam1);
     CPrint(" Consigne2 Upper Servo :");
     WordToStr(Consigne2 ,CRam1);
     Print(CRam1);
     CRLF1();
    Delay_1sec();      // à modifier si besoin
    #else
    Delay_ms(20);
    #endif
    }
}
/*


 Compiler: MikroC 7.60
 Directory<NUL><SOH>
 Compiler: MikroC 7.60
 Directory : C:\_MikroC\_MesProjets_MikroC\_16F877_2servomoteurs
 Source : Test_2_servo_16F887_using_State_Machine_TMR2_TMR1_2xEA_Version2020_0918
 Test 2 servo , MCUP16F887 Dip40 FOSC=4Mhz
 Servomotor LOWER 270° : TOWER PRO M996R (270°)
 Servomotor UPPER x360° : TOWER PRO MG995 (360°)
 Usage de Timer2 pour gerer une machine d'etat

 Consigne1 Lower Servo :  164 Consigne2 Upper Servo :  167
 Consigne1 Lower Servo :  167 Consigne2 Upper Servo :  167
 Consigne1 Lower Servo :  183 Consigne2 Upper Servo :  182
 Consigne1 Lower Servo :  170 Consigne2 Upper Servo :  172
 Consigne1 Lower Servo :  163 Consigne2 Upper Servo :  165
 Consigne1 Lower Servo :  172 Consigne2 Upper Servo :  168
 Consigne1 Lower Servo :  183 Consigne2 Upper Servo :  183

*/

Aide toi, le ciel ou FantasPic t'aidera


Retourner vers « Langage C »

Qui est en ligne

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