Thông báo

Collapse
No announcement yet.

Code thu RF cho PIC

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Code thu RF cho PIC

    Em đang dùng modul RF của bác Quế Dương code dựa trên code của bác ý cung cấp ở đây: Welcome to Que Duong Electronics Website !...
    em chuyển code sang CCS, code cho modul phát đã ok rồi, còn modul thu hơi rắc rối ở đoạn này

    Code:
    bit get_data(unsigned char *buff)
    {
    	unsigned char i,j,T0,count;	
    	
    	i=16;		
    	count=0;	
    	OPTION=0x04;	// pre scaler = 32 for counting long time
    // Tim bit preamble ( mo dau)
    	while(--i)	// wait preamble
    	{		    
    		 NOP();  // tre 14 chu ky may
    	     NOP();
    	     NOP();
    	     while(RX);	   // kiem tra chan nhan rx=1, next
    	     TMR0=0;   // co tin hieu , set tmr=0
    	     NOP();  // tre 
    	     NOP();
    	     NOP();
    	     while(!RX); // kiem tra neu rx=0, next
    	     T0=TMR0;    // cho t0=tmr0
    	     if (T0==0xFF) return 1;      // error
    		 //phan duong cua bit khoang 5 ms
    	     if ((T0>=146) && (T0<=166))	  // 4672-5312 uS it OK.   tmr0= 5ms -->dung
    	     {
    		    count++;
    		    if ((count>=5)|| (i==0)) break; //nhan dc 5 lan -->ok
    	     }	     
    	}
    	
    	if (i==0) return 1; // error				
    		
    	OPTION=0x06;	// prescaler = 128
    	T0=0; // set lai T0
    	while (!((T0>=146) && (T0<=166)))	     // 18688 - 21248 uS it OK. syn bit=15000us
    	{
    		NOP();
    	    NOP();
         	NOP();
    		while(RX);	// wait syn
    		TMR0=0;
    		NOP();
    		NOP();
    	    NOP();
         	NOP();
    		while(!RX);
    		T0=TMR0;    
    	}	
    		
    	while(RX); 			//wait start bit go low
    	DelayBigUs(7355); 	// delay 7500 uS before sampling
    	
    	for (j=0;j<3;j++)
    	{
    	  i=8;
    	  buff[j]=0;
    	  while(i--)
    	  {
    		buff[j]=buff[j]<<1;
    		rx_bit=RX;	// sampling
    		buff[j]=buff[j] | rx_bit;			
    		
    		if (rx_bit==0) 
    		   while(!RX);	
    		else
    		   while(RX);
    		DelayBigUs(7355); 	// delay 7500 uS before sampling		
    		
    	  }
    	}
    	
    	if (rx_bit==0) 
    		if (!RX) return 1; // error (no stop bit found)
    	else
    		if (!RX) return 1; // error (no stop bit found)
    		
    	//*buff=TEMP[0];			
    	return 0;
    }
    Em ko hiểu lệnh OPTION trong này chuyển sang CCS thì viết thế nào, cả phần TMR0 nữa, mong các cao thủ giúp đỡ
    -

  • #2
    Nguyên văn bởi phamhuantn Xem bài viết
    Em đang dùng modul RF của bác Quế Dương code dựa trên code của bác ý cung cấp ở đây: Welcome to Que Duong Electronics Website !...
    em chuyển code sang CCS, code cho modul phát đã ok rồi, còn modul thu hơi rắc rối ở đoạn này

    Code:
    bit get_data(unsigned char *buff)
    {
    	unsigned char i,j,T0,count;	
    	
    	i=16;		
    	count=0;	
    	OPTION=0x04;	// pre scaler = 32 for counting long time
    // Tim bit preamble ( mo dau)
    	while(--i)	// wait preamble
    	{		    
    		 NOP();  // tre 14 chu ky may
    	     NOP();
    	     NOP();
    	     while(RX);	   // kiem tra chan nhan rx=1, next
    	     TMR0=0;   // co tin hieu , set tmr=0
    	     NOP();  // tre 
    	     NOP();
    	     NOP();
    	     while(!RX); // kiem tra neu rx=0, next
    	     T0=TMR0;    // cho t0=tmr0
    	     if (T0==0xFF) return 1;      // error
    		 //phan duong cua bit khoang 5 ms
    	     if ((T0>=146) && (T0<=166))	  // 4672-5312 uS it OK.   tmr0= 5ms -->dung
    	     {
    		    count++;
    		    if ((count>=5)|| (i==0)) break; //nhan dc 5 lan -->ok
    	     }	     
    	}
    	
    	if (i==0) return 1; // error				
    		
    	OPTION=0x06;	// prescaler = 128
    	T0=0; // set lai T0
    	while (!((T0>=146) && (T0<=166)))	     // 18688 - 21248 uS it OK. syn bit=15000us
    	{
    		NOP();
    	    NOP();
         	NOP();
    		while(RX);	// wait syn
    		TMR0=0;
    		NOP();
    		NOP();
    	    NOP();
         	NOP();
    		while(!RX);
    		T0=TMR0;    
    	}	
    		
    	while(RX); 			//wait start bit go low
    	DelayBigUs(7355); 	// delay 7500 uS before sampling
    	
    	for (j=0;j<3;j++)
    	{
    	  i=8;
    	  buff[j]=0;
    	  while(i--)
    	  {
    		buff[j]=buff[j]<<1;
    		rx_bit=RX;	// sampling
    		buff[j]=buff[j] | rx_bit;			
    		
    		if (rx_bit==0) 
    		   while(!RX);	
    		else
    		   while(RX);
    		DelayBigUs(7355); 	// delay 7500 uS before sampling		
    		
    	  }
    	}
    	
    	if (rx_bit==0) 
    		if (!RX) return 1; // error (no stop bit found)
    	else
    		if (!RX) return 1; // error (no stop bit found)
    		
    	//*buff=TEMP[0];			
    	return 0;
    }
    Em ko hiểu lệnh OPTION trong này chuyển sang CCS thì viết thế nào, cả phần TMR0 nữa, mong các cao thủ giúp đỡ
    OPTION trong 1 số trình dịch ( là thanh ghi OPTION_REG ) ... thanh ghi này điều khiển Timer0 , hệ số chia của timer0 , hệ số chia watchdog, RB Pullup

    --- Timer0 là giá trị của thanh ghi Timer0 ( Timer0 8 bit thì giá trị của nó nằm trong 0 -> 255 )

    --- Thằng CCS thì mình không dùng lâu rồi ( đây có lẽ là trình biên dịch cho MCU lởm nhất mà mình đã từng dùng ) ... cũng không nhớ nhiều .

    Nhưng có thế thay thế : VD : nếu option ( clock / 32 ) ( tìm hiểu thêm trong này :

    Code:
    ////////////////////////////////////////////////////////////////// Timer 0
    // Timer 0 (AKA RTCC)Functions: SETUP_COUNTERS() or SETUP_TIMER_0(),
    //                              SET_TIMER0() or SET_RTCC(),
    //                              GET_TIMER0() or GET_RTCC()
    // Constants used for SETUP_TIMER_0() are:
    #define RTCC_INTERNAL   0
    #define RTCC_EXT_L_TO_H 32
    #define RTCC_EXT_H_TO_L 48
    
    #define RTCC_DIV_1      8
    #define RTCC_DIV_2      0
    #define RTCC_DIV_4      1
    #define RTCC_DIV_8      2
    #define RTCC_DIV_16     3
    #define RTCC_DIV_32     4
    #define RTCC_DIV_64     5
    #define RTCC_DIV_128    6
    #define RTCC_DIV_256    7
    SETUP_TIMER_0(RTCC_DIV_32);

    --- ( giá trị ) = timer0 ; có thể thay (giá trị ) = GET_TIMER0();


    --- Những code này là code của module các phiên bản ( đời trước ) --- có tốc độ rất chậm ...

    Những module về sau này có tốc độ cao ... nên để các xung có thời gian nhỏ để đạt kết quả cao nhất : VD : TX=1; Delay_us(416); TX=0;

    --- lúc đó ta tính lại các timer để đồng bộ về thời gian !

    --- Bạn có thể liên hệ : dientuqueduong@yahoo.com được trợ giúp nếu dùng sản phẩm của QD !
    Last edited by queduong; 25-04-2012, 22:27.
    Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

    Comment


    • #3
      Tại bọn em mới học, thầy bảo dùng cái nào thì dùng thôi mà sao bác lại bảo nó lởm được, giá cũng khá đắt đấy chứ
      thế còn đoạn này ạ

      while(RX); // wait syn
      TMR0=0;


      nếu TMR0 tương đương với lệnh get_timer0() trong CCS thì không được
      -

      Comment


      • #4
        Cách để hiểu vấn đề là lấy tờ giấy và cây viết ra vẽ lại dạng sóng bên mạch phát và mạch thu. Sau đó ngồi xem xét kỹ lưỡng từng thời điểm giữa 2 dạng sóng, bảo đảm chưa tới 10 phút nữa là hiểu vấn đề.

        Comment


        • #5
          Nguyên văn bởi OpenDoor Xem bài viết
          Cách để hiểu vấn đề là lấy tờ giấy và cây viết ra vẽ lại dạng sóng bên mạch phát và mạch thu. Sau đó ngồi xem xét kỹ lưỡng từng thời điểm giữa 2 dạng sóng, bảo đảm chưa tới 10 phút nữa là hiểu vấn đề.
          Đại ca chỉ đc cái nói đúng. Nhưng có cái là 10p chưa chắc ra vấn đề, em phải ngồi vẽ vời chán mới thông đó ạ.


          Add: 97 Quán Nam - Lê Chân - Hải Phòng.
          Tel: 031 518648 Phone: 0904 283 505

          Comment


          • #6
            Nguyên văn bởi phamhuantn Xem bài viết
            Tại bọn em mới học, thầy bảo dùng cái nào thì dùng thôi mà sao bác lại bảo nó lởm được, giá cũng khá đắt đấy chứ
            thế còn đoạn này ạ

            while(RX); // wait syn
            TMR0=0;


            nếu TMR0 tương đương với lệnh get_timer0() trong CCS thì không được
            ặc ặc ... Mở cái file xxx.h ở trong thư mục PICC đó ... con nào thì mở con đó ra rồi xem thanh ghi !

            mấy cái ở trên mình lấy ở trong đó ra đấy : TMR0=0 ... chắc tương ứng với SET_TIMER0(0);


            --- xung quanh cái Timer0 thì có bấy nhiêu cái cơ bản đó thôi . ... khi đọc lấy kết quả thì dùng GET ... mà khi gán cho thanh ghi đó 1 kết quả thì dùng SET để đặt.

            VD : T0=TMR0; <=> T0=GET_TIMER0(); ... TMR0=0; <=> SET_TIMER0(0);


            Đây là 1 đặc điểm dài dòng ... nặng nề câu chữ của thằng CCS .

            Các câu cú thằng CCS tự định nghĩa mà không lấy trùng tên các thanh ghi như 1 số trình dịch khác ( thường lấy theo tên thanh ghi trong datasheet )

            VD : HTPIC : thì lấy OPTION (để nói thanh ghi OPTION ) ... mikroC thì lấy OPTION_REG ( giống như trong datasheet ) ... còn thằng CCS thì lấy tên theo kiểu hỗn tạp dài dòng như trên .
            Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

            Comment


            • #7
              thanks anh, có gì khó khăn em sẽ liên lạc
              -

              Comment


              • #8
                Nguyên văn bởi queduong Xem bài viết
                Đây là 1 đặc điểm dài dòng ... nặng nề câu chữ của thằng CCS .

                Các câu cú thằng CCS tự định nghĩa mà không lấy trùng tên các thanh ghi như 1 số trình dịch khác ( thường lấy theo tên thanh ghi trong datasheet )

                VD : HTPIC : thì lấy OPTION (để nói thanh ghi OPTION ) ... mikroC thì lấy OPTION_REG ( giống như trong datasheet ) ... còn thằng CCS thì lấy tên theo kiểu hỗn tạp dài dòng như trên .
                Hic, em phải nhảy vào bênh thằng CCS tí

                Lệnh của CCS hơi dài, nhưng khi hiểu rồi thì "đọc datasheet của chip hay không là tùy".
                Ví dụ với Timer1:
                - setup_timer_1 là hàm cài đặt Timer, các tham số của nó và tác dụng xem trong file device (ví dụ 18F14K22.h). Nếu chưa thỏa mãn thì xem Help, phần setup_timer_1
                - set_timer1 là hàm đặt giá trị cho timer
                - get_timer1 là hàm lấy giá trị của timer
                - interrupt_active(int_timer1) là hàm kiểm tra cờ tràn của Timer1
                - clear_interrupt(int_timer1) là hàm xóa cờ tràn của Timer1
                - enable_interrutps(int_timer1) là hàm cho phép ngắt Timer1 (nhớ là phải cho phép ngắt Global)
                - ...

                Nếu mọi người thấy việc dùng các hàm dựng sẵn không tiện thì có thể định nghĩa biến, ví dụ:
                int16 TMR1; //định nghĩa một biến 16-bit
                #byte TMR1=getenv("SFR:TMR1") //chỉ ra rằng TMR1 được đặt vào địa chỉ của thanh ghi Timer1
                #bit TMR1IF=getenv("BIT:TMR1IF") //biến 1-bit là cờ ngắt Timer1
                #bit TMR1IE=getenv("BIT:TMR1IE") //

                #bit Timeout=getenv("BIT:TMR1IF") //cách mình hay dùng khi dùng Timer1 làm Timeout-Timer

                p/s: thông tin chi tiết, xin vui lòng đọc Help

                Comment


                • #9
                  to bác Quế Dương:
                  Bác Quế dương cho em hỏi 1 vài ý sau:
                  - Module phát/thu Tx/Rx11 của bên bác có khoảng cách truyền nhận là bao xa (bác đã test thử khoảng cách lớn nhất là bao nhiêu?)
                  - Cặp module này chắc không truyền nhận 2 chiều được,vậy bác có cặp module RF nào có thể truyền nhận 2 chiều được không (phát rồi thu lại để kiểm tra trạng thái bên thu chẳng hạn)
                  - Trên web của bác không thấy ghi địa chỉ công ty cụ thể của bác để có thể đến tận nơi xem sản phẩm?
                  Cảm ơn bác Quế Dương.

                  Comment


                  • #10
                    #byte TMR0 = 0x01 khai báo thêm cái này vào,chú ý thạch anh ở MCU thu là 4mhz

                    Comment


                    • #11
                      Nguyên văn bởi e_fan Xem bài viết
                      to bác Quế Dương:
                      Bác Quế dương cho em hỏi 1 vài ý sau:
                      - Module phát/thu Tx/Rx11 của bên bác có khoảng cách truyền nhận là bao xa (bác đã test thử khoảng cách lớn nhất là bao nhiêu?)
                      - Cặp module này chắc không truyền nhận 2 chiều được,vậy bác có cặp module RF nào có thể truyền nhận 2 chiều được không (phát rồi thu lại để kiểm tra trạng thái bên thu chẳng hạn)
                      - Trên web của bác không thấy ghi địa chỉ công ty cụ thể của bác để có thể đến tận nơi xem sản phẩm?
                      Cảm ơn bác Quế Dương.
                      Up lại cái để hỏi bác Quế Dương

                      Comment


                      • #12
                        Nguyên văn bởi e_fan Xem bài viết
                        Up lại cái để hỏi bác Quế Dương
                        Tiêu chí sản xuất của mình về TX11/RX11 đạt ở khoảng 100 - 150m nên mình mới chỉ test ở đó !
                        Bác tham khảo trong web hộ em , địa chỉ nhà có ở contact đó .... bác có thể xem tại nhà nếu cần
                        Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

                        Comment


                        • #13
                          Nguyên văn bởi queduong Xem bài viết
                          Tiêu chí sản xuất của mình về TX11/RX11 đạt ở khoảng 100 - 150m nên mình mới chỉ test ở đó !
                          Bác tham khảo trong web hộ em , địa chỉ nhà có ở contact đó .... bác có thể xem tại nhà nếu cần
                          Trên web của bác không có địa chỉ thì em mới hỏi chứ (chỉ có email và số điện thoại thôi,địa chỉ thì bác đề là Lâm Gia thôn thì biết tìm ở đâu). Thế còn câu hỏi về module thu phát RF 2 chiều thì sao hả bác QD?

                          Comment


                          • #14
                            Nguyên văn bởi e_fan Xem bài viết
                            Trên web của bác không có địa chỉ thì em mới hỏi chứ (chỉ có email và số điện thoại thôi,địa chỉ thì bác đề là Lâm Gia thôn thì biết tìm ở đâu). Thế còn câu hỏi về module thu phát RF 2 chiều thì sao hả bác QD?
                            hix ... nó ngay ở đầu Welcome to Que Duong Electronics weBSite ! ! !

                            ... 2 chiều 200 m
                            Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

                            Comment


                            • #15
                              OPTION=0x06; // prescaler = 128
                              T0=0; // set lai T0
                              while (!((T0>=146) && (T0<=166))) // 18688 - 21248 uS it OK. syn bit=15000us
                              {
                              NOP();
                              NOP();
                              NOP();
                              while(RX); // wait syn
                              TMR0=0;
                              NOP();
                              NOP();
                              NOP();
                              NOP();
                              while(!RX);
                              T0=TMR0;
                              ......
                              các a cho e hỏi đoạn code này có phải để đồng bộ thời gian với bộ phát ko ạ?
                              nếu đúng sao lại có sự chênh lệch là 18688 - 21248us so với 15000us ạ?
                              sao phải chia nhỏ bộ chia tần số nữa (từ 32 xuống 128)?
                              e học cơ khí nên ko rõ lắm, mong các a chỉ giúp đoạn code trên

                              Comment

                              Về tác giả

                              Collapse

                              phamhuantn Tìm hiểu thêm về phamhuantn

                              Bài viết mới nhất

                              Collapse

                              Đang tải...
                              X