[RYA2013] MicroMouse SourceCode

chocolove92

Thành Viên PIF
Code:
void EncRightISR(void)
{
    GPIOIntClear(GPIO_PORTC_BASE, GPIO_PIN_5);
        if (HWREG(GPIO_PORTC_BASE + 0x0100) & 0x40)
        {
            EncRightCount--;
            PosRightCount--;
        }
        else
        {
            EncRightCount++;
            PosRightCount++;
        }
}
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.
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!!!:-s
 

honghiep

Cố Vấn CLB
Staff member
Code:
void EncRightISR(void)
{
    GPIOIntClear(GPIO_PORTC_BASE, GPIO_PIN_5);
        if (HWREG(GPIO_PORTC_BASE + 0x0100) & 0x40)
        {
            EncRightCount--;
            PosRightCount--;
        }
        else
        {
            EncRightCount++;
            PosRightCount++;
        }
}
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.
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!!!:-s
Thực ra HWREG(GPIO_PORTC_BASE + 0x0100) đã trả về giá trị của pin 6 của PortC,
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
 

vietcuon2892

Trứng gà
Code:
void EncRightISR(void)
{
    GPIOIntClear(GPIO_PORTC_BASE, GPIO_PIN_5);
        if (HWREG(GPIO_PORTC_BASE + 0x0100) & 0x40)
        {
            EncRightCount--;
            PosRightCount--;
        }
        else
        {
            EncRightCount++;
            PosRightCount++;
        }
}
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.
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!!!:-s
Thực ra HWREG(GPIO_PORTC_BASE + 0x0100) đã trả về giá trị của pin 6 của PortC,
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

Vậy tại sao không dùng GPIOPinRead() mà phải dùng HWREG(GPIO_PORTC_BASE + 0x0100) cho tối nghĩa vậy bạn? Có ý nghĩa nào khác chăng?
 

Tan Sy Nguyen

Cố Vấn CLB
Staff member
Khi bạn truy xuất đến thanh ghi như thế này sẽ có lợi ích:
- Chương trình sẽ được tối ưu performance (không phải lưu ngữ cảnh hiện tại rồi nhảy đến hàm read, sau đó lại quay về). Hàm ngắt này được thực thi khá nhiều nên việc tối ưu này là nên làm.
- Bạn nào mới làm quen từ MSP430 hay những dòng MCU cấp thấp khác mới đọc vô cũng sẽ hiểu là "ARM cũng chẳng khác gì các MCU cấp thấp, khác chăng là nó có nhiều thanh ghi hơn thôi" :D:D:D
 

mafiaWolf

Chủ tịch Hội phụ nữ PIF
Cho em hỏi câu lệnh nào truy xuất vùng Stack trong con MCU này vậy :(.. em coi thì nó có thanh ghi stack mà không biết truy xuất bằng lệnh gì... Phải chăng là FPUStack gì đó
 

nklvodoi

Trứng gà
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);
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?
 

honghiep

Cố Vấn CLB
Staff member
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);
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?
Đoạn này là để robot giảm tốc độ từ từ
Vì nó iểm tra số xung Encoder nên khi trong chế đọ debug, encoder đọc không chính xác như khi chạy bình thường dẫn đến tình trạng ở lâu trong vòng while đó
 

nklvodoi

Trứng gà
sao mình dùng TurnLeft(300,200,100,200) với ki,kp,kd=1 thì ko thấy hiện tượng j hết vậy? với lại EncTemp = PosLeftCount; thì abs(PosLeftCount - EncTemp) lúc nào cũng =0 mà!
Có thể chỉ mình biết để sử dụng đc các hàm TurnLeft, TurnRight thì ngoài xác định PID còn j nữa ko? sao dùng PWM thì chạy được mà dùng các lệnh này thì toàn bất động! :(
 

honghiep

Cố Vấn CLB
Staff member
PosLeftCount được update trong ngắt đọc Encoder nên
abs(PosLeftCount - EncTemp) sẽ khác 0.
Bạn phải cho FollowSel khác FOLLOW_DISABLE thì các hàm này mới có tác dụng
 

nklvodoi

Trứng gà
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);
    }
Không phải soure code thì FollowSel đã khác FOLLOW_DISABLE rùi sao?
 

hung303mc

Thành Viên PIF
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);
    }
Không phải soure code thì FollowSel đã khác FOLLOW_DISABLE rùi sao?
Bạn đang để cooment cho nó mà, bạn đang set Followsel = FOLLOW_LEFT, kiem tra lai
 

nkvu

Trứng gà
cho mình hỏi, mình chỉ cho 1 động cơ chạy
Code:
PIDSpeedSet(&PIDVerLeft, 50);
nó chạy được 1 chút thì dừng, cái LD2 OTW mạch boost sáng lên
 

nkvu

Trứng gà
vớ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)
 

nklvodoi

Trứng gà
vớ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)
bạn coi lại file startup_ccs.c! chắc có lỗi ở file này nên nó ko khởi động được
 

cowboyhere

Cố Vấn CLB
Staff member
về nguyên tắc: chạy debug được thì sẽ chạy bình thường được, nhưng lâu lâu có mấy điều kì diệu chả ai biết được, bạn kiểm tra lại nguồn, có thể hết pin, động cơ kẹt, ... bạn coi thêm trong datasheet của drv8412 để biết lỗi của đèn otw
 

honghiep

Cố Vấn CLB
Staff member
vớ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.c
Nếu đã add mà vẫn bị thì bạn nên kiểm tra việc đã enable peripheral trước khi sử dụng hay chưa? Các ngắt khi sử dụng đã config đủ chưa? ...
 
Top