Subversion Repositories HomeAutomation

Rev

Rev 1896 | Blame | Compare with Previous | Last modification | View Log | SVN | RSS feed

  1. /*
  2.  * FOST02 temperature and humidity sensor
  3.  *
  4.  * Using "two-wire" interface for reading sensor values.
  5.  *
  6.  * Author: Linus Lundin
  7.  * Date: 2007-08-12
  8.  *
  9.  */
  10.  
  11. /*-----------------------------------------------
  12.  * Includes
  13.  * ---------------------------------------------*/
  14. #include <avr/io.h>
  15. #include <stdio.h>
  16. #include <stdlib.h>
  17.  
  18. #include <config.h>
  19. #include <util/delay.h>
  20. #include "FOST02.h"
  21.  
  22. /*----------------------------------------------
  23.  * Functions
  24.  * --------------------------------------------*/
  25.  
  26.  
  27. /*
  28.  * Initiate FOST02 for reading temperature and humidity from sensor.
  29.  */
  30. void FOST02Init(void)
  31. {
  32.     gpio_clr_pin(FOST02_CLK);
  33.     gpio_set_out(FOST02_CLK);  
  34.     gpio_set_in(FOST02_DATA);
  35.     gpio_clr_pin(FOST02_DATA);
  36. }
  37. void sendReset(void)
  38. {
  39.     gpio_clr_pin(FOST02_CLK); //set 0 in FOST_CLK
  40.     _delay_us(2);
  41.     gpio_set_in(FOST02_DATA); // set 0 in DDR line: Data = 1 (data line = input)
  42.     _delay_us(2);
  43.     gpio_set_pin(FOST02_CLK); //set 1 in FOST_CLK
  44.     _delay_us(2);
  45.     gpio_set_out(FOST02_DATA); //set 1 in DDR line Data = 0 (data line = output)
  46.     _delay_us(2);
  47.     gpio_clr_pin(FOST02_CLK); //set 0 in FOST_CLK
  48.     _delay_us(2);
  49.     gpio_set_pin(FOST02_CLK); //set 1 in FOST_CLK
  50.     _delay_us(2);
  51.     gpio_set_in(FOST02_DATA); // set 0 in DDR line: Data = 1 (data line = input)
  52.     _delay_us(2);
  53.     gpio_clr_pin(FOST02_CLK); //set 0 in FOST_CLK
  54.     _delay_us(2);
  55. }
  56. uint8_t sendCommand(uint8_t cmd)
  57. {
  58.     sendReset();
  59.     uint8_t i,ret;
  60.     for (i = 0; i<8 ; i++)
  61.     {
  62.         if ((cmd & 0x80) == 0x80)
  63.             gpio_set_in(FOST02_DATA); // set 0 in DDR line: Data = 1 (data line = input)
  64.         else
  65.             gpio_set_out(FOST02_DATA); //set 1 in DDR line Data = 0 (data line = output)
  66.         _delay_us(2);
  67.         gpio_set_pin(FOST02_CLK); //set 1 in FOST_CLK
  68.         cmd = cmd << 1;
  69.         _delay_us(2);
  70.         gpio_clr_pin(FOST02_CLK); //set 0 in FOST_CLK
  71.         _delay_us(2);
  72.     }
  73.     gpio_set_in(FOST02_DATA); // set 0 in DDR line: Data = 1 (data line = input)
  74.     _delay_us(2);
  75.     gpio_set_pin(FOST02_CLK); //set 1 in FOST_CLK
  76.        
  77.     _delay_us(2);
  78.     if ( !gpio_get_state(FOST02_DATA))
  79.     {
  80.         ret = 1;
  81.         gpio_set_pin(FOST02_CLK); //set 1 in FOST_CLK
  82.         _delay_us(2);
  83.         gpio_clr_pin(FOST02_CLK); //set 0 in FOST_CLK
  84.         while (!gpio_get_state(FOST02_DATA));
  85.         _delay_us(2);
  86.     }
  87.     else
  88.         ret = 0;
  89.     gpio_clr_pin(FOST02_CLK); //set 0 in FOST_CLK
  90.     _delay_us(2);
  91.     return ret;
  92. }
  93.  
  94. uint8_t getFOST02PinStatus(void)
  95. {
  96.     if ( gpio_get_state(FOST02_DATA))
  97.         return 1;
  98.     else
  99.         return 0;
  100. }
  101. uint16_t getFOST02Data(void)
  102. {
  103.     uint8_t i,data1, data2;
  104.     uint16_t data = 0;
  105.     data=0;
  106.     data1=0;
  107.     data2=0;
  108.     for (i = 0; i<8 ; i++)
  109.     {
  110.         gpio_set_pin(FOST02_CLK); //set 1 in FOST_CLK
  111.         _delay_us(2);
  112.         data1 = data1 << 1;
  113.         if ( gpio_get_state(FOST02_DATA))
  114.             data1 = data1 | 0x0001;
  115.         gpio_clr_pin(FOST02_CLK); //set 0 in FOST_CLK
  116.         _delay_us(2);
  117.     }
  118.     gpio_set_out(FOST02_DATA); //set 1 in DDR line Data = 0 (data line = output)
  119.     _delay_us(2);
  120.     gpio_set_pin(FOST02_CLK); //set 1 in FOST_CLK
  121.     _delay_us(2);
  122.     gpio_clr_pin(FOST02_CLK); //set 0 in FOST_CLK
  123.     gpio_set_in(FOST02_DATA); // set 0 in DDR line: Data = 1 (data line = input)
  124.     _delay_us(2);
  125.     for (i = 0; i<8 ; i++)
  126.     {
  127.         gpio_set_pin(FOST02_CLK); //set 1 in FOST_CLK
  128.         _delay_us(2);
  129.         data2 = data2 << 1;
  130.         if ( gpio_get_state(FOST02_DATA))
  131.             data2 = data2 | 0x0001;
  132.         gpio_clr_pin(FOST02_CLK); //set 0 in FOST_CLK
  133.         _delay_us(2);
  134.     }
  135.     //skip Ack
  136.     gpio_set_in(FOST02_DATA); // set 0 in DDR line: Data = 1 (data line = input)
  137.     _delay_us(2);
  138.     gpio_set_pin(FOST02_CLK); //set 1 in FOST_CLK
  139.     _delay_us(2);
  140.     gpio_clr_pin(FOST02_CLK); //set 0 in FOST_CLK
  141.     data = (uint16_t) (data1<<8);
  142.     data += data2;
  143.     return data;
  144. }
  145.  
  146. void getFOST02DataByte(uint8_t *data1in, uint8_t *data2in)
  147. {
  148.     uint8_t i;
  149.     uint16_t data = 0;
  150.     uint8_t data1 = 0;
  151.     uint8_t data2 = 0;
  152.     for (i = 0; i<8 ; i++)
  153.     {
  154.         gpio_set_pin(FOST02_CLK); //set 1 in FOST_CLK
  155.         _delay_us(2);
  156.         data1 = data1 << 1;
  157.         if ( gpio_get_state(FOST02_DATA))
  158.             data1 = data1 | 0x0001;
  159.         gpio_clr_pin(FOST02_CLK); //set 0 in FOST_CLK
  160.         _delay_us(2);
  161.     }
  162.     gpio_set_out(FOST02_DATA); //set 1 in DDR line Data = 0 (data line = output)
  163.     _delay_us(2);
  164.     gpio_set_pin(FOST02_CLK); //set 1 in FOST_CLK
  165.     _delay_us(2);
  166.     gpio_clr_pin(FOST02_CLK); //set 0 in FOST_CLK
  167.     gpio_set_in(FOST02_DATA); // set 0 in DDR line: Data = 1 (data line = input)
  168.     _delay_us(2);
  169.     for (i = 0; i<8 ; i++)
  170.     {
  171.         gpio_set_pin(FOST02_CLK); //set 1 in FOST_CLK
  172.         _delay_us(2);
  173.         data2 = data2 << 1;
  174.         if ( gpio_get_state(FOST02_DATA))
  175.             data2 = data2 | 0x0001;
  176.         gpio_clr_pin(FOST02_CLK); //set 0 in FOST_CLK
  177.         _delay_us(2);
  178.     }
  179.     //skip Ack
  180.     gpio_set_in(FOST02_DATA); // set 0 in DDR line: Data = 1 (data line = input)
  181.     _delay_us(2);
  182.     gpio_set_pin(FOST02_CLK); //set 1 in FOST_CLK
  183.     _delay_us(2);
  184.     gpio_clr_pin(FOST02_CLK); //set 0 in FOST_CLK
  185.     *data1in = data1;
  186.     *data2in = data2;
  187. }
  188. /*
  189.  * Start reading and return the temperature value.
  190.  */
  191. void measureFOST02temperature(void) {}
  192. void measureFOST02humidity(void) {}
  193. uint16_t getFOST02temperature(void) {return 0;}
  194. uint16_t getFOST02humidity(void) {return 0;}
  195.