PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Timer als Zähler



Aysoft
20.05.2014, 19:33
Hallo
ich könnte ein bisschen Hilfe von euch gebrauchen komm einfach nicht weiter

ich lasse ein Schrittmotor erst rechts und dann links herum drehen es klappt auch gut was leider noch nicht klappt ist das die schritte nicht mitgezählt werden und bei erreichen einer Anzahl Impulse würde dann ein Interrupt ausgelöst.

habe PWM ausgang Port 38 mit Timer Port 33(COUNTA_2) verbunden

mein Controller ist
C-Control PRO AVR32-Bit Unit + Applicationboard


int stop;
dword richtung, puls;
word cnt;

void main(void)
{
Port_Attribute(P2, PORT_ATTR_OUTPUT|PORT_ATTR_INIT_LOW);
Port_Attribute(P4, PORT_ATTR_OUTPUT|PORT_ATTR_INIT_LOW);
puls = 2000; // Kleinste drehzahl

Port_WriteBit(P2,0 ); // Dir
PWM_Init(1, PWM_64, PWM_ENAB_HIGH|PWM_ENAB_LOW); // Port 38

motor_rechts(30);
motor_links(30);

PWM_Disable(1);
Timer_Disable(2 );
Port_WriteBit(P2,0 );
Port_WriteBit(P4,1 );

}
void count_irq(void)
{
cnt++;
Irq_GetCount(INT_TIMER2);

PWM_Disable(1 );
Timer_Disable(2 );
}

void motor_rechts(int gradzahl)
{
cnt = 0;
Irq_SetVect(INT_TIMER2, count_irq);
Timer_ConfigCounter(2, COUNTA_2,CNT_RISING,200); // Port38 (PWM) mit Port 33(COUNTA_2)

Port_WriteBit(P2,0 ); // Dir
while(1)
{
puls = puls - 3;
PWM_Update(1, puls, puls/2, 0, 0);
AbsDelay(10);
if(puls < 340) break;
if(stop==1) break;
}

AbsDelay(5000 );
while(1)
{
puls = puls + 3;
PWM_Update(1, puls, puls/2, 0, 0);
AbsDelay(10);
if (puls > 2000) break;
if(stop==1) break;
}
}

void motor_links(int gradzahl)
{
cnt = 0;
Irq_SetVect(INT_TIMER2, count_irq);
Timer_ConfigCounter(2, COUNTA_1,CNT_RISING,gradzahl);

Port_WriteBit(P2,1 ); // Dir
//Port_WriteBit(P4,0 ); // Dir
while(1)
{
puls = puls - 3;
PWM_Update(1, puls, puls/2, 0, 0);
AbsDelay(10);
if(puls < 340) break;
if(stop==1) break;
}

AbsDelay(5000 );
while(1)
{
puls = puls + 3;
PWM_Update(1, puls, puls/2, 0, 0);
AbsDelay(10);
if (puls > 2000) break;
if(stop==1) break;
}
}

mfg