fork download
  1. #include <xc.h>
  2.  
  3. #define _XTAL_FREQ 4000000
  4.  
  5. // CONFIG
  6. #pragma config FOSC = INTOSCIO
  7. #pragma config WDTE = OFF
  8. #pragma config PWRTE = ON
  9. #pragma config MCLRE = OFF
  10. #pragma config BOREN = ON
  11. #pragma config LVP = OFF
  12. #pragma config CPD = OFF
  13. #pragma config CP = OFF
  14.  
  15. // ================= GLOBALS =================
  16. volatile unsigned char digits[4] = {0,0,0,0};
  17. volatile unsigned char mux_pos = 0;
  18. volatile unsigned int ms_counter = 0;
  19. volatile unsigned char second_flag = 0;
  20.  
  21. // ================ 1-WIRE ===================
  22. #define DQ RB0
  23. #define DQ_DIR TRISB0
  24.  
  25. void ow_low(void){ DQ_DIR=0; DQ=0; }
  26. void ow_release(void){ DQ_DIR=1; }
  27.  
  28. unsigned char ow_reset(void){
  29. unsigned char p;
  30. ow_low(); __delay_us(480);
  31. ow_release(); __delay_us(70);
  32. p=!DQ;
  33. __delay_us(410);
  34. return p;
  35. }
  36.  
  37. void ow_write_bit(unsigned char b){
  38. ow_low();
  39. if(b){ __delay_us(6); ow_release(); __delay_us(64); }
  40. else { __delay_us(60); ow_release(); __delay_us(10); }
  41. }
  42.  
  43. unsigned char ow_read_bit(void){
  44. unsigned char b;
  45. ow_low(); __delay_us(6);
  46. ow_release(); __delay_us(9);
  47. b=DQ;
  48. __delay_us(55);
  49. return b;
  50. }
  51.  
  52. void ow_write_byte(unsigned char val){
  53. unsigned char i;
  54. for(i=0;i<8;i++){
  55. ow_write_bit(val&1);
  56. val>>=1;
  57. }
  58. }
  59.  
  60. unsigned char ow_read_byte(void){
  61. unsigned char i,r=0;
  62. for(i=0;i<8;i++){
  63. r>>=1;
  64. if(ow_read_bit()) r|=0x80;
  65. }
  66. return r;
  67. }
  68.  
  69. // =============== TEMPERATURE ===============
  70. int read_temp10(void){
  71. int raw;
  72. unsigned char lsb,msb;
  73.  
  74. ow_reset();
  75. ow_write_byte(0xCC);
  76. ow_write_byte(0x44);
  77. __delay_ms(750);
  78.  
  79. ow_reset();
  80. ow_write_byte(0xCC);
  81. ow_write_byte(0xBE);
  82.  
  83. lsb=ow_read_byte();
  84. msb=ow_read_byte();
  85.  
  86. raw=((int)msb<<8)|lsb;
  87.  
  88. return (raw*10)/16;
  89. }
  90.  
  91. void temp_to_digits(int t10){
  92.  
  93. if(t10<0) t10=-t10;
  94.  
  95. digits[0]=(t10/100)%10;
  96. digits[1]=(t10/10)%10;
  97. digits[2]=t10%10;
  98. digits[3]=0x0F; // blank
  99. }
  100.  
  101. // ============== MULTIPLEX ISR ==============
  102. void all_off(void){
  103. RB4=0; RB5=0; RB6=0; RB7=0;
  104. }
  105.  
  106. void interrupt isr(void){
  107.  
  108. if(T0IF){
  109.  
  110. TMR0 = 6; // ~1ms at 4MHz
  111. T0IF = 0;
  112.  
  113. all_off();
  114.  
  115. if(digits[mux_pos] <= 9)
  116. PORTA = (PORTA & 0xF0) | digits[mux_pos];
  117. else
  118. PORTA = (PORTA & 0xF0);
  119.  
  120. switch(mux_pos){
  121. case 0: RB4=1; break;
  122. case 1: RB5=1; break;
  123. case 2: RB6=1; break;
  124. case 3: RB7=1; break;
  125. }
  126.  
  127. mux_pos++;
  128. if(mux_pos>3) mux_pos=0;
  129.  
  130. ms_counter++;
  131. if(ms_counter>=1000){
  132. ms_counter=0;
  133. second_flag=1;
  134. }
  135. }
  136. }
  137.  
  138. // ============== ANTI POISON ===============
  139. void anti_poison(void){
  140. unsigned char d,i;
  141.  
  142. for(d=0; d<10; d++){
  143. for(i=0;i<4;i++)
  144. digits[i]=d;
  145. __delay_ms(80);
  146. }
  147. }
  148.  
  149. // =================== MAIN ==================
  150. void main(void){
  151.  
  152. CMCON=0x07;
  153.  
  154. TRISA=0x00;
  155. TRISB=0x01;
  156.  
  157. PORTA=0;
  158. PORTB=0;
  159.  
  160. // Timer0 setup
  161. OPTION_REG=0b00000010; // prescaler 1:8
  162. TMR0=6;
  163. T0IE=1;
  164. GIE=1;
  165.  
  166. unsigned int poison_timer=0;
  167.  
  168. while(1){
  169.  
  170. if(second_flag){
  171. second_flag=0;
  172.  
  173. int t=read_temp10();
  174. temp_to_digits(t);
  175.  
  176. poison_timer++;
  177. if(poison_timer>=600){ // 10 minutes
  178. anti_poison();
  179. poison_timer=0;
  180. }
  181. }
  182. }
  183. }
  184.  
Success #stdin #stdout 0.03s 25704KB
stdin
Standard input is empty
stdout
#include <xc.h>

#define _XTAL_FREQ 4000000

// CONFIG
#pragma config FOSC = INTOSCIO
#pragma config WDTE = OFF
#pragma config PWRTE = ON
#pragma config MCLRE = OFF
#pragma config BOREN = ON
#pragma config LVP = OFF
#pragma config CPD = OFF
#pragma config CP = OFF

// ================= GLOBALS =================
volatile unsigned char digits[4] = {0,0,0,0};
volatile unsigned char mux_pos = 0;
volatile unsigned int ms_counter = 0;
volatile unsigned char second_flag = 0;

// ================ 1-WIRE ===================
#define DQ      RB0
#define DQ_DIR  TRISB0

void ow_low(void){ DQ_DIR=0; DQ=0; }
void ow_release(void){ DQ_DIR=1; }

unsigned char ow_reset(void){
    unsigned char p;
    ow_low(); __delay_us(480);
    ow_release(); __delay_us(70);
    p=!DQ;
    __delay_us(410);
    return p;
}

void ow_write_bit(unsigned char b){
    ow_low();
    if(b){ __delay_us(6); ow_release(); __delay_us(64); }
    else { __delay_us(60); ow_release(); __delay_us(10); }
}

unsigned char ow_read_bit(void){
    unsigned char b;
    ow_low(); __delay_us(6);
    ow_release(); __delay_us(9);
    b=DQ;
    __delay_us(55);
    return b;
}

void ow_write_byte(unsigned char val){
    unsigned char i;
    for(i=0;i<8;i++){
        ow_write_bit(val&1);
        val>>=1;
    }
}

unsigned char ow_read_byte(void){
    unsigned char i,r=0;
    for(i=0;i<8;i++){
        r>>=1;
        if(ow_read_bit()) r|=0x80;
    }
    return r;
}

// =============== TEMPERATURE ===============
int read_temp10(void){
    int raw;
    unsigned char lsb,msb;

    ow_reset();
    ow_write_byte(0xCC);
    ow_write_byte(0x44);
    __delay_ms(750);

    ow_reset();
    ow_write_byte(0xCC);
    ow_write_byte(0xBE);

    lsb=ow_read_byte();
    msb=ow_read_byte();

    raw=((int)msb<<8)|lsb;

    return (raw*10)/16;
}

void temp_to_digits(int t10){

    if(t10<0) t10=-t10;

    digits[0]=(t10/100)%10;
    digits[1]=(t10/10)%10;
    digits[2]=t10%10;
    digits[3]=0x0F; // blank
}

// ============== MULTIPLEX ISR ==============
void all_off(void){
    RB4=0; RB5=0; RB6=0; RB7=0;
}

void interrupt isr(void){

    if(T0IF){

        TMR0 = 6;     // ~1ms at 4MHz
        T0IF = 0;

        all_off();

        if(digits[mux_pos] <= 9)
            PORTA = (PORTA & 0xF0) | digits[mux_pos];
        else
            PORTA = (PORTA & 0xF0);

        switch(mux_pos){
            case 0: RB4=1; break;
            case 1: RB5=1; break;
            case 2: RB6=1; break;
            case 3: RB7=1; break;
        }

        mux_pos++;
        if(mux_pos>3) mux_pos=0;

        ms_counter++;
        if(ms_counter>=1000){
            ms_counter=0;
            second_flag=1;
        }
    }
}

// ============== ANTI POISON ===============
void anti_poison(void){
    unsigned char d,i;

    for(d=0; d<10; d++){
        for(i=0;i<4;i++)
            digits[i]=d;
        __delay_ms(80);
    }
}

// =================== MAIN ==================
void main(void){

    CMCON=0x07;

    TRISA=0x00;
    TRISB=0x01;

    PORTA=0;
    PORTB=0;

    // Timer0 setup
    OPTION_REG=0b00000010;  // prescaler 1:8
    TMR0=6;
    T0IE=1;
    GIE=1;

    unsigned int poison_timer=0;

    while(1){

        if(second_flag){
            second_flag=0;

            int t=read_temp10();
            temp_to_digits(t);

            poison_timer++;
            if(poison_timer>=600){ // 10 minutes
                anti_poison();
                poison_timer=0;
            }
        }
    }
}