PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   dsPIC - Bộ điều khiển tín hiệu số 16-bit (http://www.picvietnam.com/forum/forumdisplay.php?f=29)
-   -   dsPIC Tutorial 4-Module UART và I2C (http://www.picvietnam.com/forum/showthread.php?t=623)

Hiepnv101 11-05-2009 06:16 PM

void Init_TMR1(void)
{
TMR1 = 0; //Xoa so dem trong TMR1
PR1 = 0x7A12; //Nguong tran la 1 giay tuong ung voi clock = 32 MHz
_T1IF = 0; //Xoa co ngat cua Timer 1
T1CON = 0x8030; //Dung fcy lam clock, prescale = 1:256
_T1IE = 1; //Cho phep ngat khi Timer 1 tran
}
Theo em nghĩ là bộ đếm sẽ đếm giá trị từ PR1 đến giá trị 65535, khi vượt qua giá trị này sẽ tạo ngắt Timer1. Anh Nam đặt giá trị 7A12 vào PR1 liệu đã tạo ra ngắt đúng 1giây không ?

conglong 11-05-2009 07:35 PM

Trích:

Nguyên văn bởi Hiepnv101 (Post 25643)
void Init_TMR1(void)
{
TMR1 = 0; //Xoa so dem trong TMR1
PR1 = 0x7A12; //Nguong tran la 1 giay tuong ung voi clock = 32 MHz
_T1IF = 0; //Xoa co ngat cua Timer 1
T1CON = 0x8030; //Dung fcy lam clock, prescale = 1:256
_T1IE = 1; //Cho phep ngat khi Timer 1 tran
}
Theo em nghĩ là bộ đếm sẽ đếm giá trị từ PR1 đến giá trị 65535, khi vượt qua giá trị này sẽ tạo ngắt Timer1. Anh Nam đặt giá trị 7A12 vào PR1 liệu đã tạo ra ngắt đúng 1giây không ?

Không phải đâu ban, Timer sẽ đếm từ 0 cho tới giá trị PRx, giá tri của bộ đếm Timer sẽ lưu vào TMRx ,(x ở đây là chỉ số timer x=1 ,2..) và khi TMRx = PRx thì ngắt Timer sẽ được gọi (nếu bạn set bit _TxIE ), đồng thời reset giá trị trong thanh ghi TMRx về zero,và lặp lại công việc như trên mãi.
Trân trọng!
à mà dạo này Picvietnam thấy sa sút qua thầy Nam ơi !

Hiepnv101 15-05-2009 05:54 PM

Anh Nam cho em hỏi. Em khai báo _FBORPOR(PBOR_OFF & MCLR_EN); thì truyền lên PC rất nhiễu. Nhưng khi khai báo _FBORPOR(PBOR_OFF & MCLR_DIS); thì lại truyền rất chuẩn. Anh có thể nêu qua 2 khai báo này được không ạ?

Thanks,

silvadk2 21-05-2009 10:10 AM

Em có 1 vấn đề về phần cứng. Em làm mạch đo nhiệt độ, hiển thị lên LCD và gửi lên máy tính. Phần đo nhiệt độ và hiển thì lên LCD thì ok, nhưng cứ khi em cắm COM vào mt thì mạch lại ko làm việc nữa, chip thì nóng lên. Em thử ktra các chân của Max232 và com thì thấy bình thường, thậm chí, cắm com nhưng ko cắm lên máy tính thì mạch cũng ko sao, vẫn bình thường. Em thử cắm sang nhiều máy tính khác thì nó cũng ko chạy, theo mọi người thì lỗi ở đâu nhỉ ?

tungnh 21-05-2009 12:03 PM

Trích:

Nguyên văn bởi silvadk2 (Post 25912)
Em có 1 vấn đề về phần cứng. Em làm mạch đo nhiệt độ, hiển thị lên LCD và gửi lên máy tính. Phần đo nhiệt độ và hiển thì lên LCD thì ok, nhưng cứ khi em cắm COM vào mt thì mạch lại ko làm việc nữa, chip thì nóng lên. Em thử ktra các chân của Max232 và com thì thấy bình thường, thậm chí, cắm com nhưng ko cắm lên máy tính thì mạch cũng ko sao, vẫn bình thường. Em thử cắm sang nhiều máy tính khác thì nó cũng ko chạy, theo mọi người thì lỗi ở đâu nhỉ ?

Bạn thử thay dây cổng COM khác xem thế nào

silvadk2 21-05-2009 01:12 PM

dây đó em chạy với 1 mạch khác, nó ok bác ạ! mà có mỗi 1 dây, ngại đi mua quá. với lại mạch kia chạy ok thì chắc dây ko vấn đề

silvadk2 21-05-2009 02:00 PM

Ô hô, em tìm ra lỗi rồi, do con vdk chết module uart, em thay con khác thì nó gửi ký tự rồi. Nhưng lạ 1 nỗi, cứ cắm com vào mt thì chip nóng ran. thế là thế nào nhỉ các bác. Néu cắm com mà ko cắm vào mt thì chip ko nóng, hic :(

namqn 21-05-2009 10:45 PM

Trích:

Nguyên văn bởi Hiepnv101 (Post 25738)
Anh Nam cho em hỏi. Em khai báo _FBORPOR(PBOR_OFF & MCLR_EN); thì truyền lên PC rất nhiễu. Nhưng khi khai báo _FBORPOR(PBOR_OFF & MCLR_DIS); thì lại truyền rất chuẩn. Anh có thể nêu qua 2 khai báo này được không ạ?

Thanks,

PBOR là viết tắt của Programmable Brown-Out Reset, tức là chức năng tự động reset khi nguồn suy giảm.

MCLR là viết tắt của Master Clear (Reset), tức là chức năng reset bộ xử lý khi chân MCLR được đặt ở trạng thái tích cực (mức logic '0').

Việc nhiễu khác nhau ở hai cấu hình của bạn thì vẫn chưa có đủ thông tin để góp ý. Bạn dùng sơ đồ nguyên lý như thế nào (chân MCLR của bạn được thiết kế ra sao, vì trong hai cấu hình thì chỉ có chức năng của chân MCLR là khác nhau)?

Thân,

conglong 07-09-2009 01:42 PM

Uart .
 
Thầy Nam và các anh chị trong diễn đàn cho em hỏi về một số liên quan tới UART của dsPIC.
Em đang làm đồ án môn học liên quan tới PID trên máy tính rồi truyền giá trị xuống cho dsPIC. Giá trị em muốn truyền là thông số cho PDC1 và PDC2 (hai thanh ghi thiết lập duty_cycle trong module PWM )cho 2 bánh của robot. hai giá trị em gửi xuống cho dsPIC có tầm từ 0 tới 1599. nên cho em hỏi là có cách nào truyền từ máy tính xuống mà 1 lúc truyền được 16 bit data không ?. em đang làm việc với VC++. em chỉ thấy 1 frame truyền được 8 bit data mà chưa thấy truyền 1 frame 16 bits data . Nếu không truyền được 16 bits data /frame thì bài toán vừa nêu em định làm như sau :
Với giá trị cho thanh ghi PDC1 : em truyền byte đầu (8 bits thấp) cho dsPIC , lưu giá trị này vào biến có tên là temp1 , sau đó truyền tiếp byte thứ 2 (8 bits cao) và lưu vào temp2 , sau đó thực hiện phép tính :
PDC1 = (temp2<<8) + temp1;
tương tự với giá trị truyền cho PDC2.
Nhưng em vẫn chưa biết cách thiết lập ngắt cho module UART khi nó nhận xong 4 byte (em muốn nhận xong 4 byte rồi ngắt). và lấy 4 byte vừa nhận ở những thanh ghi nào vì em chỉ thấy có 1 thanh ghi lưu giá trị mà dsPIC nhận thôi ah ?
Cảm ơn thầy và các anh chị nhiều .
Trân trọng !.

namqn 07-09-2009 04:05 PM

Trích:

Nguyên văn bởi conglong (Post 29370)
Thầy Nam và các anh chị trong diễn đàn cho em hỏi về một số liên quan tới UART của dsPIC.
Em đang làm đồ án môn học liên quan tới PID trên máy tính rồi truyền giá trị xuống cho dsPIC. Giá trị em muốn truyền là thông số cho PDC1 và PDC2 (hai thanh ghi thiết lập duty_cycle trong module PWM )cho 2 bánh của robot. hai giá trị em gửi xuống cho dsPIC có tầm từ 0 tới 1599. nên cho em hỏi là có cách nào truyền từ máy tính xuống mà 1 lúc truyền được 16 bit data không ?. em đang làm việc với VC++. em chỉ thấy 1 frame truyền được 8 bit data mà chưa thấy truyền 1 frame 16 bits data . Nếu không truyền được 16 bits data /frame thì bài toán vừa nêu em định làm như sau :
Với giá trị cho thanh ghi PDC1 : em truyền byte đầu (8 bits thấp) cho dsPIC , lưu giá trị này vào biến có tên là temp1 , sau đó truyền tiếp byte thứ 2 (8 bits cao) và lưu vào temp2 , sau đó thực hiện phép tính :
PDC1 = (temp2<<8) + temp1;
tương tự với giá trị truyền cho PDC2.
Nhưng em vẫn chưa biết cách thiết lập ngắt cho module UART khi nó nhận xong 4 byte (em muốn nhận xong 4 byte rồi ngắt). và lấy 4 byte vừa nhận ở những thanh ghi nào vì em chỉ thấy có 1 thanh ghi lưu giá trị mà dsPIC nhận thôi ah ?
Cảm ơn thầy và các anh chị nhiều .
Trân trọng !.

Bạn sẽ không thể truyền 16 bit dữ liệu liên tiếp. Bạn tách 16 bit dữ liệu thành 2 byte là ổn. Để thiết lập module UART tạo ngắt sau khi nhận được 4 byte, bạn đặt các bit URXISEL<1:0> trong thanh ghi U1STA bằng '11' (giả sử bạn đang dùng module UART1).

Để lấy các byte dữ liệu khi có ngắt, bạn liên tiếp đọc thanh ghi U1RXREG (giả sử bạn đang dùng module UART1). Vì các module UARTx sử dụng bộ đệm FIFO (First-In First-Out), nên các byte được nhận trước sẽ được đọc ra trước. Cụ thể, ví dụ từ máy tính bạn lần lượt gửi các giá trị a, b, c, và d đến dsPIC. Sau khi nhận được giá trị d, dsPIC sẽ tạo ra ngắt, và khi xử lý ngắt, nếu bạn liên tiếp đọc thanh ghi U1RXREG thì bạn sẽ lần lượt nhận được các giá trị a, b, c, và d.

Thân,

conglong 07-09-2009 09:44 PM

Trích:

Nguyên văn bởi namqn (Post 29379)
Bạn sẽ không thể truyền 16 bit dữ liệu liên tiếp. Bạn tách 16 bit dữ liệu thành 2 byte là ổn. Để thiết lập module UART tạo ngắt sau khi nhận được 4 byte, bạn đặt các bit URXISEL<1:0> trong thanh ghi U1STA bằng '11' (giả sử bạn đang dùng module UART1).

Để lấy các byte dữ liệu khi có ngắt, bạn liên tiếp đọc thanh ghi U1RXREG (giả sử bạn đang dùng module UART1). Vì các module UARTx sử dụng bộ đệm FIFO (First-In First-Out), nên các byte được nhận trước sẽ được đọc ra trước. Cụ thể, ví dụ từ máy tính bạn lần lượt gửi các giá trị a, b, c, và d đến dsPIC. Sau khi nhận được giá trị d, dsPIC sẽ tạo ra ngắt, và khi xử lý ngắt, nếu bạn liên tiếp đọc thanh ghi U1RXREG thì bạn sẽ lần lượt nhận được các giá trị a, b, c, và d.

Thân,

ah, dạ em cảm ơn thầy nhiều !
Trân trọng !.

npbaoduy 30-10-2009 09:50 PM

Hỏi về giao tiếp I2C với ROM 24c512
 
Em có đoạn code như sau, với ý tưởng là lưu một byte vô ROM (0x66) vào địa chỉ 0001, sau đó đọc lại byte đó và gởi ra cổng nối tiếp, nhưng em không đạt kết quả (không gởi ra cổng nối tiếp được gì)
Code:

int main(void) {
        Init_PORTS();                //Khoi tao cac cong I/O
        Init_I2C();                        //Khoi tao module I2C
        Init_UART1_Module();
        Init_TMR1();
        //Buoc 1, tao dieu kien START, cho hoat dong I2C hoan tat
        _SEN = 1;
        Wait_I2C();                        //Cho hoat dong I2C hoan tat
        //Buoc 2, xuat dia chi cua ROM voi thao tac ghi, cho va kiem tra ACK
        Write_I2C(0xA0);                //Xuat dia chi cua ROM, sap ghi vao ROM
        Wait_I2C();                        //Cho hoat dong I2C hoan tat
        if (_ACKSTAT)        I2C_Fail();                //Neu NACK thi dung chuong trinh
        //Buoc 3, xuat dia chi cua thanh ghi dich (target), cho va kiem tra ACK
        Write_I2C(0x00);                //Xuat dia chi cao
        Wait_I2C();                        //Cho hoat dong I2C hoan tat
        if (_ACKSTAT)        I2C_Fail();                //Neu NACK thi dung chuong trinh
        Write_I2C(0x01);                //xuat dia chi thap
        Wait_I2C();                        //Cho hoat dong I2C hoan tat
        if (_ACKSTAT)        I2C_Fail();                //Neu NACK thi dung chuong trinh
        Write_I2C(0x66);                //Xuat noi dung cua thanh ghi 0x0000
        Wait_I2C();                        //Cho hoat dong I2C hoan tat
        if (_ACKSTAT)        I2C_Fail();                //Neu NACK thi dung chuong trinh
        _PEN = 1;        //Tao ra dieu kien STOP
        Wait_I2C();                        //Cho hoat dong I2C hoan tat

        // doc du lieu tu ROM va goi ra cong RS232
                _RSEN = 1;                        //Tao ra dieu kien START
                Wait_I2C();                        //Cho hoat dong I2C hoan tat
                //Buoc 2, ghi dia chi cua ROM, sap thao tac ghi vao ROM
                Write_I2C(0xA0);
                if (_ACKSTAT)        I2C_Fail();                //Neu NACK thi xu ly loi               
                Write_I2C(0x00);
                if (_ACKSTAT)        I2C_Fail();                //Neu NACK thi xu ly loi
                Write_I2C(0x01);
                if (_ACKSTAT)        I2C_Fail();                //Neu NACK thi xu ly loi
                _RSEN = 1;                        //Tao ra dieu kien RESTART
                Wait_I2C();                        //Cho hoat dong I2C hoan tat
                Write_I2C(0xA1);        //Ghi dia chi cua ROM, chuan bi doc tu ROM
                if (_ACKSTAT)        I2C_Fail();                //Neu NACK thi xu ly loi

                temp = Read_I2C();
                _PEN=1;
                Wait_I2C();
                U1TXREG = temp;
                        while(!U1STAbits.TRMT); // cho hoan tat goi byte.       
                while(1) Nop();               
}

//Chuong trinh con khoi tao cac cong I/O
void Init_PORTS(void) {
        LATC = 0xFFFF;                //Tat cac LED (anode chung) noi vao cong E
        TRISC = 0;                //LED noi vao RC5
        TRISG=0;
}

//Chuong trinh con khoi tao module I2C
void Init_I2C(void) {
        I2CCON = 0x8200;                //bit15=I2CEN, bit9=DISSLW (tat Slew Rate
                                                        //Control cho cac toc do baud khac 400 kbps)
        I2CBRG = (((Fcy/baud) - (Fcy/1111111))-1);
}

//Chuong trinh con xuat 1 byte qua module I2C
void Write_I2C(unsigned char d) {
        I2CTRN = d;
}

//Chuong trinh con cho hoat dong 00Master I2C sau cung hoan tat
void Wait_I2C(void) {
        while (!_MI2CIF);
        _MI2CIF = 0;
}

//Chuong trinh con xu ly khi hoat dong I2C bi loi
void I2C_Fail(void) {
        _PEN = 1;                //Tao ra dieu kien STOP
        Wait_I2C();                        //Cho hoat dong I2C hoan tat
        LATC &= 0x0000;                //Bat LED noi vao RE0 de bao loi
        U1TXREG = 70;
        while (1);                        //Dung chuong trinh tai day
}
unsigned char Read_I2C(void) {
        unsigned char d;
        _RCEN = 1;                                //Cho phep nhan byte
        Wait_I2C();                                //Cho hoat dong I2C hoan tat
        d = I2CRCV;                                //Lay byte da nhan dat vao d
        _ACKEN = 1;                                //Ghi bit ACK/NACK ra I2C bus
        Wait_I2C();                                //Cho hoat dong I2C hoan tat
        return d;                                //Tra byte da doc ve chuong trinh goi
}

em xin lỗi vì code hơi dài, nhưng em không hiểu nó sai chỗ nào đành phải gởi lên cho mọi người xem giúp.
Các hàm đọc/ghi I2C em là tương tự TUT4 của anh namqn. Fcy của em là 7372800, baud của I2C = 100khz.
Các chân A0, A1, A2 của ROM em đã nối mass, nên địa chỉ của ROM là A0(ghi) và A1(đọc)
Module UART thì chắc ko sai, vì em đã thử các ví dụ khác, truyền và nhận rất tốt, tốc độ baud cũng ko sai, em đã kiểm tra kỹ, hơn nữa em nghi nếu sai tốc độ baud thì nó sẽ nhận được các ký tự lạ, đằng này không nhận được gì trên máy tính.
ROM thì chắc ko chết, vì em đã mua một con mới về thử :D.
Vậy có ai biết xin góp ý giúp em, hoặc có một ví dụ nào đó cụ thể về đọc ghi ROM 24c512 thì cho em xin để tham khảo, em cám ơn rất nhiều.

namqn 31-10-2009 07:47 AM

Không thể ghi vào 24C512 rồi đọc ra ngay đâu bạn, cần có khoảng 5 ms để EEPROM hoàn tất thao tác ghi. Sau khi chờ tối thiểu 5 ms, bạn tạo điều kiện START chứ không dùng RESTART được nhé.

Thân,

npbaoduy 31-10-2009 10:08 AM

Em đã thử rồi, sau khi ghi vào ROM, cho I2C stop, timer chạy, mỗi lần ngắt sau 0.5s mới start i2c và đọc từ rom, nhưng nó chỉ đọc được giá trị 0. Phần giao tiếp I2C thì ko báo lỗi, vì nếu báo lỗi, chương trình sẽ dừng khi vào hàm I2C_Fail(), đằng này chương trình vẫn chạy (có led nhấp nháy và cứ sau mỗi 0.5s đều gởi ra cổng nối tiếp giá trị 0).
Code:

void _ISR _T1Interrupt(void) {
        _T1IF = 0;                        //Xoa co ngat
        _LATC4 ^= 1;                //Lat trang thai LED
        _SEN = 1;                        //Tao ra dieu kien START
                Wait_I2C();                        //Cho hoat dong I2C hoan tat
               
                Write_I2C(0xA0);
                if (_ACKSTAT)        I2C_Fail();                //Neu NACK thi xu ly loi
               
                Write_I2C(0x00);
                if (_ACKSTAT)        I2C_Fail();                //Neu NACK thi xu ly loi
                Write_I2C(0x01);
                if (_ACKSTAT)        I2C_Fail();                //Neu NACK thi xu ly loi
               
                _RSEN = 1;                        //Tao ra dieu kien RESTART
                Wait_I2C();                        //Cho hoat dong I2C hoan tat
               
                Write_I2C(0xA1);        //Ghi dia chi cua ROM, chuan bi doc tu ROM
                if (_ACKSTAT)        I2C_Fail();                //Neu NACK thi xu ly loi

                temp = Read_I2C();
                _PEN=1;
                Wait_I2C();
                U1TXREG = temp;
                while (!U1STAbits.TRMT);
}

Nhân tiện đây em cũng xin hỏi, điều kiện start và restart khác nhau như thế nào?
Em xin cám ơn

namqn 31-10-2009 11:34 AM

Trích:

Nguyên văn bởi npbaoduy (Post 30753)
Em đã thử rồi, sau khi ghi vào ROM, cho I2C stop, timer chạy, mỗi lần ngắt sau 0.5s mới start i2c và đọc từ rom, nhưng nó chỉ đọc được giá trị 0. Phần giao tiếp I2C thì ko báo lỗi, vì nếu báo lỗi, chương trình sẽ dừng khi vào hàm I2C_Fail(), đằng này chương trình vẫn chạy (có led nhấp nháy và cứ sau mỗi 0.5s đều gởi ra cổng nối tiếp giá trị 0).
Code:

void _ISR _T1Interrupt(void) {
        _T1IF = 0;                        //Xoa co ngat
        _LATC4 ^= 1;                //Lat trang thai LED
        _SEN = 1;                        //Tao ra dieu kien START
                Wait_I2C();                        //Cho hoat dong I2C hoan tat
               
                Write_I2C(0xA0);
                if (_ACKSTAT)        I2C_Fail();                //Neu NACK thi xu ly loi
               
                Write_I2C(0x00);
                if (_ACKSTAT)        I2C_Fail();                //Neu NACK thi xu ly loi
                Write_I2C(0x01);
                if (_ACKSTAT)        I2C_Fail();                //Neu NACK thi xu ly loi
               
                _RSEN = 1;                        //Tao ra dieu kien RESTART
                Wait_I2C();                        //Cho hoat dong I2C hoan tat
               
                Write_I2C(0xA1);        //Ghi dia chi cua ROM, chuan bi doc tu ROM
                if (_ACKSTAT)        I2C_Fail();                //Neu NACK thi xu ly loi

                temp = Read_I2C();
                _PEN=1;
                Wait_I2C();
                U1TXREG = temp;
                while (!U1STAbits.TRMT);
}

Nhân tiện đây em cũng xin hỏi, điều kiện start và restart khác nhau như thế nào?
Em xin cám ơn

Bạn nên thử với các tốc độ baud thấp, đừng thử với tốc độ tương đương tốc độ tối đa ghi trong datasheet của linh kiện.

START có đường truyền ở trạng thái idle đủ lâu, còn RESTART bao gồm STOP đi liền với START (tức là đường truyền không ở trạng thái idle đủ lâu như trường hợp START).

Thân,

npbaoduy 31-10-2009 01:15 PM

Cám ơn anh nhiều.
Nhưng em nghĩ tốc độ 100khz là nhỏ nhất rồi chứ? Trong datasheet em thấy có 1khz, 4khz và 1mhz lận :D.
Chắc em sẽ mua một con dsPIC mới về thử, biết đâu nó bị hư gì đấy, về sơ đồ kết nối thì em kiểm tra kỹ rồi, có điện trở 4.7k kéo lên nguồn nữa, loay hoay gần cả tuần mà vẫn chưa giải quyết được.
Nếu có ai đã từng giao tiếp với ROM này được, có thể cho em xin xem qua để tham khảo nhé.
Chúc mọi người vui vẻ.

harakiri 04-11-2009 01:36 PM

Em muốn gửi một loạt các chuỗi qua UART như "TC", delay 1 khoảng rồi gửi "RC m x y z k t" ( với m x y z k t là số thập phân) ,rồi "M". Tuy nhiên thanh ghi UxTXREG ( em dùng dsPIC33FJ64GP710) chỉ có 4 bộ đệm, như vậy em phải thiết lập thế nào các thanh ghi để gửi.

npbaoduy 08-11-2009 01:02 AM

điều gì xảy ra khi gởi giá trị 0 qua module UART?
 
Vấn đề ROM vẫn mò chưa ra :D, hôm nay em lại gặp một vấn đề thế này:
Code:

U1TXREG=0x00;
        while(!U1STAbits.TRMT);
        U1TXREG=0x41;
        while(!U1STAbits.TRMT);

thì trên máy tính chỉ nhận được giá trị 0, không nhận được 0x41 (ký tự A), em sử dụng VB, thấy không in ra được ký tự nào cả, dùng hàm lấy mã ascii chỉ thấy số 0.
còn nếu thay:
Code:

U1TXREG=0x01;  //có thể là một giá trị nào đó bất kỳ khác 0
        while(!U1STAbits.TRMT);
        U1TXREG=0x41;
        while(!U1STAbits.TRMT);

thì trên máy tính nhận được cả 2 giá trị (hiển thị được cả 2 ký tự).
Em không hiểu chỗ này, không lẽ khi gởi giá trị 0, bit U1STAbits.TRMT không được bật lên sau khi đã truyền xong hay sao?
Nếu thay bằng:
Code:

U1TXREG=0x00;
        delay_ms(100);
        U1TXREG=0x41;
        while(!U1STAbits.TRMT);

thì nhận được cả số 0 và số 0x41, nhưng điều kiện là delay_ms phải đủ lớn, nếu delay_ms(1) thì cũng ko nhận được số 0x41 (quan sát thấy y như trường hợp đầu tiên).

harakiri 11-11-2009 06:13 PM

Giả sử em nhận được về chip một chuỗi các kí tự " T a1 a2 a3 a4 a5"(a1,a2,a3... là số thập phân có 2 hoặc 3 chữ số nhưng bây giờ nó đang được xem là một chuỗi ký tự). Bây giờ em muốn tách chuỗi ký tự này thành một chuỗi a1 ,a2 ,a3....với a1,a2,a3 được xem là số. Liệu có hàm nào làm được điều này không?

mtuankct 11-11-2009 10:05 PM

Theo mình chẳng có hàm nào làm được cả, cái này do bạn tự quy định thôi mà, nó phụ thuộc vào dữ liệu của bạn. Đơn giản nhất theo mình là cứ quy định mỗi số chiếm 2 byte hoăc 3byte tùy bạn

namqn 11-11-2009 10:27 PM

Trích:

Nguyên văn bởi harakiri (Post 31121)
Giả sử em nhận được về chip một chuỗi các kí tự " T a1 a2 a3 a4 a5"(a1,a2,a3... là số thập phân có 2 hoặc 3 chữ số nhưng bây giờ nó đang được xem là một chuỗi ký tự). Bây giờ em muốn tách chuỗi ký tự này thành một chuỗi a1 ,a2 ,a3....với a1,a2,a3 được xem là số. Liệu có hàm nào làm được điều này không?

Chuỗi ký tự khác chuỗi số của bạn ở chỗ nào?

Nếu tôi đoán không lầm, bạn muốn chuyển các tham số a1 a2 ... thành các giá trị số sau khi nhận được từ bên ngoài. Trong trường hợp này (giả sử bạn đang dùng C30), mỗi chuỗi ai có thể được dùng làm đối số cho hàm C chuẩn atoi() (sẽ cần #include <stdlib.h>). Đề nghị tham khảo tài liệu hướng dẫn !16-bit Language Tools Libraries" (DS51456) của Microchip.

Thân,

harakiri 12-11-2009 12:22 AM

Ý của em là khi em gọi thành phần thứ 2 trong mảng, nó sẽ xuất ra cho em là a1(không kể khoảng trắng là ký tự) và a1,a2 ta không biết trước bao nhiêu ký tự.
Em dúng khoảng trắng để nhận biết nó, cuối cùng đã nhận được.
Cám ơn anh đã quan tâm trả lời giùm em.

harakiri 05-12-2009 02:00 PM

Code:

#include <p33FJ256GP710.h>
#include <stdlib.h>
_FOSCSEL(FNOSC_FRC);                       
_FOSC(FCKSM_CSECMD & OSCIOFNC_OFF  & POSCMD_NONE); 

#define TRUE        1
#define FALSE        0
unsigned char S2Flag, S3Flag, S4Flag, S5Flag;

unsigned int on_off ,time_out,j,t,i,x1,k;
unsigned char input[50];
unsigned char getc();
void putc(unsigned char value);
unsigned char* GetWord(unsigned char a[], int size, int index);
/***********************************************************/
void __attribute__((__interrupt__)) _U2RXInterrupt(void)
{       
input[0]=getc();
j=0;
if(input[0]=='T'||input[0]=='S')
        {
                while(input[j]!='r')
                {
                        j++;
                        input[j]=getc();
               
                }
               
                U2STAbits.OERR = 0;
        IFS1bits.U2RXIF = 0;    //Clear the UART1 transmitter interrupt flag
                on_off=1;       
        }                       
}
/************************************************************/
void __attribute__((__interrupt__)) _U1RXInterrupt(void)
{       
input[0]=getc();
j=0;
if(input[0]=='T'||input[0]=='S')
        {
                while(input[j]!='r')
                {
                        j++;
                        input[j]=getc();
               
                }
               
                U1STAbits.OERR = 0;
        IFS0bits.U1RXIF = 0;    //Clear the UART1 transmitter interrupt flag
                on_off=1;       
        }                       
}
/**************************************************************/
void __attribute__ ((interrupt, no_auto_psv)) _U2TXInterrupt(void) {
        IFS1bits.U2TXIF = 0;
       
}
/**************************************************************/
void __attribute__ ((interrupt, no_auto_psv)) _U1TXInterrupt(void) {
        IFS0bits.U1TXIF = 0;
}
/***************************************************************/
void InitClock() {
        PLLFBD = 38;        // M = 40
        CLKDIVbits.PLLPOST = 0;        // N1 = 2
        CLKDIVbits.PLLPRE = 0;        // N2 = 2
        OSCTUN = 0;//khong su dung oscillator tuning register
        RCONbits.SWDTEN = 0; // disabe watch dog timer

// Clock switch to incorporate PLL
        __builtin_write_OSCCONH(0x01);                // Initiate Clock Switch to FRC with PLL (NOSC=0b001)
                                                                                // luu y : doc thanh ghi OSCCON de thay
        __builtin_write_OSCCONL(0x01);                // Start clock switching
                                                                                //ghi lan luot vao 8 bit cao va thap cua OSCCON
        while (OSCCONbits.COSC != 0b001);        // Wait for Clock switch to occur       

        while(OSCCONbits.LOCK != 1) {};                //pll lock status bit
}
/****************************************************************/
void Init_UART1 (void)
{       
        int i;
        U1MODE = 0x0000;        //Clear UART1 registers
    U1STA = 0x0000;

        U1BRG=20;                        //set baud rate

        U1MODEbits.PDSEL = 0;        //8bits, no parity
        U1MODEbits.STSEL = 0;        //1stop bit
        U1MODEbits.ABAUD = 0;        //No autobaud
        U1MODEbits.BRGH = 0;        //Low speed

        U1STAbits.UTXISEL0 = 0;
        U1STAbits.UTXISEL1 = 1;
        U1STAbits.URXISEL = 0;

        IEC0bits.U1TXIE = 1; // Enable UART Tx interrupt
        IEC0bits.U1RXIE = 1;
        U1MODEbits.UARTEN = 1; // Enable UART
        IFS0bits.U1RXIF = 0;
        IFS0bits.U1TXIF = 0; 
        U1STAbits.UTXEN = 1; // Enable UART Tx
        /* wait at least 104 usec (1/9600) before sending first char*/
        for(i = 0; i < 4160; i++)
        {
                Nop();
        }

}
/**********************************************************************/
void Init_UART2 (void)
{       
        int i;
        U2MODE = 0x0000;        //Clear UART1 registers
    U2STA = 0x0000;

        U2BRG=20;                        //set baud rate

        U2MODEbits.PDSEL = 0;        //8bits, no parity
        U2MODEbits.STSEL = 0;        //1stop bit
        U2MODEbits.ABAUD = 0;        //No autobaud
        U2MODEbits.BRGH = 0;        //Low speed

        U2STAbits.UTXISEL0 = 0;
        U2STAbits.UTXISEL1 = 1;
        U2STAbits.URXISEL = 0;

        IEC1bits.U2TXIE = 1; // Enable UART Tx interrupt
        IEC1bits.U2RXIE = 1;
        U2MODEbits.UARTEN = 1; // Enable UART
        IFS1bits.U2RXIF = 0;
        IFS1bits.U2TXIF = 0; 
        U2STAbits.UTXEN = 1; // Enable UART Tx
        /* wait at least 104 usec (1/9600) before sending first char*/
        for(i = 0; i < 4160; i++)
        {
                Nop();
        }

}
/*****************************************************************************/
void InitPorts() {
        //ODCFbits.ODCF3 = 1;
        //ODCFbits.ODCF5 = 1;
        // S2 (portB Pin 3, chosen as trigger for sending ... to UART)
        // S3 (portB Pin 2, chosen as trigger for sending ... to UART)
        // S4 (portB Pin 1, chosen as trigger for sending ... to UART)
        // S5 (portB Pin 0, chosen as trigger for sending ... to UART)
        AD1PCFGLbits.PCFG0 = 1;      // This is important.  RB0 is muxxed with AN0,
                                                                // So we need to config the pin as DIGITAL
        AD1PCFGLbits.PCFG1 = 1;
        AD1PCFGLbits.PCFG2 = 1; 
        AD1PCFGLbits.PCFG3 = 1; 
        AD2PCFGLbits.PCFG0 = 1;      // This is important.  RB0 is muxxed with AN0,
                                                                // So we need to config the pin as DIGITAL
        AD2PCFGLbits.PCFG1 = 1;
        AD2PCFGLbits.PCFG2 = 1; 
        AD2PCFGLbits.PCFG3 = 1; 
        TRISB = 0x000F; //B0&B1&B2&B3 is input 

        S2Flag = S3Flag = S4Flag = S5Flag = 0;        // Some Debounce Flags
}
/*******************************************************************************/


/*************************************************************************/

int main(void) {
        InitPorts();
        InitClock();        // This is the PLL settings
        Init_TMR1();
        Init_UART1();        // Initialize UART1 for 9600,8,N,1 TX/RX
        Init_UART2();        // Initialize UART1 for 9600,8,N,1 TX/RX


        while (1)             
                {       
                               
                          if (on_off == 1)     
                    { 
                                on_off = 0;
                                // Chuong trinh xuat ra thanh phan thu 1 cua chuoi
                                        int index = 1;
                                        int i=0;
                                    int j=0;
                                    int wordIndex = 0;
                                        unsigned char a[5];
                                    while(i<50 || a[i] != 'r')
                                    {
                                            if(input[i] == ' ')
                                      {
                                              wordIndex++;
                                        i++;
                                      }
                                      if(wordIndex == index)
                                      {
                                                    a[j] = input[i];
                                        j++;
                                      }
                                      i++;
                                    }
                                          a[j] = ' ';

                                        i=0;
                                        while (a[i] != ' ')
                                        {
                                                int x = atoi(a);
                                                delay_ms(10);
                                                x1 = x;
                                                //putc(a[i]);
                                                i++;
                                               
                                        }
                // Chuong trinh xuat ra thanh phan thu 7 cua chuoi
                                        int index1 = 7;
                                        int i1=0;
                                    int j1=0;
                                    int wordIndex1 = 0;
                                        unsigned char a1[5];
                                    while(i1<50 || a1[i1] != 'r')
                                    {
                                            if(input[i1] == ' ')
                                      {
                                              wordIndex1++;
                                        i1++;
                                      }
                                      if(wordIndex1 == index1)
                                      {
                                                    a1[j1] = input[i1];
                                        j1++;
                                      }
                                      i1++;
                                    }
                                          a1[j1] = ' ';

                                        i1=0;
                                        while (a1[i1] != ' ')
                                        {
                                                int y = atoi(a1);
                                                delay_ms(100);
                                                delay_ms(100);
                                                delay_ms(100);
                                                t=y;
                                                //putc(a1[i1]);
                                                i1++;
                                               
                                        }
                                        k= t/2 + x1*2;
                                        putc(k);
                                       
                                }   
                        }

}

 /*******************************************************************************************
//Function: void Init_TMR1(void)
//Input:        None
//Output:        Setup Parameter to Timer1 Operate
//                TMR1 use for delay
*******************************************************************************************/
void Init_TMR1(void)
{
        T1CONbits.TON=0;                //Stop Timer1
        T1CONbits.TGATE=0;                //Disable Gated Timer mode
        T1CONbits.TCKPS=0;                //Select Prescale 1:1
        T1CONbits.TCS=0;
        _T1IF=0;
        _T1IE=1;
        TMR1=0;
}
/*******************************************************************************************
//Function: void delay_us(unsigned int n)
//Input:        n: n us to delay
//Output:        Delay n us
*******************************************************************************************/
void delay_us(unsigned int n)
{
        PR1=n*40;
        time_out=0;
        T1CONbits.TON=1;
        while(time_out==0);
        T1CONbits.TON = 0;
        TMR1=0;
}
/*******************************************************************************************
//Function: void delay_ms(unsigned int n)
//Input:        n: n ms to delay
//Output:        Delay n ms
*******************************************************************************************/
void delay_ms(unsigned int n)
{
        unsigned int i;
        i=0;
        while(i<=n)
        {
                delay_us(1000);
                i++;       
        }
}
void _ISR _T1Interrupt(void)
{
        _T1IF = 0;                        //Clear Timer1 flag
        time_out = 1;
}

/*************************************************************************/

void putc(unsigned char value)
{
  while (U2STAbits.UTXBF);
        U2TXREG=value;
}

/****************************************************************************/

unsigned char getc()
{
       
                while (!U2STAbits.URXDA);
                       
                return U2RXREG;
}



Đây là đoạn chương trình em định dung 2 module uart một lúc,nhưng khi chạy thử,gửi từ uart2 thì có lúc gửi, lúc không, em đoán là hàm ngat có vấn đề. Mong mọi người xem giúp

greenfield 20-12-2009 08:18 PM

Anh Nam ơi cho em hỏi 2 dòng lệnh này dùng để làm gì ạ?
_PSV=1;
PSVPAG = __builtin_psvpage(Chuoi1);

namqn 20-12-2009 08:59 PM

Trích:

Nguyên văn bởi greenfield (Post 32402)
Anh Nam ơi cho em hỏi 2 dòng lệnh này dùng để làm gì ạ?
_PSV=1;
PSVPAG = __builtin_psvpage(Chuoi1);

_PSV = 1; dùng để cho phép sử dụng chế độ PSV. Còn dòng thứ hai thiết lập địa chỉ trang PSV cho thích hợp để có thể truy xuất chuỗi Chuoi1.

Về chế độ PSV, bạn tìm kiếm trong diễn đàn với từ khóa "PSV", đã có bạn hỏi về PSV và tôi đã trả lời.

Thân,

greenfield 21-12-2009 09:12 PM

Anh Nam cho em hởi cái này. Sao em cài 2 module UART1 và UART2. Cụ thể em lấy U1RX nhận dữ liệu từ cổng COM và U2TX để gửi dữ liệu nhận được về máy tính mà không được. Mong anh Nam chỉ giúp em!

namqn 21-12-2009 10:30 PM

Trích:

Nguyên văn bởi greenfield (Post 32425)
Anh Nam cho em hởi cái này. Sao em cài 2 module UART1 và UART2. Cụ thể em lấy U1RX nhận dữ liệu từ cổng COM và U2TX để gửi dữ liệu nhận được về máy tính mà không được. Mong anh Nam chỉ giúp em!

Không hiểu câu hỏi của bạn: Cổng COM nối vào U1RX là thiết bị gì?

Sơ đồ mạch ứng dụng của bạn ra sao? Code liên quan đến 2 module UART như thế nào?

Thân,

greenfield 21-12-2009 11:25 PM

Cụ thể em dùng dsPIC30F4013 dùng UART1 nhận dữ liệu từ máy tính và trả ký tự nhận được về máy tính qua module UART2 thử được không. Ý của em là dùng một lúc 2 module UART của dsPIC30F4013 đó mà. Em dùng Hyper Terminal của Win

namqn 22-12-2009 07:37 AM

Trích:

Nguyên văn bởi greenfield (Post 32429)
Cụ thể em dùng dsPIC30F4013 dùng UART1 nhận dữ liệu từ máy tính và trả ký tự nhận được về máy tính qua module UART2 thử được không. Ý của em là dùng một lúc 2 module UART của dsPIC30F4013 đó mà. Em dùng Hyper Terminal của Win

Vậy bạn kết nối phần cứng ra sao? Và code liên quan đến 2 module như thế nào? (Đừng nên để người muốn giúp bạn phải lặp lại những câu hỏi thu thập thông tin nhiều lần).

Thân,

tahi 15-01-2010 11:33 AM

dsPIC33 ko nhận được uart.
phần cứng dspic33fj128 nối với max232 (loại smd cấp nguồn 3v3)
truyển từ dspic lên pc thì ngon
nhưng truyền từ pc xuống dspic thì ngỏm. Có xung rất đẹp đến chân nhận của dspic

chân truyền nhận đã được remappable.
Khi cấu hình loopback thì đường truyền 1 chuỗi ký tự !!!!!!!!!. Để loopback thì bít U1STAbits.URXDA có được bật lên, nếu để ngắt thì cũng có nhảy vào ngắt nhận

nhưng nếu ko dùng loopback thì bít U1STAbits.URXDA ko bật lên, mà cũng chẳng vào ngắt, mặc dù có xung ở nhân nhận
Code:

//Remap
//UART1 TX1 RP3-3 RPOR1 ; RX1 RP2 RPINR18
        _RP3R = 0x03;                        //RP3 is UART1 output        RB3       
        _U1RXR = 0x02;                        //RP2 is uart1 input          RB2

Code:

/* check for receive errors */
                if(U1STAbits.FERR == 1)
                {
                        lcd_putchar('?');
                }
                /* must clear the overrun error to keep uart receiving */
                if(U1STAbits.OERR == 1)
                {
                        U1STAbits.OERR = 0;
                        lcd_putchar('?');
                }
                /* get the data */
                while(U1STAbits.URXDA)
                {
                        ReceivedChar = U1RXREG;
                        _LATA10 =~ _LATA10;
                }


shinosuke 25-05-2010 05:36 PM

Em đang thử làm giao tiếp RS232 qua 1 bộ wireless. Truyền nhận có dây lên terminal thì ok, nhưng cứ cắm bộ không dây vào thì không có tín hiệu. Có ai biết nguyên nhân có thể là do đâu không ạ ?
-----
Đi lại dây ở cổng COM lại chạy tốt rồi :D

channan 20-09-2010 11:37 AM

dsPIC30 UART module
 
Chào các bạn

Mẹo vặt để tính BRG có làm tron 1 số sau dấu chấm thập phân
vd: Sau khi tính BRG = 12.1 làm tròn 12
BRG = 15.5 làm tròn 16
//define in UART header file

#define XTAL (7372800UL) //ETT board has 7.7328Mhz XT crystal
#define PLL (16) //Clock source = Primary XT and PLL_16
#define FOSC (XTAL*PLL)
#define FCY ((FOSC)/4) //Intrustion frequency

#define BAUD_RATE 115200UL //UART baud rate
//UART1 brg value
U1BRG = ((FCY / BAUD_RATE) + 8) / 16;

channan 20-09-2010 11:58 AM

Chào bạn

Cho tôi hỏi ngoài đề 1 chút:
Làm sao viết source code ở trong các bài post lên vậy?
Cẩm ơn !

HoanNguyenHuu 09-04-2012 12:42 PM

Chào các bác!!!
Hiện tại em có đang làm về truyền thông RS485 theo giao thức modbus để truyền thông giữa bộ điều khiển slave (dựa trên VĐK DSPIC30F4011) và phần mềm modbusmaster.
Có bác nào làm về vấn đề này, hay có code mẫu cũng như tài liệu có thể share giúp mình được không??? em đang gặp rất nhiều khó khăn với đề tài này.
Cảm ơn các bác nhiều!!!

HoanNguyenHuu 15-04-2012 12:41 AM

Đợi mãi không thấy bác nào lên tiếng, nản quá?

sputnhic11 08-05-2012 11:38 PM

Thiết lập I/O của dspic30f4013
 
Em đang làm cái đồ án dùng chip dspic30f4013, bài lập trình thì ngon rùi nhưng phần khai báo vào ra để lắp nút ấn mà em chịu. Em định cho nút ấn ở port F thui vì các port khác em dùng rùi. em gửi đoạn code mong các bác chỉ giúp khai báo ở chỗ nào nhé:


/************************************************** *****************************
; timer1.c la chuong trinh viet bang C de chay tren mot dsPIC *
; Chuong trinh thuc hien viec sau: *
; Su dung Time 1 de tao xung nhip 20ms va thoi gian duty Cryle *
************************************************** ******************************
| __________
| | | |
| | | |
|____| |________________________________________|
<--1,5ms-->
<----------------------20ms------------------------->
; Tac gia : Luu Tuan Khanh *

; Don vi : Uneti *

; Ten tap tin : ltchuan.c *

; Ngay : 23/5/2011 *

; Phien ban : 0.01 *

; Nhung tap tin can thiet khac: p30F4013.gld, p30f4013.h *

; Cong cu duoc dung: MPLAB X IDE beta6.00.01 *
; C30 3.25 * *

------------------------------------------------------------------------------*/
#include <p30fxxxx.h>
#include <timer.h>
/************************************************** ****************************/
//output SERVO
#define LAT_SERVO1 _LATB0
#define LAT_SERVO2 _LATB1
#define LAT_SERVO3 _LATB2
#define LAT_SERVO4 _LATB3
#define LAT_SERVO5 _LATB4
#define LAT_SERVO6 _LATB5

#define LAT_SERVO7 _LATB6
#define LAT_SERVO8 _LATB7
#define LAT_SERVO9 _LATB8
#define LAT_SERVO10 _LATC13
#define LAT_SERVO11 _LATC14
#define LAT_SERVO12 _LATD9
#define congtac1 _TRISF0
#define congtac2 _TRISF1
#define den _LATB9

/*********************Bat dau khai bao bien*************************/
unsigned long counter_servo = 1;
unsigned int speed_servo[13];
//--------------------Ket thuc khai bao bien------------------------//
void config_servo(void);
void timer1_init(void);
int goc(float goc);

void __attribute__((interrupt, no_auto_psv)) _T1Interrupt(void){
IFS0bits.T1IF = 0; //truoc khi ra ngoai thi thi xoa bit _T1IF
T1CONbits.TON = 1;
//timer for 1us*20000=20ms
//1ms=1000 thuc te xxx min
//test 0.5ms - 2.4ms tuong ung voi 1-180do //Do thuc te
if(++counter_servo > 2010) counter_servo = 0;
if(counter_servo >= speed_servo[1] + 62) // MAX 240
LAT_SERVO1=0; // MIN 60
else
LAT_SERVO1=1; // MIN 60
if(counter_servo >= speed_servo[2] + 62) // MAX 240
LAT_SERVO2=0; // MIN 60
else
LAT_SERVO2=1;
if(counter_servo >= speed_servo[3] + 62) // MAX 240
LAT_SERVO3=0; // MIN 60
else
LAT_SERVO3=1;
if(counter_servo >= speed_servo[4] + 62) // MAX 240
LAT_SERVO4=0; // MIN 60
else
LAT_SERVO4=1;
if(counter_servo >= speed_servo[5] + 62) // MAX 240
LAT_SERVO5=0; // MIN 60
else
LAT_SERVO5=1;
if(counter_servo >= speed_servo[6] + 62) // MAX 240
LAT_SERVO6=0; // MIN 60
else
LAT_SERVO6=1;
if(counter_servo >= speed_servo[7] + 62) // MAX 240
LAT_SERVO7=0; // MIN 60
else
LAT_SERVO7=1; // MIN 60
if(counter_servo >= speed_servo[8] + 62) // MAX 240
LAT_SERVO8=0; // MIN 60
else
LAT_SERVO8=1;
if(counter_servo >= speed_servo[9] + 62) // MAX 240
LAT_SERVO9=0; // MIN 60
else
LAT_SERVO9=1;
if(counter_servo >= speed_servo[10] + 62) // MAX 240
LAT_SERVO10=0; // MIN 60
else
LAT_SERVO10=1;
if(counter_servo >= speed_servo[11] + 62) // MAX 240
LAT_SERVO11=0; // MIN 60
else
LAT_SERVO11=1;
if(counter_servo >= speed_servo[12] + 62) // MAX 240
LAT_SERVO12=0; // MIN 60
else
LAT_SERVO12=1;
}

void config_servo(void){
ADPCFG = 0xffff;
TRISB = 0x00;
TRISC = 0x00;
TRISD = 0x00;
TRISF = 0x00;

LATB = 0x00;
LATC = 0x00;
LATD = 0x00;
LATF = 0x00;

}
void timer1_init(void)
{
config_servo();
T1CON = 0; // Timer reset
T1CONbits.TSIDL = 0; //hoat dong ngay ca o che do ngu
T1CONbits.TGATE = 0; //Gated time accumulation enabled(TCS must be set to ‘0’ when TGATE = 1. Reads as ‘0’ if TCS = 1)
//T1CONbits.TSYNC = 0; //bit nay duoc bo qua khi bit TCS = 0; chi quan tam khi TCS = 1;
IFS0bits.T1IF = 0; // Reset Timer1 interrupt flag
IPC0bits.T1IP = 0b111; // Timer1 Interrupt priority level=7 // muc uu tien 7//quan trong
IEC0bits.T1IE = 1; // Enable Timer1 interrupt

T1CONbits.TCKPS = 0b00; // Bo chia tan so 1 : 1

TMR1 = 0x0000;
PR1 = 295 ; // Ngat khi dem tran 10us
//PR1 = 29491 ; // ngat khi dem tran 1ms
// T = (1/Fosc)s ma Fosc = (XTFREQ * PLL) /4
// PR1 = 29.4912 * 1 * 1 cycle (33.9084201388888888888888ns) = 1 us
T1CONbits.TCS = 0; // Timer1 Clock= Internal // Internal clock (FOSC/4)
T1CONbits.TON = 1; // Enable Timer1 and start the counter
}
int goc(float goc){
float goc1 = 0;
unsigned int goc2 = 0;
if(goc == 0) return 0;
else{
goc1 = 18 * goc;
goc1 = goc1/18;
goc2 = (int) goc1;
};
return goc2;
}

daibang1208 09-05-2012 10:55 AM

Các anh chị và các bạn cho mình hỏi tại sao khi mình thay đổi tốc độ baud từ 38400 trong ví dụ của anh Nam thành 9600:
cũ:U1BRG =1(((8000000/38400)/16)-1);
Thành: U1BRG =1(((8000000/9600)/16)-1);
và thay đổi tốc đọ baud của VB thì ký tự nhận được bị lỗi.


Múi giờ GMT. Hiện tại là 03:30 PM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam