| 2752 | 
        kaklik | 
        1 | 
        /**** Automatic weather station 01A ****/ | 
      
      
         | 
         | 
        2 | 
        #define VERSION "0.1" | 
      
      
        | 2806 | 
        kakl | 
        3 | 
        #define ID "$Id: main.c 2897 2013-04-09 21:20:28Z kakl $" | 
      
      
        | 2751 | 
        kaklik | 
        4 | 
        #include "main.h" | 
      
      
        | 2828 | 
        kaklik | 
        5 | 
        #include ".\common\dbloader.h" | 
      
      
        | 2752 | 
        kaklik | 
        6 | 
        #include <string.h> | 
      
      
        | 2751 | 
        kaklik | 
        7 | 
          | 
      
      
        | 2752 | 
        kaklik | 
        8 | 
        #CASE    // Case sensitive compiler | 
      
      
         | 
         | 
        9 | 
          | 
      
      
         | 
         | 
        10 | 
        #define  SEND_DELAY     50       // Time between two characters on RS232 | 
      
      
         | 
         | 
        11 | 
          | 
      
      
         | 
         | 
        12 | 
        char  VER[4]=VERSION;   // Buffer for concatenate of a version string | 
      
      
         | 
         | 
        13 | 
          | 
      
      
        | 2826 | 
        kaklik | 
        14 | 
        #define ONE_WIRE_PIN       PIN_B1    // DS18B20 sensor connection | 
      
      
        | 2751 | 
        kaklik | 
        15 | 
        #include "..\ds1820.c" | 
      
      
         | 
         | 
        16 | 
          | 
      
      
        | 2781 | 
        kaklik | 
        17 | 
        #define sht_data_pin   PIN_D0    // SHT11 sensor connection  | 
      
      
        | 2779 | 
        kaklik | 
        18 | 
        #define sht_clk_pin    PIN_D1 | 
      
      
        | 2768 | 
        kaklik | 
        19 | 
        #include "..\SHT.c" | 
      
      
         | 
         | 
        20 | 
          | 
      
      
        | 2781 | 
        kaklik | 
        21 | 
        #define CSN_SPI PIN_C2        // preassure sensor connection | 
      
      
        | 2779 | 
        kaklik | 
        22 | 
        #include "..\MPL115A1.c" | 
      
      
        | 2768 | 
        kaklik | 
        23 | 
          | 
      
      
        | 2782 | 
        kaklik | 
        24 | 
        unsigned int16 timer0_overflow_count=0; | 
      
      
         | 
         | 
        25 | 
        float anemo=0; | 
      
      
         | 
         | 
        26 | 
          | 
      
      
         | 
         | 
        27 | 
          | 
      
      
         | 
         | 
        28 | 
        #int_TIMER1 | 
      
      
         | 
         | 
        29 | 
        void  TIMER1_isr(void)  | 
      
      
         | 
         | 
        30 | 
        { | 
      
      
        | 2843 | 
        kaklik | 
        31 | 
         output_toggle(PIN_E0); | 
      
      
        | 2848 | 
        kakl | 
        32 | 
         set_timer1(0); | 
      
      
         | 
         | 
        33 | 
          | 
      
      
        | 2843 | 
        kaklik | 
        34 | 
        // anemo = ((timer0_overflow_count * 0xFF) + get_timer0())/(32768.0/0xFFFF); | 
      
      
         | 
         | 
        35 | 
        // timer0_overflow_count=0; | 
      
      
         | 
         | 
        36 | 
        // set_timer0(0); | 
      
      
        | 2782 | 
        kaklik | 
        37 | 
        } | 
      
      
         | 
         | 
        38 | 
          | 
      
      
         | 
         | 
        39 | 
        #int_TIMER0 | 
      
      
         | 
         | 
        40 | 
        void  TIMER0_isr(void)  | 
      
      
         | 
         | 
        41 | 
        { | 
      
      
         | 
         | 
        42 | 
         timer0_overflow_count++; | 
      
      
         | 
         | 
        43 | 
        } | 
      
      
         | 
         | 
        44 | 
          | 
      
      
        | 2843 | 
        kaklik | 
        45 | 
        #int_default | 
      
      
         | 
         | 
        46 | 
        default_isr() | 
      
      
         | 
         | 
        47 | 
        { | 
      
      
        | 2782 | 
        kaklik | 
        48 | 
          | 
      
      
        | 2843 | 
        kaklik | 
        49 | 
           printf("Unexplained interrupt\r\n"); | 
      
      
        | 2782 | 
        kaklik | 
        50 | 
          | 
      
      
        | 2843 | 
        kaklik | 
        51 | 
        } | 
      
      
         | 
         | 
        52 | 
          | 
      
      
        | 2752 | 
        kaklik | 
        53 | 
        void welcome(void)               // Welcome message | 
      
      
         | 
         | 
        54 | 
        { | 
      
      
         | 
         | 
        55 | 
           char  REV[50]=ID;       // Buffer for concatenate of a version string | 
      
      
         | 
         | 
        56 | 
          | 
      
      
         | 
         | 
        57 | 
           if (REV[strlen(REV)-1]=='$') REV[strlen(REV)-1]=0; | 
      
      
        | 2780 | 
        kaklik | 
        58 | 
           printf("\r\n\r\n# AWS01A %s (C) 2013 www.mlab.cz \r\n",VER);   // Welcome message | 
      
      
        | 2752 | 
        kaklik | 
        59 | 
           printf("#%s\r\n",&REV[4]); | 
      
      
        | 2835 | 
        kaklik | 
        60 | 
           printf("# ver seq  temp[mK] hum_temp[mK] hum[%%] "); | 
      
      
         | 
         | 
        61 | 
           printf("bar_temp[mK] pressure[hPa]  Anemo[pls/s]check\r\n\r\n"); | 
      
      
        | 2752 | 
        kaklik | 
        62 | 
        } | 
      
      
         | 
         | 
        63 | 
          | 
      
      
        | 2751 | 
        kaklik | 
        64 | 
        void main() | 
      
      
         | 
         | 
        65 | 
        { | 
      
      
        | 2752 | 
        kaklik | 
        66 | 
        unsigned int16 seq=0; | 
      
      
        | 2751 | 
        kaklik | 
        67 | 
          | 
      
      
        | 2848 | 
        kakl | 
        68 | 
           setup_oscillator(OSC_8MHZ);       // pri prouziti bootloaderu neni treba nastavovat | 
      
      
         | 
         | 
        69 | 
           setup_wdt(WDT_2304MS); | 
      
      
        | 2843 | 
        kaklik | 
        70 | 
           restart_wdt();  //---WDT | 
      
      
        | 2822 | 
        kaklik | 
        71 | 
           setup_adc_ports(NO_ANALOGS|VSS_VDD); | 
      
      
        | 2751 | 
        kaklik | 
        72 | 
           setup_adc(ADC_CLOCK_DIV_2); | 
      
      
        | 2848 | 
        kakl | 
        73 | 
           setup_timer_0(RTCC_EXT_L_TO_H|RTCC_DIV_1); | 
      
      
         | 
         | 
        74 | 
        //   setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1);//|T1_CLK_OUT); | 
      
      
        | 2843 | 
        kaklik | 
        75 | 
           setup_timer_1(T1_INTERNAL|T1_DIV_BY_8); | 
      
      
        | 2751 | 
        kaklik | 
        76 | 
           setup_timer_2(T2_DISABLED,0,1); | 
      
      
         | 
         | 
        77 | 
           setup_ccp1(CCP_OFF); | 
      
      
        | 2823 | 
        kaklik | 
        78 | 
           setup_comparator(NC_NC_NC_NC);      // This device COMP currently not supported by the PICWizard | 
      
      
        | 2779 | 
        kaklik | 
        79 | 
           setup_spi(SPI_MASTER | SPI_MODE_0 | SPI_CLK_DIV_64); | 
      
      
         | 
         | 
        80 | 
           output_high(CSN_SPI); | 
      
      
        | 2782 | 
        kaklik | 
        81 | 
          | 
      
      
        | 2834 | 
        kaklik | 
        82 | 
           welcome();   // welcome print and device indentification | 
      
      
        | 2848 | 
        kakl | 
        83 | 
           output_low(PIN_E1); | 
      
      
         | 
         | 
        84 | 
          | 
      
      
        | 2897 | 
        kakl | 
        85 | 
           enable_interrupts(INT_TIMER1);   // interrupts used for anemometer readings | 
      
      
         | 
         | 
        86 | 
           enable_interrupts(INT_TIMER0); | 
      
      
        | 2843 | 
        kaklik | 
        87 | 
         //  disable_interrupts(INT_RDA); | 
      
      
        | 2897 | 
        kakl | 
        88 | 
          enable_interrupts(GLOBAL); | 
      
      
        | 2848 | 
        kakl | 
        89 | 
          output_high(PIN_E1); | 
      
      
         | 
         | 
        90 | 
          | 
      
      
         | 
         | 
        91 | 
           restart_wdt();  //---WDT | 
      
      
         | 
         | 
        92 | 
          | 
      
      
         | 
         | 
        93 | 
           sht_init(); | 
      
      
         | 
         | 
        94 | 
           MPL_init();  // get correction coefficients from the sensor  | 
      
      
        | 2843 | 
        kaklik | 
        95 | 
          | 
      
      
         | 
         | 
        96 | 
           restart_wdt();  //---WDT | 
      
      
        | 2822 | 
        kaklik | 
        97 | 
          | 
      
      
        | 2751 | 
        kaklik | 
        98 | 
           while (TRUE) | 
      
      
         | 
         | 
        99 | 
           { | 
      
      
        | 2768 | 
        kaklik | 
        100 | 
           char output[8];   // Output buffer | 
      
      
         | 
         | 
        101 | 
           int8 j;           // String pointer | 
      
      
         | 
         | 
        102 | 
           int8 check=0;     // Checksum is calculated between '$' and '*' | 
      
      
        | 2843 | 
        kaklik | 
        103 | 
           float SHT_temp=0,SHT_hum=0; | 
      
      
        | 2779 | 
        kaklik | 
        104 | 
           float local_temp;  | 
      
      
         | 
         | 
        105 | 
           float barometer_temperature, barometer_pressure; | 
      
      
        | 2768 | 
        kaklik | 
        106 | 
          | 
      
      
        | 2835 | 
        kaklik | 
        107 | 
             delay_ms(1000); | 
      
      
        | 2752 | 
        kaklik | 
        108 | 
                 { // printf | 
      
      
         | 
         | 
        109 | 
          | 
      
      
        | 2835 | 
        kaklik | 
        110 | 
             local_temp = ds1820_read()+27315; | 
      
      
        | 2768 | 
        kaklik | 
        111 | 
             sht_rd(SHT_temp,SHT_hum); | 
      
      
        | 2837 | 
        kaklik | 
        112 | 
             SHT_temp = (SHT_temp + 273.15)*100; | 
      
      
        | 2858 | 
        kaklik | 
        113 | 
             //barometer_temperature =  (MPL_get_temperature() + 273.15)*100; | 
      
      
         | 
         | 
        114 | 
             //barometer_pressure = MPL_get_pressure() * 10.0; // conversion to hectopascals | 
      
      
        | 2779 | 
        kaklik | 
        115 | 
          | 
      
      
        | 2752 | 
        kaklik | 
        116 | 
                 delay_us(SEND_DELAY); | 
      
      
         | 
         | 
        117 | 
                 putc('$'); | 
      
      
         | 
         | 
        118 | 
                 delay_us(SEND_DELAY); | 
      
      
         | 
         | 
        119 | 
                 sprintf(output,"AWS%s \0",VER); | 
      
      
         | 
         | 
        120 | 
                 j=0; while(output[j]!=0) { delay_us(SEND_DELAY); putc(output[j]); check^=output[j++]; } | 
      
      
         | 
         | 
        121 | 
                 sprintf(output,"%Lu \0", seq); | 
      
      
         | 
         | 
        122 | 
                 j=0; while(output[j]!=0) { delay_us(SEND_DELAY); putc(output[j]); check^=output[j++]; } | 
      
      
        | 2835 | 
        kaklik | 
        123 | 
                 sprintf(output,"%5.0f \0", local_temp ); | 
      
      
        | 2752 | 
        kaklik | 
        124 | 
                 j=0; while(output[j]!=0) { delay_us(SEND_DELAY); putc(output[j]); check^=output[j++]; } | 
      
      
        | 2837 | 
        kaklik | 
        125 | 
                 sprintf(output,"%5.0f \0", SHT_temp); | 
      
      
        | 2768 | 
        kaklik | 
        126 | 
                 j=0; while(output[j]!=0) { delay_us(SEND_DELAY); putc(output[j]); check^=output[j++]; } | 
      
      
        | 2779 | 
        kaklik | 
        127 | 
                 sprintf(output,"%3.1f \0", SHT_hum); | 
      
      
        | 2768 | 
        kaklik | 
        128 | 
                 j=0; while(output[j]!=0) { delay_us(SEND_DELAY); putc(output[j]); check^=output[j++]; } | 
      
      
        | 2837 | 
        kaklik | 
        129 | 
                 sprintf(output,"%5.0f \0", barometer_temperature); | 
      
      
        | 2779 | 
        kaklik | 
        130 | 
                 j=0; while(output[j]!=0) { delay_us(SEND_DELAY); putc(output[j]); check^=output[j++]; } | 
      
      
         | 
         | 
        131 | 
                 sprintf(output,"%5.1f \0", barometer_pressure); | 
      
      
         | 
         | 
        132 | 
                 j=0; while(output[j]!=0) { delay_us(SEND_DELAY); putc(output[j]); check^=output[j++]; } | 
      
      
        | 2782 | 
        kaklik | 
        133 | 
                 sprintf(output,"%3.1f \0", anemo); | 
      
      
         | 
         | 
        134 | 
                 j=0; while(output[j]!=0) { delay_us(SEND_DELAY); putc(output[j]); check^=output[j++]; } | 
      
      
        | 2752 | 
        kaklik | 
        135 | 
                 sprintf(output,"*%X\r\n\0", check); | 
      
      
         | 
         | 
        136 | 
                 j=0; while(output[j]!=0) { delay_us(SEND_DELAY); putc(output[j++]); } | 
      
      
         | 
         | 
        137 | 
                 delay_us(SEND_DELAY); | 
      
      
         | 
         | 
        138 | 
              } | 
      
      
        | 2843 | 
        kaklik | 
        139 | 
        //      output_toggle(PIN_E0); | 
      
      
        | 2752 | 
        kaklik | 
        140 | 
        //---WDT | 
      
      
         | 
         | 
        141 | 
              restart_wdt(); | 
      
      
         | 
         | 
        142 | 
                    seq++;        // Increment the number of measurement | 
      
      
        | 2751 | 
        kaklik | 
        143 | 
           } | 
      
      
         | 
         | 
        144 | 
        } | 
      
      
        | 2828 | 
        kaklik | 
        145 | 
          |