void EncRightISR(void)
{
GPIOIntClear(GPIO_PORTC_BASE, GPIO_PIN_5);
if (HWREG(GPIO_PORTC_BASE + 0x0100) & 0x40)
{
EncRightCount--;
PosRightCount--;
}
else
{
EncRightCount++;
PosRightCount++;
}
}
Thực ra HWREG(GPIO_PORTC_BASE + 0x0100) đã trả về giá trị của pin 6 của PortC,Các pro cho e hỏi trong đoạn code trên (lấy từ InterruptHandler.c) thanh ghi (GPIO_PORTC_BASE + 0x0100) là thanh ghi nào? Tại sao phải so sánh nó với số 0x40, nó có phải là GPIO Interrupt Status ko? sao e tìm trong GPIO Register Map(datasheet) ko thấy.Code:void EncRightISR(void) { GPIOIntClear(GPIO_PORTC_BASE, GPIO_PIN_5); if (HWREG(GPIO_PORTC_BASE + 0x0100) & 0x40) { EncRightCount--; PosRightCount--; } else { EncRightCount++; PosRightCount++; } }
Nhân tiện từ ENCODER mình đọc xung về ra sao, e thấy SCHEMATIC có 4 pin dùng cho ENCODER nhưng ko biết rõ những chân nào đếm xung còn chân nào làm nhiệm vụ gì khác. Please ANSWER!!!
Thực ra HWREG(GPIO_PORTC_BASE + 0x0100) đã trả về giá trị của pin 6 của PortC,Các pro cho e hỏi trong đoạn code trên (lấy từ InterruptHandler.c) thanh ghi (GPIO_PORTC_BASE + 0x0100) là thanh ghi nào? Tại sao phải so sánh nó với số 0x40, nó có phải là GPIO Interrupt Status ko? sao e tìm trong GPIO Register Map(datasheet) ko thấy.Code:void EncRightISR(void) { GPIOIntClear(GPIO_PORTC_BASE, GPIO_PIN_5); if (HWREG(GPIO_PORTC_BASE + 0x0100) & 0x40) { EncRightCount--; PosRightCount--; } else { EncRightCount++; PosRightCount++; } }
Nhân tiện từ ENCODER mình đọc xung về ra sao, e thấy SCHEMATIC có 4 pin dùng cho ENCODER nhưng ko biết rõ những chân nào đếm xung còn chân nào làm nhiệm vụ gì khác. Please ANSWER!!!
việc & với 0x40 chỉ để chương trình rõ ràng hơn thôi
Cái này bạn có thể xem trong thanh ghi DATA của các PORT
Việc đọc Encoder là so pha giữa 2 dây tín hiệu PhA và PhB, và việc pha nào dùng để đếm tùy thuộc người lập trình
EncTemp = PosLeftCount;
while(abs(PosLeftCount - EncTemp) < DeltaEnc)
{
avrSpeed = ((abs(DeltaEnc + EncTemp - PosLeftCount) / (DeltaEnc / avrSpeedtemp)) / 2) + (abs(SpeedLeft) + abs(SpeedRight)) / 2;
}
avrSpeed = avrSpeedtemp;
CalcPosition(Direction, (int8_t)((PosLeftCount + PosRightCount + 5500) / 6800));
UpdateBasePoint(x, y);
Đoạn này là để robot giảm tốc độ từ từcho mình hỏi đoạn code trên trong TurnLeft để lmaf mục đích j vậy? sao khi debug toàn vào hàm while mà ko thoát ra được?Code:EncTemp = PosLeftCount; while(abs(PosLeftCount - EncTemp) < DeltaEnc) { avrSpeed = ((abs(DeltaEnc + EncTemp - PosLeftCount) / (DeltaEnc / avrSpeedtemp)) / 2) + (abs(SpeedLeft) + abs(SpeedRight)) / 2; } avrSpeed = avrSpeedtemp; CalcPosition(Direction, (int8_t)((PosLeftCount + PosRightCount + 5500) / 6800)); UpdateBasePoint(x, y);
//Select one:
FollowSel = FOLLOW_LEFT; //Enable follow left wall
//PIDSpeedSet(&PIDVerLeft, 50); //Set left-motor speed at 50
//PIDPositionSet(&PIDPosRight, 2000); //
//Move (3000, 5000); //Move forward: left-motor 3000 pulses - right-motor 5000 pulses
//FollowSel = FOLLOW_DISABLE; //Disable wall-follow
while(1)
{
//Write your code here
TurnLeft(300,200,100,100);
}
Bạn đang để cooment cho nó mà, bạn đang set Followsel = FOLLOW_LEFT, kiem tra laiKhông phải soure code thì FollowSel đã khác FOLLOW_DISABLE rùi sao?Code://Select one: FollowSel = FOLLOW_LEFT; //Enable follow left wall //PIDSpeedSet(&PIDVerLeft, 50); //Set left-motor speed at 50 //PIDPositionSet(&PIDPosRight, 2000); // //Move (3000, 5000); //Move forward: left-motor 3000 pulses - right-motor 5000 pulses //FollowSel = FOLLOW_DISABLE; //Disable wall-follow while(1) { //Write your code here TurnLeft(300,200,100,100); }
bạn coi lại file startup_ccs.c! chắc có lỗi ở file này nên nó ko khởi động đượcvới lại khi mình chạy debug thì được mà khi rút cáp usb ra, tắt nguồn, bật nguồn trở lại thì không chạy ( LD2 OTW sÁNG)
Về việc debug thì chạy còn rút cáp ra reset thì không chạy thường là do chưa add file startup_ccs.cvới lại khi mình chạy debug thì được mà khi rút cáp usb ra, tắt nguồn, bật nguồn trở lại thì không chạy ( LD2 OTW sÁNG)