|
-
|
|
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:
.
Plošný spoj:
.
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:


.
.
.
.
.
.
.
.
.
.
.
.
.
|