![]() |
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 ? |
Trích:
Trân trọng! à mà dạo này Picvietnam thấy sa sút qua thầy Nam ơi ! |
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, |
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ỉ ?
|
Trích:
|
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 đề
|
Ô 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 :(
|
Trích:
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, |
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 !. |
Trích:
Để 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, |
Trích:
Trân trọng !. |
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) { 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. |
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, |
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) { Em xin cám ơn |
Trích:
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, |
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ẻ. |
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.
|
đ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; còn nếu thay: Code:
U1TXREG=0x01; //có thể là một giá trị nào đó bất kỳ khác 0 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; |
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?
|
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
|
Trích:
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, |
Ý 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. |
Code:
#include <p33FJ256GP710.h> Đâ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 |
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); |
Trích:
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, |
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!
|
Trích:
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, |
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
|
Trích:
Thân, |
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 Code:
/* check for receive errors */ |
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 |
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; |
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 ! |
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!!! |
Đợi mãi không thấy bác nào lên tiếng, nản quá?
|
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; } |
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