با سلام:
در رابطه با خواندن دما از روی سنسور MLX90615 ماژولی در سایت ECA موجود می باشد که به رو سریال با میکرو ارتباط برقرار می کند، از آنجایی که این سنسور در محیط پروتئوس وحود ندارد سعی کردیم که با شبیه سازی داده های ارسالی آن از طریق یک میکروی دیگر و با ارتباط UART کار با این سنسور را در محیط پروتئوس شبیه سازی کنیم. ( علت این کار نتیجه نگرفتن در محیط عملی کار با سنسور بوده )
داده های ار سالی یک خط داده به شکل زیر می باید باشد که برگرفته از این لینک می باشد:
به عنوان مثال پاسخ ماژول به صورت زیر است:
برنامه سمت گیرنده بر گرغته از کد های آردوینوی بالا به صورت زیر می باشد:
برنامه سمت فرستنده به صورت زیر می باشد:
برنامه شبیه سازی شده در محیط پروتئوس به صورت زیر می باشد:
عکس محیط شبیه سازی به صورت زیر می باشد:

حال مشکل به این صورت می باشد، که به جای دریافت اطلاعات کد شده بالا (5A- 5A- 45- 04- 0C- 78– 0D– 19– A7) کدیی دریافت نمی شود. برای مثال در خط :
با خذف (UART1_Data_Ready() <> 0) برنامه اعدادی را به عنوان ورودی از خط RX نشان می دهد که نشان دهنده این است که داده های ارسال شده برای برنامه به عنوان داده های Uart شناخته نمی شوند ولی تا حدی خوانده می شوند که مثلا در اینجا کد های اول ارسالی یعنی 0x5A فقط ارسال می شود و به عنوان Z در ال سی دی نشان داده می شود. این نشان میدهد که در ارتباط UART مشکلی وجود دارد که داده ها به درستی منتقل نمی شوند . البته در برنامه یک تاخیر 100MS بین ارسال ها قرارد داده شده است تا از مشکل نمایش داده شده در UART Terminal محیط پروتئوس که به حای ارسال کارکترهای کد ذکر شده در قسمت قبل تنها کارانتر Z پشت سر هم ارسال می شود.
به عبارتی به نظر می رسد که مشکل در ارسال کاراکتر Z پشت سر هم می باشد به جای ارسال کراکترهایذکر شده در قبل در هر دو حالت ارسال با تاخیر و یا بدون تاخیر می باشد ( در حالت با تاخیر در ترمینال UART کاراکتر هادرست نشان داده می شوند ولی در ال سی دی تنها نشان داده می شود که میکرو کارکتر Z رو در یافت کرده و بقیه کاراکتر ها ارسال نمی شوند.)
با تشکر
در رابطه با خواندن دما از روی سنسور MLX90615 ماژولی در سایت ECA موجود می باشد که به رو سریال با میکرو ارتباط برقرار می کند، از آنجایی که این سنسور در محیط پروتئوس وحود ندارد سعی کردیم که با شبیه سازی داده های ارسالی آن از طریق یک میکروی دیگر و با ارتباط UART کار با این سنسور را در محیط پروتئوس شبیه سازی کنیم. ( علت این کار نتیجه نگرفتن در محیط عملی کار با سنسور بوده )
داده های ار سالی یک خط داده به شکل زیر می باید باشد که برگرفته از این لینک می باشد:
به عنوان مثال پاسخ ماژول به صورت زیر است:
<5A- 5A- 45- 04- 0C- 78– 0D– 19– 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- 78– 0D– 19– A7) کدیی دریافت نمی شود. برای مثال در خط :
کد:
while (((UART1_Data_Ready() <> 0)) and (uu=0))
به عبارتی به نظر می رسد که مشکل در ارسال کاراکتر Z پشت سر هم می باشد به جای ارسال کراکترهایذکر شده در قبل در هر دو حالت ارسال با تاخیر و یا بدون تاخیر می باشد ( در حالت با تاخیر در ترمینال UART کاراکتر هادرست نشان داده می شوند ولی در ال سی دی تنها نشان داده می شود که میکرو کارکتر Z رو در یافت کرده و بقیه کاراکتر ها ارسال نمی شوند.)
با تشکر