Thông báo

Collapse
No announcement yet.

[SPI] Giúp đỡ giao tiếp adc mcp3204 với pic24fj128ga010

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

  • [SPI] Giúp đỡ giao tiếp adc mcp3204 với pic24fj128ga010

    Minh đang tìm cách giao tiếp MCP3204 với pic24fj128ga010
    rồi đưa data vào ram nội
    nhưng chưa được
    bạn nào giúp minh với
    đang cần gấp
    cám ơn trước

  • #2
    Con chip MCP3204 là ADC với giao tiếp SPI nên rất thích hợp dùng với PIC. Việc giao tiếp trở nên dễ dàng vì PIC đã hỗ trợ phần cứng giao tiếp SPI.
    Bạn xem kỹ datasheet của MCP3204 nhất là đoạn từ trang 19 phần nói về serial communication để hiểu rõ các giao tiếp, xem các hình để hiểu cách thức cấp xung clock.
    Lập trình giao tiếp với MCP3204 sử dụng SPI của PIC. Hàm dạng SPI_Read(), SPI_Write()
    Tùy vào trình biên dịch là CCS hay MPLAB mà tên hàm SPI sẽ khác. Bạn thử tìm thêm qua google xem đã có project nào dùng chip này chưa.

    Dưới đây là một thư viện giao tiếp cho MCP3204 dùng ngôn ngữ C của trình biên dịch CCS, lưu lại với tên file mcp3204lib.c rồi thêm vào project, gọi hàm để dùng
    Code:
    #define MCP3204_CLK  PIN_B0
    #define MCP3204_DOUT PIN_B1
    #define MCP3204_DIN  PIN_B2
    #define MCP3204_CS   PIN_B3
    
    void adc_init() {
       output_high(MCP3204_CS);
    }
    
    void write_adc_byte(BYTE data_byte, BYTE number_of_bits) {
       BYTE i;
    
       delay_us(2);
       for(i=0; i<number_of_bits; ++i) {
          output_low(MCP3204_CLK);
          if((data_byte & 1)==0)
                output_low(MCP3204_DIN);
          else
                output_high(MCP3204_DIN);
          data_byte=data_byte>>1;
          delay_us(50);
          output_high(MCP3204_CLK);
          delay_us(50);
       }
    }
    
    BYTE read_adc_byte(BYTE number_of_bits) {
       BYTE i,data;
    
       data=0;
       for(i=0;i<number_of_bits;++i) {
          output_low(MCP3204_CLK);
          delay_us(50);
          shift_left(&data,1,input(MCP3204_DOUT));
          output_high(MCP3204_CLK);
          delay_us(50);
       }
       return(data);
    }
    
    long int read_analog_mcp(BYTE channel, BYTE mode) {
       int l;
       long int h;
        BYTE ctrl_bits;
    
       delay_us(200);
    
        if(mode!=0)
            mode=1;
    
       output_low(MCP3204_CLK);
       output_high(MCP3204_DIN);
       output_low(MCP3204_CS);
    
        if(channel==1)                    // Change so MSB of channel #
            ctrl_bits=4;                //        is in LSB place
        else if(channel==3)
            ctrl_bits=6;
        else if(channel==4)
            ctrl_bits=1;
        else if(channel==6)
            ctrl_bits=3;
        else
            ctrl_bits=channel;
    
        ctrl_bits=ctrl_bits<<1;
    
        if(mode==1)                        // In single mode
            ctrl_bits |= 1;
        else                                // In differential mode
            ctrl_bits &= 0xfe;
    
        ctrl_bits=ctrl_bits<<1;        // Shift so LSB is start bit
        ctrl_bits |= 1;
    
       write_adc_byte( ctrl_bits, 7);    // Send the control bits
    
       h=read_adc_byte(4);
       l=read_adc_byte(8);
    
       output_high(MCP3204_CS);
    
       return((h<<8)|l);
    }
    
    long int read_analog( BYTE channel )    // Auto specifies single mode
    {
       long int temp;
    
       if(channel<4)
          temp=read_analog_mcp( channel, 1);
       else
          temp=0;
    
        return temp;
    }
    
    void convert_to_volts( long int data, char volts[6]) {
       BYTE i, d, div_h, div_l;
       long int temp,div;
       
       div=4095/5;
    
       if(data>=4090)
          data=4095;
    
       for(i=0;i<=4;i++) {
         temp=data/div;
       
         volts[i]=(BYTE)temp+'0';
    
         if(i==0) {
           volts[1]='.';
           i++;
         }
         temp=div*(BYTE)temp;
         data=data-temp;
         div=div/10;
       }
       volts[i]='\0';
    }
    Last edited by linhnc308; 25-11-2008, 09:03. Lý do: Sửa ý sai, cảm anh Nam đã nhắc nhở.
    Ethernet-RS232, PIC Webserver, RFID Reader
    CallerID, Cảnh báo BTS, ...
    0988006696
    linhnc308@gmail.com
    http://linhnc308.blogspot.com

    Comment


    • #3
      Cám ơn đã trả lời về đề tài này
      nhưng mình viết trong MPLAB nhưng dịch bị báo lỗi
      mình cũng có tìm project nhưng ko có
      mong bạn giúp mình nhiều hơn
      cám ơn về code của bạn
      minh sẽ xem lại

      Comment


      • #4
        bạn nào biết cách ghi data 8bit vào bộ nhớ ram nội của pic 24 không
        giúp minh với

        Comment


        • #5
          Nguyên văn bởi tkhanh Xem bài viết
          Cám ơn đã trả lời về đề tài này
          nhưng mình viết trong MPLAB nhưng dịch bị báo lỗi
          mình cũng có tìm project nhưng ko có
          mong bạn giúp mình nhiều hơn
          cám ơn về code của bạn
          minh sẽ xem lại
          Tôi đã nói rõ với bạn là code trên dùng cho trình biên dịch CCS. Bạn viết code bằng C trên CCS thì thêm thư viện đó vào là có thể giao tiếp được.
          Nếu muốn dùng IDE là MPLAB thì trong lựa chọn trình biên dịch của MPLAB, bạn vẫn phải chọn là CCS thì mới dịch được.
          Nếu muốn dùng C18 thì bạn phải viết lại thư viện cho MC3204, có thể dựa theo code cho CCS tôi đã đưa ra./
          Ethernet-RS232, PIC Webserver, RFID Reader
          CallerID, Cảnh báo BTS, ...
          0988006696
          linhnc308@gmail.com
          http://linhnc308.blogspot.com

          Comment


          • #6
            Nguyên văn bởi linhnc308 Xem bài viết
            Tôi đã nói rõ với bạn là code trên dùng cho trình biên dịch CCS. Bạn viết code bằng C trên CCS thì thêm thư viện đó vào là có thể giao tiếp được.
            Nếu muốn dùng IDE là MPLAB thì trong lựa chọn trình biên dịch của MPLAB, bạn vẫn phải chọn là CCS thì mới dịch được.
            Nếu muốn dùng C18 thì bạn phải viết lại thư viện cho MC3204, có thể dựa theo code cho CCS tôi đã đưa ra./

            bác ơi cho em hỏi về lệnh
            shift_left(&data,1,input(MCP3204_DOUT));
            trong code bác đưa
            em ko hiểu hàm này lắm
            bác giải thích hộ em với
            thanks bác nhiều

            Comment


            • #7
              Nguyên văn bởi linhnc308 Xem bài viết
              ...
              Nếu muốn dùng C18 thì bạn phải viết lại thư viện cho MC3204, có thể dựa theo code cho CCS tôi đã đưa ra./
              Sao lại C18! Đang nói về PIC24 thì phải dùng MPLAB C Compiler for PIC24 MCUs chứ.

              Thân,
              Biển học mênh mông, sức người có hạn

              Comment


              • #8
                @tkhanh: shift_left(&data,1,input(MCP3204_DOUT)); là lệnh dịch trái 1 bit. Nó sẽ dịch bít đang có tại chân MCP3204_DOUT đưa vào biến data. Nếu đã cài CCS thì mở ra xem phần help Build-in function ý.

                @A Nam: Vâng, em lại nhầm nữa. Tại vì em chỉ làm với CCS và cũng chỉ dùng PIC 16F/18F chứ chưa phải dùng đến con dòng 24F hay 30F nào. Tiêu chí của em là cứ PIC nào rẻ và đủ chức năng thì em dùng. Nên cũng không rõ compiler cho loại này là gì,chắc là C30 vì em thấy MC có C18, C30 và C32 thì phải.
                Ethernet-RS232, PIC Webserver, RFID Reader
                CallerID, Cảnh báo BTS, ...
                0988006696
                linhnc308@gmail.com
                http://linhnc308.blogspot.com

                Comment

                Về tác giả

                Collapse

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

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

                Collapse

                Đang tải...
                X