Gustav |
Nové stránky BETA
Hlavní nabídka
Technika & Bastlení
Média
Reklama Google

Teplom?r s ATmega8 PDF Tisk Email
-
Napsal uživatel Michal, OK1WMR   
Pátek, 15 Červen 2012 13:56
Další jednoduché zapojení ur?ené pro náš kroužek mládeže, tentokrát jednoduchého teplom?ru s ATmega8 a ?idlem teploty DS18B20. Najdete zde kompletní popis programu a zapojení v?etn? plošného spoje.
.
.

Schéma:
schema
.
Plošný spoj:
pcb
.
Eagle 6.1: SCH a BRD + doporu?ená Pájovo knihovna sou?ástek #PaJa_22.lbr.

Komplet zdrojáky: teplomer.zip

Deska byla vyrobena metodou nažehlením tonneru.


Program:


Untitled <!-- body { color: #000000; background-color: #FFFFFF; } .cpp1-assembler { } .cpp1-brackets { } .cpp1-comment { color: #008000; font-style: italic; } .cpp1-float { color: #000080; } .cpp1-hexadecimal { color: #000080; } .cpp1-character { } .cpp1-identifier { } .cpp1-illegalchar { } .cpp1-number { color: #000080; } .cpp1-octal { color: #0000FF; } .cpp1-preprocessor { } .cpp1-reservedword { font-weight: bold; } .cpp1-space { color: #008080; } .cpp1-string { color: #800000; } .cpp1-symbol { } -->
#define F_CPU    8000000        //8MHz

#include
#include

#include "wait.c"
#include "ds18b20_1.c"

//definice pinu pro ?idlo
#define OW_PORT        PORTB
#define OW_DDR        DDRB
#define OW_PIN        PINB
#define OW_BIT        2
   
#define _s_A  2
#define _s_B  0
#define _s_C  6
#define _s_D  4
#define _s_E  3
#define _s_F  1
#define _s_G  7
#define _s_dot 5

const unsigned char segs[] = //?íslice
{
_BV(_s_A) | _BV(_s_B) | _BV(_s_C) | _BV(_s_D) | _BV(_s_E) | _BV(_s_F),    //0
_BV(_s_B) | _BV(_s_C),    //1
_BV(_s_A) | _BV(_s_B) | _BV(_s_D) | _BV(_s_E) | _BV(_s_G),    //2
_BV(_s_A) | _BV(_s_B) | _BV(_s_C) | _BV(_s_D) | _BV(_s_G),  //3
_BV(_s_B) | _BV(_s_C) | _BV(_s_F) | _BV(_s_G),    //4
_BV(_s_A) | _BV(_s_C) | _BV(_s_D) | _BV(_s_F) | _BV(_s_G), //5
_BV(_s_A) | _BV(_s_C) | _BV(_s_D) | _BV(_s_E) | _BV(_s_F) | _BV(_s_G), //6
_BV(_s_A) | _BV(_s_B) | _BV(_s_C), //7
_BV(_s_A) | _BV(_s_B) | _BV(_s_C) | _BV(_s_D) | _BV(_s_E) | _BV(_s_F) | _BV(_s_G),//8
_BV(_s_A) | _BV(_s_B) | _BV(_s_C) | _BV(_s_F) | _BV(_s_G),//9
_BV(_s_G) //mínus   
};

const unsigned char err[] = //chyba
{
0, //mezera
_BV(_s_A) | _BV(_s_D) | _BV(_s_E) | _BV(_s_F) | _BV(_s_G), //E
_BV(_s_E) | _BV(_s_G), //r
_BV(_s_E) | _BV(_s_G) //r
};


volatile int temp; //teplota
  
ISR(TIMER1_COMPA_vect)
{
static int temp_1=0;
static unsigned char disp=0;
unsigned char dec;


disp++;       
if(disp>3)
    disp=0;            //cyklicky 0 - 4 (sedmisegmentovka)

PORTD=0xff;    //vypnout segmenty
PORTC=0b00100000>>disp;    //p?epnout na danou sedmisegmentovku

if (temp==0x5fff)    //pokud je chyba ?idla
    {
    PORTD=(~err[disp]);    //vypsání znaku chyby
    }

else //pokud není chyba ?idla
    {
    switch(disp)
        {
        case 0://1.cifra - znaménko
            if (temp>>15) //pokud je nejvyšší bit 1 (záporné)
                {
                temp_1=temp*(-1);    //p?evedení záporné teploty
                PORTD=(~segs[10]);    //zobrazení mínus
                }
            else
                temp_1=temp/16;        //p?evedení kladné teploty   
        break;

        case 1://2.cifra - desítky
            dec = temp_1 / 10;
                
            if(dec>0)
                PORTD=(~segs[dec]);//zobrazit desítky
        break;

        case 2://3.cifra - jednotky
            PORTD=(~segs[temp_1 % 10]) & ~_BV(_s_dot); //zobrazit jednotky a te?ku
        break;

        case 3://4.cifra - desetiny
            PORTD = (~segs[((temp % 16)*625)/1000]); //zobrazit desetiny
        break;
        }//switch(disp)  
    }//else (temp==0x5fff)

}//ISR(TIMER1_COMPA_vect)


int main(void)
{
DDRD = 0xFF; //výstupy - segmenty
DDRC = 0x3F; //výstupy - displeje
   
setb(TCCR1B,0);
setb(TCCR1B,1);//start ?íta? 1 s p?edd?li?em 64
setb(TCCR1B,3);//CTC mode

OCR1AH=0x01;//     porovnávací registry
OCR1AL=0x39;//  0x0139 = 313 = 8 000 000 / 64 / (100 * 4)  (=> 100 Hz)

setb(TIMSK,4); //Povolení p?erušení od ?asova?e 1
setb(SREG,7);  //globální povolení p?erušení

while(1)
    {
     temp=gettemp();//p?e?tení teploty z ?idla
     //wait_ms(200);
    }
}

Fotky:


.
.
.
.
.
.
.
.
.
.
.
.
.

 
Poslední aktualizace
 5 January 2016, 07:01 
Webkamera
Webkamera na Blatenském vrchu
Change language
Sociální sít?
Náhodné foto
Podporují nás