اطلاعیه

Collapse
No announcement yet.

خواندن دیتا 16 بیتی از MAX6675 و ارسال به میکرو 8 بیتی

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    خواندن دیتا 16 بیتی از MAX6675 و ارسال به میکرو 8 بیتی

    سلام به همگی
    من قصد دارم از آی سی max6675 دما رو خونده و به میکرو ارسال کنم. دیتا خروجی این آی سی 16 بیتی هست که بیت های 3 تا 15 اطلاعات دما رو میده ( این آی سی از پروتوکل SPI پیروی میکنه). حالا مشکل اینجاست که رجیستر بافر SPI میکرو 8 بیتی هست و من دنبال راهی هستم که بتونم تمام 16 بیت رو دریافت کنم.
    کد من:
    کد:
    #define _XTAL_FREQ  4000000
    #include <xc.h>
    #include "MAX6675_header.h"
    #include <stdbool.h>
    #include <string.h>
    
    
    volatile bool spi_rx_data_ready = false;
    
    
    void __interrupt() interrupt_isr(){
        INTCONbits.GIE = 0;                         //Disable interrupt
        if(PIR2bits.BCLIF == 1){                    //Checking to see if MSSP Bus Collision interrupt is triggered
            
            PIR2bits.BCLIF = 0;                     //Reseting flag
        }
        else if(PIR1bits.SSPIF){                    //Checking to see if MSSP Interrupt is triggered
            spi_rx_data_ready = true;               //A flag to indicate the data is received
            PIR1bits.SSPIF = 0;                     //Reseting flag
        }
        INTCONbits.GIE = 1;                         //Enable interrupt
    }
    
    
    void PORT_configuration(){
        TRISB = 0x00;
        LATB = 0;
        TRISD = 0x00;
        LATD = 0;
        TRISCbits.TRISC3 = 0;                       //SCK as output
        TRISCbits.TRISC4 = 1;                       //SDI as input
        TRISCbits.TRISC5 = 0;                       //SDO as output
        TRISCbits.TRISC6 = 0;                       //SS as output
        LATCbits.LATC6 = 1;                         //SS is set to high to deselect slave
    }
    
    
    void SPI_Configuration(){
        SSPCON1bits.SSPEN = 0;                      //Disabling serial port
        ANSELA = 0x00;                              //Setting different PORTS as digital I/O
        ANSELB = 0x00;
        ANSELD = 0x00;
        ANSELE = 0x00;
        SSPSTATbits.SMP = 1;                        //Input data sampled at end of data output time                        
        SSPSTATbits.CKE = 1;                        //Transmit occurs on transition from Idle to active clock state
        SSPCON1bits.CKP = 0;                        //Idle state for clock is a high level
        SSPCON1bits.SSPM = 0x00;                    //SPI Master mode, clock = FOSC/4
        SSPCON1bits.SSPEN = 1;                      //Enabling serial port
        PIE1bits.SSPIE = 1;                         //MSSP Interrupt Enable bit
        PIE2bits.BCLIE = 1;                         //MSSP Bus Collision Interrupt Enable bit
    }
    
    
    void SPI_read(){
        unsigned char Temp1=0,Temp2=0;
        LATCbits.LATC6 = 0;
    //    __delay_us(0.1);                            //Wait for 100 nano seconds
        SSPBUF = 0x00;                              //Send dummy data to start communication
        while(spi_rx_data_ready == false);          //Wait for the data to be completely received
        spi_rx_data_ready = false;                  //Reset the flag
        LATD = SSPBUF;
        SSPBUF = 0x00;                              //Send dummy data to start communication
        while(spi_rx_data_ready == false);          //Wait for the data to be completely received
        spi_rx_data_ready = false;                  //Reset the flag
        LATB = SSPBUF;
    //    LATD = Temp1;
    //    LATB = Temp2;
        LATCbits.LATC6 = 1;
        __delay_ms(1000);                           //For better observation in PROTEUS (Remove for real_time application)
    }
    
    
    void main(void) {
        //Select 8MHz internal oscillator
        OSCCONbits.SCS = 0x03;              //Internal oscillator block
        OSCCONbits.IRCF = 0x0d;             //FOSC = 4MHz
        
        INTCONbits.GIE = 1;                 //To enable global interrupts
        INTCONbits.PEIE = 1;                //To enable peripheral interrupts
        
        //Calling for configuration functions
        PORT_configuration();
        SPI_Configuration();
        
        while(1){
            SPI_read();
        }
    }
    لطفا راهنمایی کنید

    #2
    پاسخ : خواندن دیتا 16 بیتی از MAX6675 و ارسال به میکرو 8 بیتی

    نوشته اصلی توسط mohsen6265 نمایش پست ها
    سلام به همگی
    من قصد دارم از آی سی max6675 دما رو خونده و به میکرو ارسال کنم. دیتا خروجی این آی سی 16 بیتی هست که بیت های 3 تا 15 اطلاعات دما رو میده ( این آی سی از پروتوکل SPI پیروی میکنه). حالا مشکل اینجاست که رجیستر بافر SPI میکرو 8 بیتی هست و من دنبال راهی هستم که بتونم تمام 16 بیت رو دریافت کنم.
    کد من:
    کد:
    #define _XTAL_FREQ  4000000
    #include <xc.h>
    #include "MAX6675_header.h"
    #include <stdbool.h>
    #include <string.h>
    
    
    volatile bool spi_rx_data_ready = false;
    
    
    void __interrupt() interrupt_isr(){
        INTCONbits.GIE = 0;                         //Disable interrupt
        if(PIR2bits.BCLIF == 1){                    //Checking to see if MSSP Bus Collision interrupt is triggered
            
            PIR2bits.BCLIF = 0;                     //Reseting flag
        }
        else if(PIR1bits.SSPIF){                    //Checking to see if MSSP Interrupt is triggered
            spi_rx_data_ready = true;               //A flag to indicate the data is received
            PIR1bits.SSPIF = 0;                     //Reseting flag
        }
        INTCONbits.GIE = 1;                         //Enable interrupt
    }
    
    
    void PORT_configuration(){
        TRISB = 0x00;
        LATB = 0;
        TRISD = 0x00;
        LATD = 0;
        TRISCbits.TRISC3 = 0;                       //SCK as output
        TRISCbits.TRISC4 = 1;                       //SDI as input
        TRISCbits.TRISC5 = 0;                       //SDO as output
        TRISCbits.TRISC6 = 0;                       //SS as output
        LATCbits.LATC6 = 1;                         //SS is set to high to deselect slave
    }
    
    
    void SPI_Configuration(){
        SSPCON1bits.SSPEN = 0;                      //Disabling serial port
        ANSELA = 0x00;                              //Setting different PORTS as digital I/O
        ANSELB = 0x00;
        ANSELD = 0x00;
        ANSELE = 0x00;
        SSPSTATbits.SMP = 1;                        //Input data sampled at end of data output time                        
        SSPSTATbits.CKE = 1;                        //Transmit occurs on transition from Idle to active clock state
        SSPCON1bits.CKP = 0;                        //Idle state for clock is a high level
        SSPCON1bits.SSPM = 0x00;                    //SPI Master mode, clock = FOSC/4
        SSPCON1bits.SSPEN = 1;                      //Enabling serial port
        PIE1bits.SSPIE = 1;                         //MSSP Interrupt Enable bit
        PIE2bits.BCLIE = 1;                         //MSSP Bus Collision Interrupt Enable bit
    }
    
    
    void SPI_read(){
        unsigned char Temp1=0,Temp2=0;
        LATCbits.LATC6 = 0;
    //    __delay_us(0.1);                            //Wait for 100 nano seconds
        SSPBUF = 0x00;                              //Send dummy data to start communication
        while(spi_rx_data_ready == false);          //Wait for the data to be completely received
        spi_rx_data_ready = false;                  //Reset the flag
        LATD = SSPBUF;
        SSPBUF = 0x00;                              //Send dummy data to start communication
        while(spi_rx_data_ready == false);          //Wait for the data to be completely received
        spi_rx_data_ready = false;                  //Reset the flag
        LATB = SSPBUF;
    //    LATD = Temp1;
    //    LATB = Temp2;
        LATCbits.LATC6 = 1;
        __delay_ms(1000);                           //For better observation in PROTEUS (Remove for real_time application)
    }
    
    
    void main(void) {
        //Select 8MHz internal oscillator
        OSCCONbits.SCS = 0x03;              //Internal oscillator block
        OSCCONbits.IRCF = 0x0d;             //FOSC = 4MHz
        
        INTCONbits.GIE = 1;                 //To enable global interrupts
        INTCONbits.PEIE = 1;                //To enable peripheral interrupts
        
        //Calling for configuration functions
        PORT_configuration();
        SPI_Configuration();
        
        while(1){
            SPI_read();
        }
    }
    لطفا راهنمایی کنید
    سلام
    مشکلش چیه؟ شما ۲ بارپشت سر هم که ۸ بیت بخونید میشه ۱۶ بیت

    دیدگاه


      #3
      پاسخ : خواندن دیتا 16 بیتی از MAX6675 و ارسال به میکرو 8 بیتی

      نوشته اصلی توسط hossein.m98 نمایش پست ها
      سلام
      مشکلش چیه؟ شما ۲ بارپشت سر هم که ۸ بیت بخونید میشه ۱۶ بیت
      ,وقتی توی پروتئوس شبیه سازی میکنم درست جواب نمیده. یه نگاهی میتونید به فایل proteus بندازین

      دیدگاه


        #4
        پاسخ : خواندن دیتا 16 بیتی از MAX6675 و ارسال به میکرو 8 بیتی

        نوشته اصلی توسط mohsen6265 نمایش پست ها
        ,وقتی توی پروتئوس شبیه سازی میکنم درست جواب نمیده. یه نگاهی میتونید به فایل proteus بندازین
        https://s20.picofile.com/file/844544...X6675.rar.html
        متاسفانه وقت ندارم. بهتره این موارد رو عملی تست کنید

        دیدگاه


          #5
          پاسخ : خواندن دیتا 16 بیتی از MAX6675 و ارسال به میکرو 8 بیتی

          نوشته اصلی توسط hossein.m98 نمایش پست ها
          متاسفانه وقت ندارم. بهتره این موارد رو عملی تست کنید
          ممنون بابت پاسخگویی. مشکلم حل شده. حرف شما درست بود و من باید دوبار میخوندم که البته این کار رو هم انجام داده بودم. ولی باید نتیجه رو تقسیم بر 4 کنی (از فروم microchip دیدم ) و بعد در lcd ببینی. اینم کد:
          کد:
          #define _XTAL_FREQ  4000000#include <xc.h>
          #include "MAX6675_header.h"
          #include <stdbool.h>
          #include <string.h>
          
          
          #define RS LATBbits.LATB2
          #define EN LATBbits.LATB3
          #define D4 LATBbits.LATB4
          #define D5 LATBbits.LATB5
          #define D6 LATBbits.LATB6
          #define D7 LATBbits.LATB7
          #include "lcd.h"
          #include "stdio.h"
          #include "stdlib.h"
          
          
          volatile bool spi_rx_data_ready = false;
          
          
          void __interrupt() interrupt_isr(){
              INTCONbits.GIE = 0;                         //Disable interrupt
              if(PIR2bits.BCLIF == 1){                    //Checking to see if MSSP Bus Collision interrupt is triggered
                  
                  PIR2bits.BCLIF = 0;                     //Reseting flag
              }
              else if(PIR1bits.SSPIF){                    //Checking to see if MSSP Interrupt is triggered
                  spi_rx_data_ready = true;               //A flag to indicate the data is received
                  PIR1bits.SSPIF = 0;                     //Reseting flag
              }
              INTCONbits.GIE = 1;                         //Enable interrupt
          }
          
          
          void PORT_configuration(){
              TRISB = 0x00;
              LATB = 0;
              TRISD = 0x00;
              LATD = 0;
              TRISCbits.TRISC3 = 0;                       //SCK as output
              TRISCbits.TRISC4 = 1;                       //SDI as input
              TRISCbits.TRISC5 = 0;                       //SDO as output
              TRISCbits.TRISC6 = 0;                       //SS as output
              LATCbits.LATC6 = 1;                         //SS is set to high to deselect slave
          }
          
          
          void SPI_Configuration(){
              SSPCON1bits.SSPEN = 0;                      //Disabling serial port
              ANSELA = 0x00;                              //Setting different PORTS as digital I/O
              ANSELB = 0x00;
              ANSELD = 0x00;
              ANSELE = 0x00;
              SSPSTATbits.SMP = 1;                        //Input data sampled at end of data output time                        
              SSPSTATbits.CKE = 1;                        //Transmit occurs on transition from Idle to active clock state
              SSPCON1bits.CKP = 0;                        //Idle state for clock is a high level
              SSPCON1bits.SSPM = 0x00;                    //SPI Master mode, clock = FOSC/4
              SSPCON1bits.SSPEN = 1;                      //Enabling serial port
              PIE1bits.SSPIE = 1;                         //MSSP Interrupt Enable bit
              PIE2bits.BCLIE = 1;                         //MSSP Bus Collision Interrupt Enable bit
          }
          
          
          void SPI_read(){
              int raw_value=0;
              char d[16];
              float temp=0.0;
              unsigned char Temp1=0,Temp2=0;
              LATCbits.LATC6 = 0;
              SSPBUF = 0x00;                              //Send dummy data to start communication
              while(spi_rx_data_ready == false);          //Wait for the data to be completely received
              spi_rx_data_ready = false;                  //Reset the flag
              Temp1 = SSPBUF;
              SSPBUF = 0x00;                              //Send dummy data to start communication
              while(spi_rx_data_ready == false);          //Wait for the data to be completely received
              spi_rx_data_ready = false;                  //Reset the flag
              Temp2 = SSPBUF;
              raw_value = (Temp1 << 5) | (Temp2 >> 3) ;
              temp = (float)raw_value / 4;
              LATCbits.LATC6 = 1;
              sprintf(d,"%f",temp);
              Lcd_Clear();
              Lcd_Set_Cursor(1,1);
              Lcd_Write_String(d);
          }
          
          
          void main(void) {
              //Select 8MHz internal oscillator
              OSCCONbits.SCS = 0x03;              //Internal oscillator block
              OSCCONbits.IRCF = 0x0d;             //FOSC = 4MHz
              
              INTCONbits.GIE = 1;                 //To enable global interrupts
              INTCONbits.PEIE = 1;                //To enable peripheral interrupts
              
              //Calling for configuration functions
              PORT_configuration();
              SPI_Configuration();
              Lcd_Init();    
              
              while(1){
                  SPI_read();
              }
          }
          دلیل: ادغام دو پست برای جلوگیری از اسپم

          نوشته اصلی توسط mohsen6265 نمایش پست ها
          ممنون بابت پاسخگویی. مشکلم حل شده. حرف شما درست بود و من باید دوبار میخوندم که البته این کار رو هم انجام داده بودم. ولی باید نتیجه رو تقسیم بر 4 کنی (از فروم microchip دیدم ) و بعد در lcd ببینی. اینم کد:
          کد:
          #define _XTAL_FREQ  4000000#include <xc.h>
          #include "MAX6675_header.h"
          #include <stdbool.h>
          #include <string.h>
          
          
          #define RS LATBbits.LATB2
          #define EN LATBbits.LATB3
          #define D4 LATBbits.LATB4
          #define D5 LATBbits.LATB5
          #define D6 LATBbits.LATB6
          #define D7 LATBbits.LATB7
          #include "lcd.h"
          #include "stdio.h"
          #include "stdlib.h"
          
          
          volatile bool spi_rx_data_ready = false;
          
          
          void __interrupt() interrupt_isr(){
              INTCONbits.GIE = 0;                         //Disable interrupt
              if(PIR2bits.BCLIF == 1){                    //Checking to see if MSSP Bus Collision interrupt is triggered
                  
                  PIR2bits.BCLIF = 0;                     //Reseting flag
              }
              else if(PIR1bits.SSPIF){                    //Checking to see if MSSP Interrupt is triggered
                  spi_rx_data_ready = true;               //A flag to indicate the data is received
                  PIR1bits.SSPIF = 0;                     //Reseting flag
              }
              INTCONbits.GIE = 1;                         //Enable interrupt
          }
          
          
          void PORT_configuration(){
              TRISB = 0x00;
              LATB = 0;
              TRISD = 0x00;
              LATD = 0;
              TRISCbits.TRISC3 = 0;                       //SCK as output
              TRISCbits.TRISC4 = 1;                       //SDI as input
              TRISCbits.TRISC5 = 0;                       //SDO as output
              TRISCbits.TRISC6 = 0;                       //SS as output
              LATCbits.LATC6 = 1;                         //SS is set to high to deselect slave
          }
          
          
          void SPI_Configuration(){
              SSPCON1bits.SSPEN = 0;                      //Disabling serial port
              ANSELA = 0x00;                              //Setting different PORTS as digital I/O
              ANSELB = 0x00;
              ANSELD = 0x00;
              ANSELE = 0x00;
              SSPSTATbits.SMP = 1;                        //Input data sampled at end of data output time                        
              SSPSTATbits.CKE = 1;                        //Transmit occurs on transition from Idle to active clock state
              SSPCON1bits.CKP = 0;                        //Idle state for clock is a high level
              SSPCON1bits.SSPM = 0x00;                    //SPI Master mode, clock = FOSC/4
              SSPCON1bits.SSPEN = 1;                      //Enabling serial port
              PIE1bits.SSPIE = 1;                         //MSSP Interrupt Enable bit
              PIE2bits.BCLIE = 1;                         //MSSP Bus Collision Interrupt Enable bit
          }
          
          
          void SPI_read(){
              int raw_value=0;
              char d[16];
              float temp=0.0;
              unsigned char Temp1=0,Temp2=0;
              LATCbits.LATC6 = 0;
              SSPBUF = 0x00;                              //Send dummy data to start communication
              while(spi_rx_data_ready == false);          //Wait for the data to be completely received
              spi_rx_data_ready = false;                  //Reset the flag
              Temp1 = SSPBUF;
              SSPBUF = 0x00;                              //Send dummy data to start communication
              while(spi_rx_data_ready == false);          //Wait for the data to be completely received
              spi_rx_data_ready = false;                  //Reset the flag
              Temp2 = SSPBUF;
              raw_value = (Temp1 << 5) | (Temp2 >> 3) ;
              temp = (float)raw_value / 4;
              LATCbits.LATC6 = 1;
              sprintf(d,"%f",temp);
              Lcd_Clear();
              Lcd_Set_Cursor(1,1);
              Lcd_Write_String(d);
          }
          
          
          void main(void) {
              //Select 8MHz internal oscillator
              OSCCONbits.SCS = 0x03;              //Internal oscillator block
              OSCCONbits.IRCF = 0x0d;             //FOSC = 4MHz
              
              INTCONbits.GIE = 1;                 //To enable global interrupts
              INTCONbits.PEIE = 1;                //To enable peripheral interrupts
              
              //Calling for configuration functions
              PORT_configuration();
              SPI_Configuration();
              Lcd_Init();    
              
              while(1){
                  SPI_read();
              }
          }
          البته نتیجه کمی خطا داره که فکر کنم باید به صورت عملی کالیبره بشه

          دیدگاه

          لطفا صبر کنید...
          X