main.c_2(1).txt

(7 KB) Pobierz
/*****************************************************
This program was produced by the
CodeWizardAVR V1.25.7f Pro

Project : Termometr
Version : 0.2 (ïðîìåæóòî÷íàÿ âåðñèÿ)
Date    : 02.02.2008
Author  : Danil                          
Company : home                            
Comments: 

Chip type           : ATtiny2313
Clock frequency     : 4,000000 MHz
Memory model        : Tiny
External SRAM size  : 0
Data Stack size     : 32
*****************************************************/

#include <tiny2313.h>

// 1 Wire Bus functions (bit 0 PORTA)
#asm
   .equ __w1_port=0x1b
   .equ __w1_bit=0
#endasm
#include <1wire.h>

// DS18b20 Temperature Sensor functions
#include <ds18b20.h>  
#include <delay.h>         

eeprom char digits[] = {
        0xD7, // 0
        0x14, // 1
        0xCD, // 2
        0x5D, // 3
        0x1E, // 4
        0x5B, // 5
        0xDB, // 6
        0x15, // 7
        0xDF, // 8
        0x5F, // 9
        0x08, // 10 - çíàê ìèíóñ
        0x0F, // 11 - ñèìâîë ãðàäóñ öåëüñèÿ
        0x00, // 12 - ïóñòî
        0x8B, // 13 - F
        0x98, // 14 - n
        0xFC, // 15 - d.
        0xCB, // 16 - E
        0x88, // 17 - r
        0xA8  // 18 - r.
};                  

#define MINUS  10
#define GRADUS 11
#define PROBEL 12 
  
char digit_out[4], cur_dig;    
int temperature;
float temperature_DS18B20;          
bit isfloat;

flash char cursor[]={0b11111110, 0b11101111, 0b11011111, 0b10111111}; // digit1  - PORTD.0, digit2 - PORTD.4, digit3 - PORTD.5, digit4 - PORTD.6

/* maximum number of DS18B20 connected to the 1 Wire bus */
#define MAX_DEVICES 2

/* DS18B20 devices ROM code storage area */
unsigned char rom_code[MAX_DEVICES][9];

// Timer 1 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void) {
        PORTB=0x00;
        
        PORTD|=0b01110001;         // ïîòóøèòü âñå (áèòû âñåõ çíàêîìåñò "1" - äëÿ Îáù.êàò.)
        PORTD&=(cursor[cur_dig]);  // çàñâåòèòü íóæíûé áèò (áèò çíàêîìåñòà â "0" - äëÿ Îáù.êàò.)
        
        PORTB=digits[digit_out[cur_dig]];
        if (cur_dig==1&isfloat) PORTB.5=1;

        cur_dig++;
        if (cur_dig>=4) cur_dig=0;
}

// Declare your global variables here
void hex_to_dec(void);

void main(void) { //================================================= main ========================================================
unsigned char i,devices;
i=0; devices=0;
// Declare your local variables here

// Crystal Oscillator division factor: 1
CLKPR=0x80;
CLKPR=0x00;

// Ïîðò À íà ââîä
DDRA=0x00;
PORTA=0x00;

// Ïîðò B íà âûâîä + ïîäòÿãèâàþùèå ðåçèñòîðû íå âêëþ÷àòü
DDRB=0xFF;
PORTB=0x00;

// Ïîðò D (áèòû 6,5,4,0 íà âûâîä, áèòû 3,2,1 íà ââîä, ïîäòÿãèâàþùèå ðåçèñòîðû íå âêëþ÷àòü)
DDRD=0x71;
PORTD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 62,500 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
TCCR0A=0x00;
TCCR0B=0x03;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// Interrupt on any change on pins PCINT0-7: Off
GIMSK=0x00;
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x02;

// Universal Serial Interface initialization
// Mode: Disabled
// Clock source: Register & Counter=no clk.
// USI Counter Overflow Interrupt: Off
USICR=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;

// 1 Wire Bus initialization
//w1_init();

// Global enable interrupts
#asm("sei")                     

devices=w1_search(0xf0,rom_code);

 // íà 2 ñåêóíäû âûñâåòèòü íà èíäèêàòîðå Fnd 'êîë-âî íàéäåíûõ óñòðîéñòâ'
 digit_out[0]=13;    // F
 digit_out[1]=14;    // n
 digit_out[2]=15;    // d.
 digit_out[3]=devices; // 'devices'
 delay_ms(2000);
   
 while (1) {
        devices=w1_search(0xf0,rom_code); // îïðåäåëèòü óñòðîéñòâà (îïðîñèòü äàò÷èêè)
  
        if (devices) { // åñëè îáíàðóæåíî õîòÿ áû îäèí äàò÷èê 
           for (i=0;i<devices;) {
                temperature_DS18B20=ds18b20_temperature(&rom_code[i++][0]); 
                if (temperature_DS18B20!=-9999) {
                        temperature=(int)(temperature_DS18B20*10); // òåìïåðàòóðà * 10 ò.å. 24,3 ãðàäóñîâ áóäåò 243
                        hex_to_dec();
                        if (devices!=1) delay_ms(2000);
                }
           }
        }        
 }         

} // =============================================================== end main ==================================================



// -----------------------------------------------------------------------------------------------------------------------------
// âõîäíûå äàííûå: òåìïåðàòåðà îò -99 äî +199 ò.å åñëè òåìï. 201 ãðàäóñ òî íà èíäèêàòîðå 101, åëè -150 òî íà èíäèêàòîðå -15 
// -----------------------------------------------------------------------------------------------------------------------------
void hex_to_dec(void) {
        char i;
        unsigned int temp;               
        isfloat=1; // ïîêàçàòü çàïÿòóþ                   
        // temperature = 1000 ýòî 100,0 ãðàäóñîâ öåëüñèÿ ò.å. òî÷íîñòü 0,1 ãðàäóñà        
        if (temperature>=0) { // åñëè òåìïåðàòóðà ïîëîæèòåëüíàÿ
                temp = temperature; 
                
                // åñëè áîëüøå 100 ãðàäóñîâ, òî çàïÿòóþ íå âûñâå÷èâàòü è îòñå÷ü äåñÿòûå äîëè ò.å òî÷íîñòü 1 ãðàäóñ, 
                // digit_out[0] = ñîòíè, åñëè ìåíüøå òî digit_out[0] = äåñÿòêè
                if (temperature>=1000) { isfloat = 0; temp = temperature/10; };
                
                i=0;
                while (temp>=100) {    
                        temp=temp-100;
                        i++;
                };
                                
                if (i) digit_out[0]=i;
                else   digit_out[0]=PROBEL; // åñëè ïåðâûé ñèìâîë "0" òî âûñâåòèòü ïðîáåë (ïóñòî)
                
                i=0;
                while (temp>=10) {    
                        temp=temp-10;
                        i++;
                };
                digit_out[1]=i;
                digit_out[2]=temp;                      
        } 
        else { // åñëè òåìïåðàòåðà îòðèöàòåëüíàÿ 
                temp = -temperature; // èç îòðèöàòåëüíîé ñäåëàòü ïîëîæèòåëüíóþ 
                
                if (temp > 100) { isfloat=0; temp = temp/10; } // åñëè òåìïåðàòóðà áîëüøå 10 ãð. òî çàïÿòóþ íå ïîêàçûâàòü
                                                               // è òî÷íîñòü óìåíüøèòü äî 1 ãðàäóñà
                i=0;
                while (temp>=10) {    
                        temp=temp-10;
                        i++;
                };
                digit_out[0]=MINUS;
                digit_out[1]=i;
                digit_out[2]=temp;                    
        }
        digit_out[3]=GRADUS;
}
Zgłoś jeśli naruszono regulamin