#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; } } } }
Standard input is empty
#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;
}
}
}
}