Mình có con robot tự động từ mùa robocon vừa rồi.Năm trc ko thuộc bên lập trình mà làm phần cứng nên khoản viết nách cũng hơi gà.Hè vừa rồi ngồi thiết kế lại phần cứng để có robot tập tành cho mùa tới nhưng vướng ở đoạn lập trình cho robot nhớ và đếm vạch.Mình dùng AVR16L và viết trên codevision.Cụ thể là:
-Về việc chỉnh định để robot đi thẳng thì ko vấn đề.Đã cày xong
-Vướng mắc ở chỗ dùng ngắt ngoài INT0 để đếm vạch.Mục đích mình muốn nó đếm vạch đc mà thực hiện công việc tại vị trí ứng với vạch nào đó.Thuật toán của mình là nếu 2 sensor ngoài cùng của cơ cấu sensor mà nhận vạch thì sẽ có ngắt ngoài INT0(phần cứng thì OK, nhận ngắt theo sườn xuống) và khi qua vạch đó thì biến đếm i trong hàm ngắt sẽ tăng lên 1.Giả sử i=1 thì gọi hàm con rẽ trái Nhưng khổ nỗi lúc biến i tăng lên 1 thì nó lại ko rẽ đc trái mà vẫn chạy thẳng.Mình đoán là do nó lại quay về thực hiện tiếp công việc chạy thẳng trc đó.
Chương trình mình nói gọn như sau:
//Các khai báo và định nghĩa biến
..........
//Bắt đầu khai báo ngắt ngoài INT0
......bỏ bớt 1 số khai báo cho anh em đỡ rối mắt
if((sensor_1&&sensor_7)==1)
{
i=i++;
}
//Đoạn CT hàm con chạy thẳng
void chay_thang()
{
while(1)
{
............
}
};
//Đoạn CT hàm con rẽ trái
void re_trai()
{
...........
};
//chương trình chính
void main(void)
{
............
while(1)
{
if(i==1)
{
re_trai();
}
else
{
chay_thang();
}
};
}
Anh em nào chơi robocon hoặc ai biết thì xin chỉ giáo cho mình đc ko.Mình đang rất bí bách.Nghĩ mãi mà ko ra đành hỏi anh em vậy.Thanks!
-Về việc chỉnh định để robot đi thẳng thì ko vấn đề.Đã cày xong
-Vướng mắc ở chỗ dùng ngắt ngoài INT0 để đếm vạch.Mục đích mình muốn nó đếm vạch đc mà thực hiện công việc tại vị trí ứng với vạch nào đó.Thuật toán của mình là nếu 2 sensor ngoài cùng của cơ cấu sensor mà nhận vạch thì sẽ có ngắt ngoài INT0(phần cứng thì OK, nhận ngắt theo sườn xuống) và khi qua vạch đó thì biến đếm i trong hàm ngắt sẽ tăng lên 1.Giả sử i=1 thì gọi hàm con rẽ trái Nhưng khổ nỗi lúc biến i tăng lên 1 thì nó lại ko rẽ đc trái mà vẫn chạy thẳng.Mình đoán là do nó lại quay về thực hiện tiếp công việc chạy thẳng trc đó.
Chương trình mình nói gọn như sau:
//Các khai báo và định nghĩa biến
..........
//Bắt đầu khai báo ngắt ngoài INT0
......bỏ bớt 1 số khai báo cho anh em đỡ rối mắt
if((sensor_1&&sensor_7)==1)
{
i=i++;
}
//Đoạn CT hàm con chạy thẳng
void chay_thang()
{
while(1)
{
............
}
};
//Đoạn CT hàm con rẽ trái
void re_trai()
{
...........
};
//chương trình chính
void main(void)
{
............
while(1)
{
if(i==1)
{
re_trai();
}
else
{
chay_thang();
}
};
}
Anh em nào chơi robocon hoặc ai biết thì xin chỉ giáo cho mình đc ko.Mình đang rất bí bách.Nghĩ mãi mà ko ra đành hỏi anh em vậy.Thanks!
Comment