Subversion Repositories HomeAutomation

Rev

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