Bonjour,
J'ai un petit (gros) problème où je commence à craquer tellement je sais plus quoi faire !!!
Je vous explique :
je dois contrôler un moteur pas à pas via le port série de mon pc et un pic 16f876A.
Voici le programme entré dans le pic :
(au début, il était bien plus optimisé, mais je me suis ramené à des choses plus simples pour essayer de comprendre :P )Code:#include <INT16CXX.H> //Définition des variables globales unsigned char cData; // Octet de réception de donnée bit bSerie; const char msgOK[]="OK"; // Message ok char cT; // Déclaration d'une variable char nommée cT char X,Y; char T; //Liste des fonctions void Serial_Init(void); // Initialisation Port série 9600 baud 8 data bit ,1 bit stop, pas de parité void Serial_Putchar(unsigned char cD); // Cette fonction envoie des données sur le port série static interrupt inter(); // Fonction d'interruption, détecte l'arrivée d'une donnée void mov_D(void); void deplacementX(void); void tempo(void); #pragma origin 4 #pragma config |= 0xb71 #pragma chip PIC16F876A void main() //****************** debut Main ****************************** { GIE=1; PEIE=1; // Autorise les interruptions TRISC=0b10000000; // RC7 RX en entrée, RC6 TX en sortie X=0; //1ère étape de l'ordre des phases du moteur Gauche-Droit Y=0; //1ère étape de l'ordre des phases du moteur Haut-Bas Serial_Init(); // Initialisation port série /* boucle principale */ while(1) { if(bSerie) { if(cData==48) { for(cT=0;cT<=1;cT++) Serial_Putchar(msgOK[cT]); PORTB=0x0F&0x0A; tempo(); Serial_Putchar(X); X++; } if(cData==49) { for(cT=0;cT<=1;cT++) Serial_Putchar(msgOK[cT]); PORTB=0x0F&0x09; tempo(); Serial_Putchar(X); X++; } if(cData==50) { for(cT=0;cT<=1;cT++) Serial_Putchar(msgOK[cT]); PORTB=0x0F&0x05; tempo(); Serial_Putchar(X); X++; } if(cData==51) { for(cT=0;cT<=1;cT++) Serial_Putchar(msgOK[cT]); PORTB=0x0F&0x06; tempo(); Serial_Putchar(X); X=0; } bSerie=0; // bSerie passe à 0, attente nouvelle interruption CREN=1; // Active la réception série } } }// ************************ fin de main****************************** void Serial_Init(void) // Initialisation Port série 9600 baud 8 data bit, 1 bit stop, pas de parité { RCIE=1; // valide l'interruption de réception RCSTA=0b10010000; // SPEN=1 valide le port série, CREN=1 valide la réception de donnée TXSTA=0b00100110; // high speed mode brgh1 , TXEN 1 autorise émission de donnée SPBRG=25; // 9600 baud TRISB=0; PORTB=0; bSerie=0; // si 1 traité caractère serie reçu. } void Serial_Putchar(unsigned char cD) // Emission de donnée sur le port série { while(!TXIF); // si 1 registre d'émission vide, donc on sort de la boucle TXREG=cD; // On place le caractère cD à envoyer dans le registre TXREG while(!TRMT); // Lorsque TRMT passe à 1 TXREG recoit la donnée cD } static interrupt inter() // Fonction d'interruption { int_save_registers if(RCIF) { cData=RCREG; // Place le caractère reçu dans cData CREN=0; // Désactive la réception de donnée bSerie=1; // bSerie passe à 1 pour indiquer au programme de traiter la donnée RCIF=0; } int_restore_registers } //La fonction tempo void tempo(void) { int i; int vitesse=100; for(i=0;i<vitesse;i++) { nop(); } }
Quand je met en commentaire les sorties sur le PORTB, pas de problème, la communication se fait sans problèmes, aucun souci.
Par contre, quand j'essaye d'envoyer les différentes séquences vers le moteur pas à pas (via une carte de puissance), les problèmes arrivent !!!
Je m'explique :
Si j'envoie la donnée "048" ou "049", pas de problème, le pic me renvoie la bonne séquence.
Par contre, dès que j'envoie "050" ou "051", le pic me renvoie la séquence suivante "079 075 002 255".
Pourtant, il n'y a aucune différence entre les deux premières étapes et les deux dernières
Je ne comprends vraiment pas ce qui ne va pas...
Est-ce du à la configuration du portB ???
Merci
-----