اطلاعیه

Collapse
No announcement yet.

ار تباط UART بین دو میکرو برای شبیه سازی عملکرد سنسور MLX90615 در پروتئوس

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

    ار تباط UART بین دو میکرو برای شبیه سازی عملکرد سنسور MLX90615 در پروتئوس

    با سلام:
    در رابطه با خواندن دما از روی سنسور MLX90615 ماژولی در سایت ECA موجود می باشد که به رو سریال با میکرو ارتباط برقرار می کند، از آنجایی که این سنسور در محیط پروتئوس وحود ندارد سعی کردیم که با شبیه سازی داده های ارسالی آن از طریق یک میکروی دیگر و با ارتباط UART کار با این سنسور را در محیط پروتئوس شبیه سازی کنیم. ( علت این کار نتیجه نگرفتن در محیط عملی کار با سنسور بوده )
    داده های ار سالی یک خط داده به شکل زیر می باید باشد که برگرفته از این لینک می باشد:
    به عنوان مثال پاسخ ماژول به صورت زیر است:
    <5A- 5A- 45- 04- 0C- 780D19 A7>
    جال ما سعی در انتقال کد بالا به صورت مستمر داشته و در میکروی دوم سعی در خواندن آن کد با در یافت الگوی 5A - 5A اولیه می باشد که اعداد مورد نیاز همان کد های 5و 6 بعد از این الگو می باشد. در رابطه با کار با این ماژ<ل برنامه آردوینوی آن نیز موجود می باشد که به صورت زیر می باشد:
    کد:
    unsigned char Re_buf[11],counter=0;
    char sign=0;
    float TO=0,TA=0;
    void serialEvent();
    
    void setup() {
    
    Serial.begin(115200);
    delay(1);
    Serial.write(0XA5);
    Serial.write(0X45);
    Serial.write(0XEA);
    }
    
    void loop() {
    
    char i=0,sum=0;
    serialEvent();
    if(sign)
    {
    sign=0;
    for(i=0;i<8;i++)
    sum+=Re_buf[i];
    if(sum==Re_buf[i] )
    {
    TO=(float)(Re_buf[4]<<8|Re_buf[5])/100;
    Serial.print("TO:");
    Serial.println(TO);
    TA=(float)(Re_buf[6]<<8|Re_buf[7])/100;
    Serial.print("TA:");
    Serial.println(TA);
    }
    }
    
    }
    void serialEvent(){ 
    while (Serial.available()) {
    Re_buf[counter]=(unsigned char)Serial.read();
    if(counter==0&&Re_buf[0]!=0x5A) return;
    counter++;
    if(counter==9)
    {
    counter=0;
    sign=1;
    }
    }
    }
    برنامه سمت گیرنده بر گرغته از کد های آردوینوی بالا به صورت زیر می باشد:
    کد:
    program mlx60914
    symbol LCD_RS_my = PORTc7_bit
    symbol LCD_EN_my =PORTc6_bit
    symbol LCD_D4_my =PORTc2_bit
    symbol LCD_D5_my=PORTc3_bit
    symbol LCD_D6_my =PORTc4_bit
    symbol LCD_D7_my=PORTc5_bit
    
    symbol LCD_RS_Direction_my = DDc7_bit
    symbol LCD_EN_Direction_my =DDc6_bit
    symbol LCD_D4_Direction_my =DDc2_bit
    symbol LCD_D5_Direction_my=DDc3_bit
    symbol LCD_D6_Direction_my =DDc4_bit
    symbol LCD_D7_Direction_my=DDc5_bit
    dim celcius,fahrenheit as float
    txt1 as string[6]
    
    ' Lcd module connections
    dim LCD_RS as sbit at LCD_RS_my
    dim LCD_EN as sbit at LCD_EN_my
    dim LCD_D4 as sbit at LCD_D4_my
    dim LCD_D5 as sbit at LCD_D5_my
    dim LCD_D6 as sbit at LCD_D6_my
    dim LCD_D7 as sbit at LCD_D7_my
    
    dim LCD_RS_Direction as sbit at LCD_RS_Direction_my
    dim LCD_EN_Direction as sbit at LCD_EN_Direction_my
    dim LCD_D4_Direction as sbit at LCD_D4_Direction_my
    dim LCD_D5_Direction as sbit at LCD_D5_Direction_my
    dim LCD_D6_Direction as sbit at LCD_D6_Direction_my
    dim LCD_D7_Direction as sbit at LCD_D7_Direction_my
    
    dim uart_rd as byte
    counter ,sign as integer
    TO_,TA as float
    volatile Re_buf as char[11]
    
    sub procedure serialEvent()
    dim uu as byte
    cc as integer
    uu=0 counter=0
    
    ' Re_buf[0]= 0x5A Re_buf[1]=0x5A Re_buf[2]=0x45 Re_buf[3]=0x04 Re_buf[4]=0x0C Re_buf[5]=0x78 Re_buf[6]=0x0D Re_buf[7]= 0x19 Re_buf[8]= 0xA7'0x5A, 0x5A, 0x45, 0x04, 0x0C, 0x78, 0x0D, 0x19, 0xA7
    ' lcd_out(1,1,"Re_buf:") Lcd_out(2,1,Re_buf) delay_ms(500) Lcd_Cmd(_LCD_CLEAR)
    
    UART1_Write(13) UART1_Write_text("Z") UART1_Write(0x5A)
    while (((UART1_Data_Ready() <> 0)) and (uu=0)) ''(UART1_Data_Ready() <> 0)
    Re_buf[counter]= char (UART1_Read()) delay_ms(100)
    if (((counter=0) AND (Re_buf[0]<>"Z")) or ((counter=1) AND (Re_buf[1]<>"Z"))) THEN '(Re_buf[0]<>"Z")) then '(Re_buf[0]<>0x5A)) then
    lcd_out(1,1,"Re_buf_EXIT:") Lcd_out(2,1,Re_buf) delay_ms(500) Lcd_Cmd(_LCD_CLEAR)
    uu=1
    else
    counter=1+counter
    if(counter=9) then
    lcd_out(1,1,"Re_buf[x]:") Lcd_Chr(2,1,Re_buf[counter]) delay_ms(500) Lcd_Cmd(_LCD_CLEAR)
    lcd_out(1,1,"Re_buf:") Lcd_out(2,1,Re_buf) delay_ms(500) Lcd_Cmd(_LCD_CLEAR)
    counter=0
    sign=1
    uu=1
    end if
    end if
    wend
    lcd_out(1,1,"Re_buf_end:") Lcd_out(2,1,Re_buf) delay_ms(200) Lcd_Cmd(_LCD_CLEAR)
    end sub
    
    sub procedure loop_MLX90615_new()
    dim i as byte
    sum as char
    i=0 sum=0
    serialEvent()
    if(sign=1) then
    sign=0
    TO_=float ((Re_buf[4]<<8 or Re_buf[5])/100 )
    lcd_out(1,1,"TO:") FloatToStr(TO_,txt1) lcd_out(2,1,txt1) delay_ms(500)
    
    TO_=float ((Re_buf[6]<<8 or Re_buf[7])/100 )
    lcd_out(1,1,"TO2:") FloatToStr(TO_,txt1) lcd_out(2,1,txt1) delay_ms(500)
    
    TO_=float ((Re_buf[7]<<8 or Re_buf[8])/100 )
    lcd_out(1,1,"TO3:") FloatToStr(TO_,txt1) lcd_out(2,1,txt1) delay_ms(500)
    
    end if
    end sub
    
    
    
    main:
    dim cont2 as byte
    Lcd_Init()
    Lcd_Cmd(_LCD_CLEAR) ' Clear display
    Lcd_Cmd(_LCD_CURSOR_OFF) ' Cursor off
    celcius=0
    counter=0 sign=0 TO_=0 TA=0
    UART1_Init(9600) ' Initialize UART module at 9600 bps
    Delay_ms( 1) ' Wait for UART module to stabilize
    ' UART1_Write(0XA5) ' and send data via UART
    ' UART1_Write(0xAF) ' and send data via UART
    ' UART1_Write(0x54) ' and send data via UART
    
    UART1_Write(0XA5) ' and send data via UART
    UART1_Write(0X45) ' and send data via UART
    UART1_Write(0XEA) ' and send data via UART
    
    
    while 1
    ' Re_buf[0]= 0x5A Re_buf[1]=0x5A Re_buf[2]=0x45 Re_buf[3]=0x04 Re_buf[4]=0x0C Re_buf[5]=0x78 Re_buf[6]=0x0D Re_buf[7]= 0x19 Re_buf[8]= 0xA7'0x5A, 0x5A, 0x45, 0x04, 0x0C, 0x78, 0x0D, 0x19, 0xA7
    loop_MLX90615_new()
    wend
    end.
    برنامه سمت فرستنده به صورت زیر می باشد:

    کد:
    program mlx60914
    
    dim celcius,fahrenheit as float
    txt1 as string[6]
    
    dim uart_rd as byte
    counter ,sign as integer
    TO_,TA as float
    volatile Re_buf as char[11]
    
    
    main:
    dim cont2 as byte
    ch as char
    Lcd_Init()
    Lcd_Cmd(_LCD_CLEAR) ' Clear display
    Lcd_Cmd(_LCD_CURSOR_OFF) ' Cursor off
    celcius=0
    counter=0 sign=0 TO_=0 TA=0
    UART1_Init(9600) ' Initialize UART module at 9600 bps
    Delay_ms( 1) ' Wait for UART module to stabilize
    Re_buf[0]= 0x5A Re_buf[1]=0x5A Re_buf[2]=0x45 Re_buf[3]=0x04 Re_buf[4]=0x0C Re_buf[5]=0x78 Re_buf[6]=0x0D Re_buf[7]= 0x19 Re_buf[8]= 0xA7'0x5A, 0x5A, 0x45, 0x04, 0x0C, 0x78, 0x0D, 0x19, 0xA7
    
    UART1_Write_Text("Start")
    while 1
    
    for cont2=0 to 8
    if( UART1_Tx_Idle()=1 ) then
    ' UART1_Write_Text("Start")
    UART1_Write( Re_buf[cont2] ) delay_ms(100)
    end if
    next cont2 delay_ms(10)
    
    wend
    end.
    برنامه شبیه سازی شده در محیط پروتئوس به صورت زیر می باشد:



    عکس محیط شبیه سازی به صورت زیر می باشد:


    حال مشکل به این صورت می باشد، که به جای دریافت اطلاعات کد شده بالا (5A- 5A- 45- 04- 0C- 780D19 A7) کدیی دریافت نمی شود. برای مثال در خط :
    کد:
    while (((UART1_Data_Ready() <> 0)) and (uu=0))
    با خذف (UART1_Data_Ready() <> 0) برنامه اعدادی را به عنوان ورودی از خط RX نشان می دهد که نشان دهنده این است که داده های ارسال شده برای برنامه به عنوان داده های Uart شناخته نمی شوند ولی تا حدی خوانده می شوند که مثلا در اینجا کد های اول ارسالی یعنی 0x5A فقط ارسال می شود و به عنوان Z در ال سی دی نشان داده می شود. این نشان میدهد که در ارتباط UART مشکلی وجود دارد که داده ها به درستی منتقل نمی شوند . البته در برنامه یک تاخیر 100MS بین ارسال ها قرارد داده شده است تا از مشکل نمایش داده شده در UART Terminal محیط پروتئوس که به حای ارسال کارکترهای کد ذکر شده در قسمت قبل تنها کارانتر Z پشت سر هم ارسال می شود.
    به عبارتی به نظر می رسد که مشکل در ارسال کاراکتر Z پشت سر هم می باشد به جای ارسال کراکترهایذکر شده در قبل در هر دو حالت ارسال با تاخیر و یا بدون تاخیر می باشد ( در حالت با تاخیر در ترمینال UART کاراکتر هادرست نشان داده می شوند ولی در ال سی دی تنها نشان داده می شود که میکرو کارکتر Z رو در یافت کرده و بقیه کاراکتر ها ارسال نمی شوند.)

    با تشکر

    جدیدترین ویرایش توسط soheil_sabz; ۱۱:۴۶ ۱۳۹۶/۱۲/۱۳.
لطفا صبر کنید...
X