SCI et PIT incompatible [Forums - HC12 et S12]
SCI et PIT incompatible [Forums - HC12 et S12]
Pseudo Pass se souvenir de moi     Créer un compte
ARTICLES et TELECHARGEMENTS ~ FORUMS ~ LIENS  
 
             
 
Recherche
 
   
 

Parcourir ce sujet :   1 Utilisateur(s) anonymes



(1) 2 »


SCI et PIT incompatible
Régulier
Inscrit:
23/10/2012 16:36
Messages: 60
Hors Ligne
Bonjour à tous,

J'ai un problème avec ses deux fonctions. J'arrive à les faire marcher sans problème.
Par contre, quand les deux sont activées la carte ne reçoit pas toujours tous les caractères par SCI.
Le PIT est cadencé à 10ms et le SCI à 111111 bauds.

J'explique. Je réalise actuellement une carte d'asservissement moteur qui pilote 4 moteurs.
Le but est de piloter la carte via un ordinateur ce que je fais déjà via une liaison série et une puce FTDI pour le module SCI.

Quand j'utilise un terminal comme "Parallax-Serial-Terminal", tout se passe très bien mais je tape tout manuellement.
J'ai réalisé un programme sur le PC en JAVA qui lui aussi est capable d'envoyer des données mais évidemment plus rapidement.

Quand j'utilise le programme JAVA si que le module SCI est activé, tout se passe très bien et très vite. Les messages sont complètement reçu.
Par contre quand j'envoie un message et que j'active le module PIT (et même si dans l'interruption il n'y a rien à exécuter), il arrive parfois que le message arrive totalement et parfois partiellement.
Exemple, j'envoie PV 1 10\r (PV=paramètre proportionnel Vitesse, le P dans PID, 1=moteur 1 et 10 la valeur, \r est là pour indiquer que le message est terminer, pour le moment j'envoie en clair pour rendre le programme plus simple pour moi).
La carte peut parfois reçevoir PV ou PV10\r ou PV 1 etc ... enfin un peu n'importe quoi.

Voilà je ne vois pas trop ou est le problème car quand le message est complètement reçu le moteur fonctionne très bien (l'asservissement, ...).

Posté le : 20/09/2016 19:15
Transférer la contribution vers d'autres applications Transférer


Re: SCI et PIT incompatible
Accro
Inscrit:
28/09/2005 14:02
De Catalunya (66)
Messages: 522
Hors Ligne
Salut,

Et si ton PIT interrompait la réception d'un caractère ? Ta SCI est sous IT ? A quoi sert ton PIT ?

Posté le : 20/09/2016 20:38
Les octets s'envolent, les écrits restent !
Transférer la contribution vers d'autres applications Transférer


Re: SCI et PIT incompatible
Régulier
Inscrit:
23/10/2012 16:36
Messages: 60
Hors Ligne
Salut dinastar,

Le pit est sous it et le sci est sous it pour la parti réception.

Je lance le PIT pour avoir une séquence de calcul toutes les 10ms pour déterminer la puissance à envoyer au moteur et avoir un temps/pas fixe de 10ms constant. C'est pour l'asservissement PID.
Comme ça j'ai pas besoin de déterminer le temps et de toute façon je ne sais pas faire ^^.

Tu dis que le PIT interrompe la réception d'un ou des caractères mais le module SCI n'est pas censé stopper les données pour éviter dans perdre ?

Posté le : 20/09/2016 22:30
Transférer la contribution vers d'autres applications Transférer


Re: SCI et PIT incompatible
Accro
Inscrit:
28/09/2005 14:02
De Catalunya (66)
Messages: 522
Hors Ligne
Ben j'essaye de comprendre comment tu gères tout ça.

C'est une sorte de séquenceur qui déclenche l'asservissement de ton moteur toutes les 10ms en fixe. Exact ?

Je tâtonne mais, si tu balances des données disons en continu depuis ton appli PC, c'est totalement indépendant de ton IT PIT toutes les 10ms.
Et donc y'a des chances qu'une ou plusieurs des données reçues dans le buffer SCI ne soient pas traitées au moment où tu bascules dans l'IT PIT, et ton appli PC continu d'envoyer ? D'où un écrasement de données non traitées ?

Du coup je me dis d'essayer peut être ceci :

- PIT activé pour un asservissement toutes les 10ms par défaut.
- mais lorsque une donnée série débarque dans le buffer SCI, et donc que l'IT BUFFER FULL survient, tu désactives les PIT ou du moins ses interruptions, le temps que tu reçoives/traites tes données utiles.
- puis tu relances le PIT

Dans tous les cas, si ça marche bien sans le PIT, c'est qu'il y a une coquille avec les IT.

Ou bien, en bidirectionnel, dire à ton appli PC de stopper l'envoi si une donnée ne peut être reçue ...

Posté le : 20/09/2016 23:52
Les octets s'envolent, les écrits restent !
Transférer la contribution vers d'autres applications Transférer


Re: SCI et PIT incompatible
Régulier
Inscrit:
23/10/2012 16:36
Messages: 60
Hors Ligne
Alors oui je déclenche l'it du PIT toutes les 10ms comme ça je pars du principe que j'ai un temps fixe grâce au PIT. Et du cout toute les 10ms je calcul de combien de pas normalement le moteur devrait s'être déplacé et en comparant avec le résultat réel je met plus ou moins de puissance mais ça c'est une formule pour l'asservissement PID qui détermine la puissance.

Alors je peux pas arrêter le PIT car sinon niveau temps je ne suis plus bon.
Après l'idée de stopper la réception de données si on est dans l'IT PIT peux être intéressante = dans le sens je sais pas faire ^^ sauf en envoyant un message mais ça risque de prendre un peux de temps, je sais pas si le module SCI peux faire ça tout seul en activant un registre ???

Je vais mettre mon code dans les grandes lignes et je t'explique.

Initialisation du PIT à 10 ms
void PIT_init(void){

PITCFLMT &= (unsigned char)~(unsigned char)0x80U;
PITMTLD0 = 0x7AU;
PITMTLD1 = 0x00U;
PITLD0 = 0x0CB3U;//=10ms
PITMUX = 0x00U;
PITCE = 0x01U;
PITTF = 0x01U;
PITINTE = 0x01U;
PITCFLMT = 0x80U;

Temps_timer_ms = 10;//ms


}

Initialisation du SCI
void SCI_init(void){
SCI0CR2 = 0x00U; /* Disable the SCI0 module */
(void)(SCI0SR1 == 0); /* Dummy read of the SCI0SR1 registr to clear flags */
(void)(SCI0DRL == 0); /* Dummy read of the SCI0DRL registr to clear flags */
SCI0SR2 = 0x00U;
SCI0BD = 0x12U;
SCI0CR1 = 0x00U;
SCI0SR2 |= (unsigned char)0x80U; /* Switch to the alternative register set */
SCI0ASR1 = 0x83U; /* Clear interrupt flags */
SCI0ACR1 = 0x00U;
SCI0ACR2 = 0x00U;
SCI0SR2 &= (unsigned char)~(unsigned char)0x80U; /* Switch to the normal register set */
SCI0CR2 = 0x2CU;

}

Posté le : 21/09/2016 19:38
Transférer la contribution vers d'autres applications Transférer


Re: SCI et PIT incompatible
Régulier
Inscrit:
23/10/2012 16:36
Messages: 60
Hors Ligne
Ensuite la partie IT

pour le PIT
#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt 66 void PIT0_ISR(void)
{
//wait for lock of semaphore
do {SET_SEM(0);
} while (!TST_SEM(0));
while(SCI0SR1_TC!=1);

//mise à jour de la distance, vitesse et accélération actuelle
MAJ_Valeur_Codeur();

/*
Code qui gère l'asservissement PID et les puissances à envoyer aux moteurs
Je le mets pas car il est trop long
*/

REL_SEM(0);
PITTF = 0x01; // clear interrupt flag
}
#pragma CODE_SEG DEFAULT


_____________________________________________________________________________
pour le SCI
__interrupt 20 void isrVsci0(void)
{
//wait for lock of semaphore
/*do {SET_SEM(0);
} while (!TST_SEM(0));*/
while(SCI0SR1_TC!=1);

//On récupère le dernier caractère envoyée
msgBuffer[pointeurBuffer] = read_char();

/*
Après je gère le Buffer, pour le remplir et ne pas dépasser la limite
*/
if(msgBuffer[pointeurBuffer]==CARAC_DE_FIN_SCI) dernierCaracFin = pointeurBuffer;
pointeurBuffer++;
if(pointeurBuffer >= CARAC_MAX_SCI){
pointeurBuffer = 0;
}
if(pointeurBuffer>=pointeurCarac){
if(pointeurBuffer-pointeurCarac >= CARAC_MAX_SCI){
send_msg("Err: Message trop long\r");
pointeurBuffer = dernierCaracFin;
}
}else{
if(CARAC_MAX_SCI-(pointeurCarac-pointeurBuffer) >= CARAC_MAX_SCI){
send_msg("Err: Message trop long\r");
pointeurBuffer = dernierCaracFin;
}
}

//REL_SEM(0);

SCI0SR1_RDRF = 1;
}
// end of isrVsci0
#pragma CODE_SEG DEFAULT

Posté le : 21/09/2016 19:40
Transférer la contribution vers d'autres applications Transférer


Re: SCI et PIT incompatible
Régulier
Inscrit:
23/10/2012 16:36
Messages: 60
Hors Ligne
Et la fonction setupXGate
static void SetupXGATE(void) {
/* initialize the XGATE vector block and
set the XGVBR register to its start address */
XGVBR= (unsigned int)(void*__far)(XGATE_VectorTable - XGATE_VECTOR_OFFSET);

/* switch software trigger 0 interrupt to XGATE */
//ROUTE_INTERRUPT(SOFTWARETRIGGER0_VEC, 0x81); /* RQST=1 and PRIO=1 */
ROUTE_INTERRUPT(ECT0_VEC, 0x81); /* RQST=1 and PRIO=1 */
ROUTE_INTERRUPT(ECT1_VEC, 0x81); /* RQST=1 and PRIO=1 */
ROUTE_INTERRUPT(ECT2_VEC, 0x81); /* RQST=1 and PRIO=1 */
ROUTE_INTERRUPT(ECT3_VEC, 0x81); /* RQST=1 and PRIO=1 */
ROUTE_INTERRUPT(ECT4_VEC, 0x81); /* RQST=1 and PRIO=1 */
ROUTE_INTERRUPT(ECT5_VEC, 0x81); /* RQST=1 and PRIO=1 */
ROUTE_INTERRUPT(ECT6_VEC, 0x81); /* RQST=1 and PRIO=1 */
ROUTE_INTERRUPT(ECT7_VEC, 0x81); /* RQST=1 and PRIO=1 */

ROUTE_INTERRUPT(SCI0_VEC, 0x05); /* RQST=1 and PRIO=1 */
//ROUTE_INTERRUPT(PIT0_VEC, 0x03); /* RQST=1 and PRIO=1 */

/* enable XGATE mode and interrupts */
XGMCTL= 0xFBC1; /* XGE | XGFRZ | XGIE */

/* force execution of software trigger 0 handler */
//XGSWT= 0x0101;
}

Posté le : 21/09/2016 19:43
Transférer la contribution vers d'autres applications Transférer


Re: SCI et PIT incompatible
Régulier
Inscrit:
23/10/2012 16:36
Messages: 60
Hors Ligne
Désoler je peux pas présenter mieux à moins qu'il y a des balises pour le code

Pour la dernière fonction je me rappelle plus exactement à quoi elle sert.
Je crois que c'est pour la gestion des 2 coeurs et pour donner des ordres de priorité aux ITs

Posté le : 21/09/2016 19:45
Transférer la contribution vers d'autres applications Transférer


Re: SCI et PIT incompatible
Pilier de la communauté
Inscrit:
23/10/2005 11:40
De Aix les Bains (73)
Messages: 1906
Hors Ligne
Bonjour

J'ai regardé très rapidement mais une chose me fais bondir dans l'IT PIT

une boucle while qui attend un sémaphore suivi d'un autre while qui attend un bit de SCI

Avec un while comme ça on peut rester dans l'it un temps infini...alors avec 2...

Dans une It il faut mettre le strict minimum (pour que ça aille vite) et en tous cas aucune boucle ou autre opération susceptible de bloquer.
Je serais étonné que ces 2 while ne posent pas soucis, énorme soucis.



Posté le : 21/09/2016 20:27
Mieux vaut marcher dans la bonne direction que courir dans la mauvaise
Transférer la contribution vers d'autres applications Transférer


Re: SCI et PIT incompatible
Régulier
Inscrit:
23/10/2012 16:36
Messages: 60
Hors Ligne
Bien joué, charly pour avoir vu le while dans le l'it du PIT, ça doit être un mauvais copié collé.

Par contre je suis obligé de laisser le while du sémaphore car je partage une variable entre les 2 coeurs.
Je vais essayer ça.

Posté le : 21/09/2016 21:19
Transférer la contribution vers d'autres applications Transférer



 Haut   Précédent   Suivant
(1) 2 »



Vous pouvez voir les sujets.
Vous ne pouvez pas débuter de nouveaux sujets.
Vous ne pouvez pas répondre aux contributions.
Vous ne pouvez pas éditer vos contributions.
Vous ne pouvez pas effacez vos contributions.
Vous ne pouvez pas ajouter de nouveaux sondages.
Vous ne pouvez pas voter en sondage.
Vous ne pouvez pas attacher des fichiers à vos contributions.
Vous ne pouvez pas poster sans approbation.

[Recherche avancée]


Powered by XOOPS© The XOOPS Project
Contacter les administrateurs

SCI et PIT incompatible [Forums - HC12 et S12]