Hi Vasile,

I think next buildbot will show some JSG errors... Aren't you validated it ?
(same for sample)


Cheers,
Seb

2010/2/27 <[email protected]>

> Revision: 1716
> Author: vsurducan
> Date: Sat Feb 27 09:20:50 2010
> Log: [No log message]
> http://code.google.com/p/jallib/source/detail?r=1716
>
> Added:
>  /trunk/include/external/temperature/SMbus_MLX90615.jal
>
> =======================================
> --- /dev/null
> +++ /trunk/include/external/temperature/SMbus_MLX90615.jal      Sat Feb 27
> 09:20:50 2010
> @@ -0,0 +1,397 @@
> +--
> -------------------------------------------------------------------------
> +-- Title: SM bus library for Melexis IR sensor MLX90615
> +--
> +-- Author: Vasile Surducan, Copyright (c) 2010...2012, all rights
> reserved.
> +--
> +-- Adapted-by:
> +--
> +-- Compiler: >=2.4m
> +--
> +-- This file is part of jallib (http://jallib.googlecode.com)
> +-- Released under the BSD license (
> http://www.opensource.org/licenses/bsd-license.php)
> +--
> +-- Description: software implementation for single SMbus master, use 4 hw
> stack
> +-- --
> +-- define SM_bus pins like:
> +-- alias SM_SCL is pin_C3
> +-- alias SM_SCL_direction is pin_C3_direction
> +
> +-- alias SM_SDA is pin_C4
> +-- alias SM_SDA_direction is pin_C4_direction
> +-- ATTENTION: both SM_SDA and SM_SCL must have pull-up resistors
> +--
> +--  Procedures which can be used by application program:
> +
> +-- procedure SM_START_bit
> +-- procedure SM_STOP_bit
> +-- function SM_transmit_byte( byte in TX_buffer )return bit
> +-- function SM_receive_byte( bit in ack_noack ) return byte
> +-- procedure read_MEM ( byte in senzor_address, byte in MEM_address )
> +-- procedure write_MEM ( byte in senzor_address, byte in MEM_address,
> +--                      byte in MEM_high, byte in MEM_low, byte in PEC )is
> +-- procedure MLX90615_sleep ( byte in senzor_address )
> +-- procedure MLX90615_wake
> +-- procedure calculate_temp_C
> +-- procedure calculate_temp_K
> +-- todo: procedure calculate_CRC8 and/or procedure
> SM_receive_byte_with_CRC8
> +
> +include delay
> +
> +-- -----------------------------------------------------
> +-- MLX90615 EEPROM addresses
> +-- -----------------------------------------------------
> +
> +const SMbus_SA = 0 ; SMbus Slave Address 7 bit, 0 to 6; 0x5b factory
> default
> +const PWM_T_range = 0x01
> +const config_reg = 0x02
> +const emissivity = 0x03
> +                        ; 0x04 to 0x0D factory reserved, do not alter!
> +const ID_number0 = 0x0E ; read only
> +const ID_number1 = 0x0F ; read only
> +
> +-- -----------------------------------------------------
> +
> +var word config
> +var volatile bit mode_select at config: 0     ; 1=SMbus,    0=PWM
> +var volatile bit PWM_frequency at config: 1   ; 1=low,      0=high
> +var volatile bit PWM_output_temp at config: 2 ; 1=Tambiant, 0=Tobject
> +var volatile bit*9 factory_cal at config: 3   ; do not alter
> +var volatile bit*3 IIR_setting at config: 12  ; see table below
> +var volatile bit zero at config: 15           ; keep 0
> +
> +-- binary   settling time  spike response
> +--          (samples)      (percent %)
> +-- --------------------------------------
> +-- 001      1              100
> +-- 010      10             50
> +-- 011      18             33.3
> +-- 100      24             25
> +-- 101      31             20
> +-- 110      38             16.6
> +-- 111      45             14.286
> +-- --------------------------------------
> +
> +-- -----------------------------------------------------
> +-- MLX90615 RAM addresses
> +-- -----------------------------------------------------
> +
> +--  0x04 to 0x4h Melexis reserved
> +const raw_IR_data = 0x05
> +const Tambiant = 0x06
> +const Tobject = 0x07
> +--  0x08 to 0x0F Melexis reserved
> +
> +-- -----------------------------------------------------
> +
> +-- -----------------------------------------------------
> +-- MLX90615 commands
> +-- -----------------------------------------------------
> +
> +const EEPROM_access = 0b0001_0000
> +const RAM_access = 0b0010_0000
> +const SLEEP_mode = 0b1100_0110
> +
> +-- -----------------------------------------------------
> +
> +
> +-- -----------------------------------------------------
> +-- SMbus bit config, SMbus direction config
> +-- -----------------------------------------------------
> +
> +const bit ACK = low
> +const bit NACK = high
> +
> +
> +procedure _SDA_high is
> +      SM_SDA_direction = input
> +end procedure
> +
> +
> +procedure _SDA_low is
> +      SM_SDA_direction = output
> +      SM_SDA = low
> +end procedure
> +
> +procedure _SCL_HIGH is
> +      SM_SCL_direction = input
> +end procedure
> +
> +procedure _SCL_low is
> +      SM_SCL_direction = output
> +      SM_SCL = low
> +end procedure
> +
> +procedure SM_BUS_initialize is ; not necesary if SMbus is POR default
> +      SM_SDA_direction = input ; SM_SDA = high from pull-up
> +      SM_SCL_direction = input ; SM_SCL = high from pull-up
> +
> +      _SCL_low
> +      delay_1mS ( 30 )
> +      _SCL_high            ; SM_bus mode
> +end procedure
> +-- -------------------------------------------------------------------
> +
> +-- -----------------------------
> +-- SMbus start bit
> +-- -----------------------------
> +procedure SM_START_bit is
> +      _SDA_high
> +      _usec_delay ( 2 )
> +      _SCL_high
> +      _usec_delay ( 5 )
> +      _SDA_low
> +      _usec_delay ( 4 )
> +      _SCL_low
> +      _usec_delay ( 2 )
> +end procedure
> +-- -----------------------------
> +
> +-- -----------------------------
> +-- SMbus stop bit
> +-- -----------------------------
> +procedure SM_STOP_bit is
> +      _SCL_low
> +      _usec_delay ( 2 )
> +      _SDA_low
> +      _usec_delay ( 2 )
> +      _SCL_high
> +      _usec_delay ( 4 )
> +      _SDA_high
> +end procedure
> +-- -----------------------------
> +
> +-- ---------------------------------------------------
> +-- Transmit one bit on SM bus (for internal use only )
> +-- ---------------------------------------------------
> +procedure _SM_send_bit (bit in x) is
> +;       SM_SDA_direction = x
> +      if x == low then
> +         _SDA_low
> +      else
> +         _SDA_high
> +      end if
> +      _usec_delay ( 3 )
> +      _SCL_high
> +      _usec_delay ( 11 )
> +      _SCL_low
> +      _usec_delay ( 4 )   ; 11 + 4   18uS clk
> +end procedure
> +-- ---------------------------------------------------
> +
> +-- -------------------------------------------------
> +-- Receive one bit on SM bus (for internal use only)
> +-- -------------------------------------------------
> +procedure _SM_receive_bit (bit out x) is
> +      SM_SDA_direction = input
> +      _SCL_high
> +      _usec_delay ( 11 )
> +      x = SM_SDA
> +      _SCL_low
> +      _usec_delay ( 4 )
> +end procedure
> +-- -------------------------------------------------
> +
> +-- --------------------------------------------------------
> +-- Transmit one byte on SM bus
> +-- --------------------------------------------------------
> +function SM_transmit_byte (byte in TX_buffer) return bit is
> +   var bit b at TX_buffer : 7
> +   var bit ack_noack
> +
> +   for 8 loop
> +      _SM_send_bit( b )
> +      TX_buffer = TX_buffer << 1
> +   end loop
> +     _SM_receive_bit ( ack_noack )
> +   return ack_noack  ; 0=ack received, 1=no ack received
> +end function
> +
> +-- ---------------------------------------------------------
> +
> +-- ---------------------------------------------------------
> +-- Receive one byte on SM bus
> +-- ---------------------------------------------------------
> +function SM_receive_byte (bit in ack_noack) return byte is
> +   var byte RX_buffer
> +   var bit b at RX_buffer : 0
> +   for 8 loop
> +       RX_buffer = RX_buffer << 1
> +       _SM_receive_bit ( b )
> +   end loop
> +       _SM_send_bit (ack_noack); 0=ack, 1 = no_ack
> +       return RX_buffer
> +end function
> +-- ---------------------------------------------------------
> +
> +var bit MLX90615_ACK = high
> +var byte MEM_low = 0
> +var byte MEM_high = 0
> +-- var byte T_low = 0
> +var byte T_high = 0
> +var sword s_T_high = 0
> +var word  w_T_high = 0
> +var byte PEC = 0
> +var sword temperature = 0
> +var word temp = 0
> +var sword temperature_C = 0
> +var word temperature_K = 0
> +var byte nack_counter = 0
> +
> +-- -------------------------------------------------------------------
> +-- read RAM & EEPROM routine
> +-- MLX90615 senzor_address = 0x5b and 0x00
> +-- examples:
> +-- MEM_address = RAM_access + Tobject ; read Tobject
> +-- MEM_address = RAM_access + Tambiant; read Tambiant (senzor package
> temperature)
> +-- MEM_address = EEPROM_access + config_address; read config
> +-- -------------------------------------------------------------------
> +
> +procedure read_MEM ( byte in senzor_address, byte in MEM_address )is
> +SM_START_bit
> +MLX90615_ACK = SM_transmit_byte ((senzor_address << 1)& 0b1111_1110 + 0) ;
> address, wr
> +   if MLX90615_ACK == NACK then
> +      nack_counter = nack_counter + 1
> +      SM_STOP_bit
> +      return
> +   end if
> +MLX90615_ACK = SM_transmit_byte ( MEM_address );
> +   if MLX90615_ACK == NACK then
> +      nack_counter = nack_counter + 1
> +      SM_STOP_bit
> +      return
> +   end if
> +SM_START_bit
> +MLX90615_ACK = SM_transmit_byte ((senzor_address << 1)& 0b1111_1110 + 1) ;
> address, rd
> +   if MLX90615_ACK == NACK then
> +      nack_counter = nack_counter + 1
> +      SM_STOP_bit
> +      return
> +   end if
> +MEM_low =  SM_receive_byte (ACK)
> +MEM_high = SM_receive_byte (ACK)
> +PEC = SM_receive_byte (ACK)
> +SM_STOP_bit
> +end procedure
> +
> +-- ------------------------------------------------------------------
> +
> +-- ------------------------------------------------------------------
> +-- write EEPROM routine
> +-- ------------------------------------------------------------------
> +procedure write_MEM ( byte in senzor_address, byte in MEM_address,
> +                      byte in MEM_high, byte in MEM_low, byte in PEC )is
> +SM_START_bit
> +MLX90615_ACK = SM_transmit_byte ((senzor_address << 1)& 0b1111_1110 + 0) ;
> address, wr
> +   if MLX90615_ACK == NACK then
> +      nack_counter = nack_counter + 1
> +      SM_STOP_bit
> +      return
> +   end if
> +MLX90615_ACK = SM_transmit_byte ( MEM_address );
> +   if MLX90615_ACK == NACK then
> +      nack_counter = nack_counter + 1
> +      SM_STOP_bit
> +      return
> +   end if
> +MLX90615_ACK = SM_transmit_byte ( MEM_low );
> +   if MLX90615_ACK == NACK then
> +      nack_counter = nack_counter + 1
> +      SM_STOP_bit
> +      return
> +   end if
> +MLX90615_ACK = SM_transmit_byte ( MEM_high );
> +   if MLX90615_ACK == NACK then
> +      nack_counter = nack_counter + 1
> +      SM_STOP_bit
> +      return
> +   end if
> +MLX90615_ACK = SM_transmit_byte ( PEC );
> +   if MLX90615_ACK == NACK then
> +      nack_counter = nack_counter + 1
> +      SM_STOP_bit
> +      return
> +   end if
> +SM_STOP_bit
> +delay_1mS ( 5 )
> +end procedure
> +-- -------------------------------------------------------------------
> +
> +-- ----------------------------------
> +-- put MLX90615 in sleep mode
> +-- ----------------------------------
> +
> +procedure MLX90615_sleep ( byte in senzor_address ) is
> +SM_START_bit
> +MLX90615_ACK = SM_transmit_byte ((senzor_address << 1)& 0b1111_1110 + 0) ;
> address, wr
> +   if MLX90615_ACK == NACK then
> +      nack_counter = nack_counter + 1
> +      SM_STOP_bit
> +      return
> +   end if
> +MLX90615_ACK = SM_transmit_byte ( SLEEP_mode );
> +   if MLX90615_ACK == NACK then
> +      nack_counter = nack_counter + 1
> +      SM_STOP_bit
> +      return
> +   end if
> +MLX90615_ACK = SM_transmit_byte ( 0x49 ); PEC value
> +   if MLX90615_ACK == NACK then
> +      nack_counter = nack_counter + 1
> +      SM_STOP_bit
> +      return
> +   end if
> +SM_STOP_bit
> +_SCL_low
> +end procedure
> +
> +-- ----------------------------------
> +
> +-- ----------------------------------------------------------------------
> +-- exit from sleep
> +-- ----------------------------------------------------------------------
> +
> +procedure MLX90615_wake is
> +_SCL_low
> + delay_1mS ( 60 )
> +_SCL_high
> +SM_START_bit
> +MLX90615_ACK = SM_transmit_byte (0b1111_1110) ; send a dummy
> +SM_STOP_bit
> +end procedure
> +
> +-- ----------------------------------------------------------------------
> +
> +-- ----------------------------------
> +-- conversion to celsius
> +-- ----------------------------------
> +
> +procedure calculate_temp_C is
> +const sword c27315 = 27315
> +; T_low = MEM_low
> + s_T_high = sword (MEM_high)
> +; make it word (positive temperature only) or sword (positive or negative
> temperature)
> +; temperature = 256*s_T_high + T_low
> + temperature = 256*s_T_high + MEM_low
> + temperature_C = (temperature * 2 - c27315) / 10
> +end procedure
> +
> +-- ----------------------------------
> +
> +-------------------------------------
> +-- conversion to kelvin
> +-- ----------------------------------
> +procedure calculate_temp_K is
> +
> +; T_low = MEM_low
> + w_T_high = word (MEM_high)
> +; temperature = 256*w_T_high + T_low
> + temp = word (temperature) ; make it word (positive temperature only)
> + temp = 256*w_T_high + MEM_low
> + temperature_K = temp* 2 / 100
> +end procedure
> +
> +-------------------------------------
> +
> +
> +
> +
>
> --
> You received this message because you are subscribed to the Google Groups
> "jallib" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to
> [email protected]<jallib%[email protected]>
> .
> For more options, visit this group at
> http://groups.google.com/group/jallib?hl=en.
>
>


-- 
Sébastien Lelong
http://www.sirloon.net
http://sirbot.org

-- 
You received this message because you are subscribed to the Google Groups 
"jallib" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/jallib?hl=en.

Reply via email to