Shop OBEX P1 Docs P2 Docs Learn Events
Question about the MLX90614 — Parallax Forums

Question about the MLX90614

denodeno Posts: 242
edited 2009-08-17 02:06 in Accessories
Hello to all...I have purchased one of the above infrared sensors from Parallax.· In playing round with the device, I can't seem to figure out what all the DATA statements are for, or where they came from or where they are called in the example code.· I see no, for example, READ PEC0, or READ PEC1........etc.· The example code isn't that really easy to understand.· This includes the x,y,z stuff?· I have looked thru the documentation and, maybe I missed something, but it appears that the ducumentation put out by the developer of the infrared device, by it self doesn't really explain the package that Parallax put out.· Please correct me if I am wrong on this.

DenO

Comments

  • FranklinFranklin Posts: 4,747
    edited 2009-08-10 23:10
    Have you loaded the example and run it? there is a read in the checkcrc function. Let us know if it works or not.

    ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
    - Stephen
  • denodeno Posts: 242
    edited 2009-08-11 11:22
    Yes there is a READ statement:

    w=z^y
    READ w,z
    RETURN

    However, all the DATA statements have labels...PEC0...PEC1...PEC2...etc. Is w,z the address of the READ? Very confusing code writing, isn't it?

    DenO
  • denodeno Posts: 242
    edited 2009-08-13 02:35
    Is this a silly question, or is there no answer?

    DenO
  • denodeno Posts: 242
    edited 2009-08-16 10:45
    Wow...76 people have read this post, and there are no commits about the code for this device???· I will post the demo code for review.· The orginal questions are:· What is w,y, and z, and how are the DATA statements READ with PEC0,PEC1, etc?· I see no READ statements with PEC0,PEC1, etc.· True, I am not the most gifted code writer, but I have written alot of PBASIC code over the years.· Did someone from Parallax write this, or was it the supplier of the MLX90614 device?

    Thank you

    Deno

    '================[noparse][[/noparse]DEMO CODE BELOW THIS LINE]================

    ' =========================================================================
    '
    '·· File....... MLX90614_Demo-Simple.BS2
    '·· Purpose.... Demo Code for MLX90614 Infra Red Thermometer Module
    '·· E-mail..... support@parallax.com
    '·· Started....
    '·· Updated.... 01 SEPT 2008
    '
    '·· {$STAMP BS2}
    '·· {$PBASIC 2.5}
    '
    ' =========================================================================

    '
    [noparse][[/noparse] Program Description ]
    '
    ' This program demonstrates the MLX90614 Infra Red Themometer Module by
    ' reading the temperature, calculating C and K, and running a CRC check on
    ' the PEC value for data integrity.
    '

    '
    [noparse][[/noparse] I/O Definitions ]

    Reset······· CON···· 1
    Alarm······· CON···· 2
    Sensor······ CON····3

    '
    [noparse][[/noparse] Constants ]

    baud········ CON··· 84
    xslave······ CON··· $35··························· 'slave address

    '
    [noparse][[/noparse] Variables ]

    temperature· VAR··· Word
    tempL······· VAR··· temperature.LOWBYTE
    tempH······· VAR··· temperature.HIGHBYTE
    pec········· VAR··· Byte
    Kelvin······ VAR··· Word
    KelvinDec··· VAR··· Word
    Celsius····· VAR··· Word
    CelsiusDec·· VAR··· Word
    Ferenhite··· VAR··· Byte
    w··········· VAR··· Byte
    x··········· VAR··· Byte
    y··········· VAR··· Byte
    z··········· VAR··· Byte

    '
    [noparse][[/noparse] EEPROM Data ]

    PEC0·· DATA $00,$07,$0E,$09,$1C,$1B,$12,$15,$38,$3F,$36,$31,$24,$23,$2A,$2D
    PEC1·· DATA $70,$77,$7E,$79,$6C,$6B,$62,$65,$48,$4F,$46,$41,$54,$53,$5A,$5D
    PEC2·· DATA $E0,$E7,$EE,$E9,$FC,$FB,$F2,$F5,$D8,$DF,$D6,$D1,$C4,$C3,$CA,$CD
    PEC3·· DATA $90,$97,$9E,$99,$8C,$8B,$82,$85,$A8,$AF,$A6,$A1,$B4,$B3,$BA,$BD
    PEC4·· DATA $C7,$C0,$C9,$CE,$DB,$DC,$D5,$D2,$FF,$F8,$F1,$F6,$E3,$E4,$ED,$EA
    PEC5·· DATA $B7,$B0,$B9,$BE,$AB,$AC,$A5,$A2,$8F,$88,$81,$86,$93,$94,$9D,$9A
    PEC6·· DATA $27,$20,$29,$2E,$3B,$3C,$35,$32,$1F,$18,$11,$16,$03,$04,$0D,$0A
    PEC7·· DATA $57,$50,$59,$5E,$4B,$4C,$45,$42,$6F,$68,$61,$66,$73,$74,$7D,$7A
    PEC8·· DATA $89,$8E,$87,$80,$95,$92,$9B,$9C,$B1,$B6,$BF,$B8,$AD,$AA,$A3,$A4
    PEC9·· DATA $F9,$FE,$F7,$F0,$E5,$E2,$EB,$EC,$C1,$C6,$CF,$C8,$DD,$DA,$D3,$D4
    PEC10· DATA $69,$6E,$67,$60,$75,$72,$7B,$7C,$51,$56,$5F,$58,$4D,$4A,$43,$44
    PEC11· DATA $19,$1E,$17,$10,$05,$02,$0B,$0C,$21,$26,$2F,$28,$3D,$3A,$33,$34
    PEC12· DATA $4E,$49,$40,$47,$52,$55,$5C,$5B,$76,$71,$78,$7F,$6A,$6D,$64,$63
    PEC13· DATA $3E,$39,$30,$37,$22,$25,$2C,$2B,$06,$01,$08,$0F,$1A,$1D,$14,$13
    PEC14· DATA $AE,$A9,$A0,$A7,$B2,$B5,$BC,$BB,$96,$91,$98,$9F,$8A,$8D,$84,$83
    PEC15· DATA $DE,$D9,$D0,$D7,$C2,$C5,$CC,$CB,$E6,$E1,$E8,$EF,$FA,$FD,$F4,$F3


    '
    [noparse][[/noparse] Initialization ]

    Init:
    · LOW Reset
    · INPUT Reset
    · DEBUG CLS,··································· ' setup report screen
    ··· "MLX90614 Infra Red Thermometer", CR,
    ··· "=============================", CR,CR,
    ··· "Kelvin.........······ ", CR,
    ··· "Celsius........······ ", CR,
    ··· "PEC test.......······ ", CR

    '
    [noparse][[/noparse] Program Code ]

    getTemperature:
    · SEROUT Sensor,baud,[noparse][[/noparse]0,"!TEMR",xslave,$07]
    · SERIN Sensor,baud,1000,PECfail,[noparse][[/noparse]tempL,tempH,pec]

    checkPEC:
    · z=0
    · y = xslave<<1+0
    · GOSUB calculateCRC
    · y = $07
    · GOSUB calculateCRC
    · y = xslave<<1+1
    · GOSUB calculateCRC
    · y = tempL
    · GOSUB calculateCRC
    · y = tempH
    · GOSUB calculateCRC
    · IF z<>pec THEN PECfail
    · GOTO convertTemperatures

    calculateCRC:
    · w=z^y
    · READ w,z
    · RETURN

    convertTemperatures:
    · Kelvin = (temperature/100)*2
    · KelvinDec = temperature*2
    · IF (temperature*2) < 27315 THEN overWordsize
    · Celsius = (temperature/100*2)-273
    · CelsiusDec = (temperature*2)-27315
    · Ferenhite = (9*Celsius)/5 + 32
    · GOTO displayTemperatures

    overWordsize:
    · Celsius = ((27315-(temperature*2))/100)
    · CelsiusDec = (27315-(temperature*2))
    · DEBUG CRSRXY, 23, 4,"-",DEC Celsius,".",DEC2 CelsiusDec, CLREOL

    displayTemperatures:
    · 'DEBUG CRSRXY, 23, 3, DEC3 Ferenhite
    · DEBUG CRSRXY, 23, 3,DEC Kelvin,".",DEC1 KelvinDec,CLREOL
    · DEBUG CRSRXY, 23, 4,DEC Celsius,".",DEC2 CelsiusDec, CLREOL
    · DEBUG CRSRXY, 23, 5,"Pass",CLREOL
    · PAUSE 1000
    · GOTO getTemperature

    PECfail:
    · DEBUG CRSRXY, 23, 3,CLREOL,CR
    · DEBUG CRSRXY, 23, 4,CLREOL,CR
    · DEBUG CRSRXY, 23, 5,"Fail",CLREOL,CR
    · PAUSE 500
    · GOTO getTemperature
  • FranklinFranklin Posts: 4,747
    edited 2009-08-16 21:56
    My question still is unanswered. Have you loaded and run the demo code and did it work?

    ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
    - Stephen
  • dev/nulldev/null Posts: 381
    edited 2009-08-16 22:51
    Hi deno. The READ statement simply reads a value from EEPROM at address w and puts it in variable z. The READ statement assumes that data are located at EEPROM address zero, which they are in your case. PEC is just an alias for the EEPROM address, and it's not used in the code. You COULD use the PEC with the LOOKUP command, but in your case they are there just for explanatory purposes.

    Each time calculateCRC is called, the last value in z is used again, to calculate a final checksum. The checksum is calculated in excactly the same way in the sensor, so the checksum routine is just to ensure that data are transferred correctly.

    ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
    Don't worry. Be happy
  • denodeno Posts: 242
    edited 2009-08-17 02:06
    Thank you dev/null, your explanation is very good. Yes, Franklin, I have run the demo code, and the device does work. But I just wanted a better understanding of the code, so I can tweek it alittle, and convert to F degrees. I did not know that there was a checksum 'check', which evidently is the CRC. Thanks again to all for helping me understand this code.

    DenO
Sign In or Register to comment.