با سلام:
در رابطه با خواندن دما از روی سنسور 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 رو در یافت کرده و بقیه کاراکتر ها ارسال نمی شوند.)
با تشکر

