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 : Jérémy
Interruption traitement invisible
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
Bonjour à tous,
Ayant participé à un post sur Edaboard pour tester un programme 16F887 gérant 2 servos avec 2 potars sur Entrées Analogiques
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 ?
=========================================
Ayant participé à un post sur Edaboard pour tester un programme 16F887 gérant 2 servos avec 2 potars sur Entrées Analogiques
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 ?
=========================================
Interruption traitement invisible
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
EUREKA ! j'ai trouvé
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é
ce n'est quand meme pas coherent avec l'assistant mikroC
qui permet Interrupt avec un I majuscule !
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é
ce n'est quand meme pas coherent avec l'assistant mikroC
qui permet Interrupt avec un I majuscule !
Interruption traitement invisible
Bonsoir paulfjujo, et tout le forum,
Tu peux maintenant utiliser le panneau -1
... Bon... la il manque encore un panneau, je te laisse deviner lequel ça peut être
A+
paulfjujo a écrit :Source du message il n'y a pas le panneau -1 !!!
Tu peux maintenant utiliser le panneau -1
paulfjujo a écrit :Source du message ça marche avec la syntaxe Correcte !
... Bon... la il manque encore un panneau, je te laisse deviner lequel ça peut être
A+
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Interruption traitement invisible
Bonjour à tous.
Content que tu ai résolu ton problème.
Qu'entend tu par Case sensitive coché ?
@++
Content que tu ai résolu ton problème.
Qu'entend tu par Case sensitive coché ?
@++
Interruption traitement invisible
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
bonjour à tous,
j'avais oublié de joindre le fichier ayant servi à ce test
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
ça marche aussi !
option case sensitive
j'avais oublié de joindre le fichier ayant servi à ce test
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
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Interruption traitement invisible
Ah d'accord, je n'avais pas connaissance de cette case. Merci pour les explications.
@++
@++
Interruption traitement invisible
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
bonsoir,
Version plus comprehensible avec usage de timer2 pour piloter les servos façon "state machine"
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
*/
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 23 invités