Problem med mitt program
Postat: 15 april 2008, 14:24:05
Hej. Jag har ett litet problem med mitt program här. Jag har skrivit ett servo kontroller program eller vad man skall säga. Detta styrs via RS232 från PC'n. Jag använder mikroC som kompilator för uC'n samt visual C++ för PC'n
Processorn jag använder är en 16F628A. såhär ser koden i uC'n ut:
Och koden i datorn ser utsåhär: (ett utdrag ur den.)
Det problemet jag har är att det funkar jättebra att "ladda över" en gång då ställer servorna in sig som de skall. Men när man gör det igen så kommer det ingen signal ut till servorna. om jag tar och startar om uC'n så funkar det eng gång igen. Jag vet ju på ett ungefär vart problemet ligger, nämligen i förljade rad i uC'ns program:
Kan man byta ut det villkoret mot något annat, någon som har något förslag?
MVH
Kalf
Processorn jag använder är en 16F628A. såhär ser koden i uC'n ut:
Kod: Markera allt
//Variabler för datapaket
unsigned short pak_action = 0b00000001;
unsigned short pak_value = 0xb6; //oxb6(59) - 0xb6(182)
unsigned short pak_reday = 0x00;
//Variabler för servo vinklar
unsigned short J0_angle = 0x6b;
unsigned short J1_angle = 0xb6;
unsigned short J2_angle = 0xb6;
unsigned short J3_angle = 0xb6;
unsigned short J4_angle = 0xb6;
//Övriga variabler
unsigned int cnt = 0;
void main(void)
{
//I/O settings
TRISA = 0x00;
PORTA = 0x00;
Usart_Init(2400); //Init usart
while(1)
{
//Hämta data
while(Usart_Data_Ready() == 0); //Vänta på data
J0_angle = Usart_Read(); //Tilldela värde
while(Usart_Data_Ready() == 0); //Vänta på data
J1_angle = Usart_Read(); //Tilldela värde
while(Usart_Data_Ready() == 0); //Vänta på data
J2_angle = Usart_Read(); //Tilldela värde
while(Usart_Data_Ready() == 0); //Vänta på data
J3_angle = Usart_Read(); //Tilldela värde
while(Usart_Data_Ready() == 0); //Vänta på data
J4_angle = Usart_Read(); //Tilldela värde/
while(Usart_Data_Ready() == 0)
{
//Starta motorerna
while(J0_angle >= cnt) {
PORTA |= 0b00000001;
cnt++;
}
PORTA = 0;
cnt = 0;
while(J1_angle >= cnt) {
PORTA |= 0b00000010;
cnt++;
}
PORTA = 0;
cnt = 0;
while(J2_angle >= cnt) {
PORTA |= 0b00000100;
cnt++;
}
PORTA = 0;
cnt = 0;
while(J3_angle >= cnt) {
PORTA |= 0b00001000;
cnt++;
}
PORTA = 0;
cnt = 0;
while(J4_angle >= cnt) {
PORTA |= 0b10000000;
cnt++;
}
PORTA = 0;
cnt = 0;
delay_ms(10);
}
}
}
Kod: Markera allt
...
void EnterPosition(void)
{
int J0_angle = 0;
int J1_angle = 0;
int J2_angle = 0;
int J3_angle = 0;
int J4_angle = 0;
system("CLS");
cout<<"All values 0-100"<<endl;
cout<<"Enter angle for J0: ";
cin>>J0_angle;
while((J0_angle > 10000) || (J0_angle < 0))
{
cout<<"You have enterd an invaild number."<<endl<<"Enter a new one: ";
cin>>J0_angle;
}
cout<<"Enter angle for J1: ";
cin>>J1_angle;
while((J1_angle > 10000) || (J1_angle < 0))
{
cout<<"You have enterd an invaild number."<<endl<<"Enter a new one: ";
cin>>J1_angle;
}
cout<<"Enter angle for J2: ";
cin>>J2_angle;
while((J2_angle > 10000) || (J2_angle < 0))
{
cout<<"You have enterd an invaild number."<<endl<<"Enter a new one: ";
cin>>J2_angle;
}
cout<<"Enter angle for J3: ";
cin>>J3_angle;
while((J3_angle > 10000) || (J3_angle < 0))
{
cout<<"You have enterd an invaild number."<<endl<<"Enter a new one: ";
cin>>J3_angle;
}
cout<<"Enter angle for J4: ";
cin>>J4_angle;
while((J4_angle > 10000) || (J4_angle < 0))
{
cout<<"You have enterd an invaild number."<<endl<<"Enter a new one: ";
cin>>J4_angle;
}
COMPort aPort ("COM1");
aPort.setBitRate (COMPort::br2400);
aPort.setParity (COMPort::None);
aPort.setDataBits (COMPort::db8);
aPort.setStopBits (COMPort::sb1);
aPort.write(J0_angle);
Sleep(1);
aPort.write(J1_angle);
Sleep(1);
aPort.write(J2_angle);
Sleep(1);
aPort.write(J3_angle);
Sleep(1);
aPort.write(J4_angle);
system("CLS");
}
...
Kod: Markera allt
//Rad 36
while(Usart_Data_Ready() == 0)
{
Kan man byta ut det villkoret mot något annat, någon som har något förslag?
MVH
Kalf