Bonjour à tous,
je vous explique mon problème, je cherche à faire tourner un moteur pas à pas, pour cela, j'ai fait une carte électronique composé de transistor ainsi que d'un PIC18F4431 pour les commander. La partie électronique est correcte, mon problème est sur la partie info, je programme sous mplab avec MCC18.
Je me sers du timer0 pour créer des interruptions qui me font incrémenter ou décrémenter en fonction du sens de rotation souhaité une liste de commande des transistors.
Pour être plus clair, voici un bout de mon programme:
// High priority interrupt routine
#pragma code ItHandlerHigh = 0xE00
#pragma interrupt InterruptHandlerHigh
void InterruptHandlerHigh ()
{
if (INTCONbits.TMR0IF) //check for TMR0 overflow
{ TMR0H = StartTMR0H; //init hight timer value
TMR0L = StartTMR0L; //init low timer value
INTCONbits.TMR0IF = 0; //clear interrupt flag
if (Flags.Bit.CW && Flags.Bit.Enable) //test if Schedule and switch1 are enable {
Schedule++; //increment the schedule table if (Schedule > 8)
Schedule = 1;
}
else if (Flags.Bit.CCW && Flags.Bit.Enable) //test if Schedule and switch2 are enable) {
Schedule--;
if (Schedule < 1)
Schedule = 8;
}
else
{
Schedule = 0;
}
}
}
#pragma code
void main(void)
{
TRISA = 0xFF; // Activation port RA2, RA3, RA4
TRISB = 0xFF; // Activation port RB0, RB1, RB2, RB3, RB4, RB5 TRISC = 0xFF; // Activation port RC6, RC7 TRISD = 0xFF; // Activation port RD6, RD7
// configure Oscillator
OSCCON = 0xF2;
OSCTUNE = 0x00;
// Clear flags
Flags.Byte = 1;
// configure TMR0
T0CON = 0xCF;
TMR0H = StartTMR0H; //init hight timer value
TMR0L = StartTMR0L; //init low timer value
// Configure interrupts
INTCON = 0xE0; //enable global interrupt
while(1) // main loop
{
switch(Schedule)
{
case 1: T0 = 0; // Phase 1
........ Après suit mon cycle de commutation des transistors
}
Voila, j'espère que j'ai été assez clair et que vous pourrez m'aider
Cordialement
Damien
-----