diff --git a/SW/CMakeLists.txt b/SW/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..081153cbe56489092cc11255139536d708b14836 --- /dev/null +++ b/SW/CMakeLists.txt @@ -0,0 +1,44 @@ +cmake_minimum_required(VERSION 3.0) + +set(AVR_UPLOADTOOL avrdude) +set(AVR_PROGRAMMER usbasp) +set(AVR_UPLOADTOOL_PORT usb) +set(AVR_MCU atmega8) +set(AVR_H_FUSE 0xD9) +set(AVR_L_FUSE 0x04) +set(CMAKE_BUILD_TYPE Release) +set(MCU_SPEED "8000000UL") +set(WITH_MCU OFF) +set(WITH_MCU OFF CACHE BOOL "Add the mCU type to the target file name." FORCE) + +find_package(avr) + +project(digitalni-teplomer) + +add_definitions("-DF_CPU=${MCU_SPEED}") + +add_definitions("-fpack-struct") +add_definitions("-fshort-enums") +add_definitions("-Wall") +add_definitions("-funsigned-char") +add_definitions("-funsigned-bitfields") +add_definitions("-ffunction-sections") +add_definitions("-fdata-sections") +add_definitions("-fno-exceptions") +add_definitions("-mcall-prologues") +add_definitions("-mrelax") +add_definitions("-c") +add_definitions("-std=c11") + +set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} "-Wl,--gc-sections -Wl,--relax -Os -mrelax") +set(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} "-Wl,--gc-sections -Wl,--relax -Os -mrelax") + +set(SOURCE_FILES + digitalni_teplomer.c + ds18b20_1.c + ds18b20_1.h + macros.h + config.h +) + +add_avr_executable(digitalni-teplomer ${SOURCE_FILES}) diff --git a/SW/config.h b/SW/config.h new file mode 100644 index 0000000000000000000000000000000000000000..c0dc689c0139cc84623a51e89bec2f8eac9dac11 --- /dev/null +++ b/SW/config.h @@ -0,0 +1,9 @@ +#pragma once + +#include <avr/io.h> + +//definice pinĹŻ pro ÄŤidlo DS18B20 +#define OW_PORT PORTB +#define OW_DDR DDRB +#define OW_PIN PINB +#define OW_BIT PB2 \ No newline at end of file diff --git a/SW/digitalni_teplomer.c b/SW/digitalni_teplomer.c new file mode 100644 index 0000000000000000000000000000000000000000..bb9a25d652a3b0bd9df19a270d5ac304e5203279 --- /dev/null +++ b/SW/digitalni_teplomer.c @@ -0,0 +1,113 @@ +//#define F_CPU 8000000 //8MHz -> definováno v CMakeLists.txt + +#include <avr/io.h> +#include <avr/interrupt.h> + +#include "ds18b20_1.h" +#include "macros.h" + +//Definice pozic segmentĹŻ na pinech portu +#define _s_A PD2 +#define _s_B PD0 +#define _s_C PD6 +#define _s_D PD4 +#define _s_E PD3 +#define _s_F PD1 +#define _s_G PD7 +#define _s_dot PD5 + +const unsigned char segs[] = //Definice ÄŤĂslic na 7segmentovĂ© displeji +{ + _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; //PromÄ›nná pro teplotu + +//V tomto pĹ™erušenĂ se zobrazuje na despleji +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Ă© ÄŤĂslo) + { + temp_1=temp*(-1); //pĹ™evedenĂ zápornĂ© teploty na kladnou + 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 desetinnou 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ÄŤe 1 s pĹ™eddÄ›liÄŤkou 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 + } +} diff --git a/SW/teplomer2_003/ds18b20_1.c b/SW/ds18b20_1.c similarity index 56% rename from SW/teplomer2_003/ds18b20_1.c rename to SW/ds18b20_1.c index 4adb3971444dd057d31cb970a95a9ba1d9ef53fe..cd85af89b8e2abb88144083fdb964afcd708248c 100644 --- a/SW/teplomer2_003/ds18b20_1.c +++ b/SW/ds18b20_1.c @@ -1,115 +1,101 @@ // DS18B20_1.c - - - -#include <avr/io.h> // definice io registrů atd -#include <util/atomic.h> // nedělitelnost kódu +#include <avr/io.h> // definice io registrďż˝ atd +#include <util/atomic.h> // nedďż˝litelnost kďż˝du +#include <util/delay.h> +#include "macros.h" +#include "config.h" +#include "ds18b20_1.h" //#ifndef OW_PORT & OW_DDR & OW_PIN & OW_BIT - //pokud není definováno, definuj + //pokud nenďż˝ definovďż˝no, definuj /* #define OW_PORT PORTC #define OW_DDR DDRC #define OW_PIN PINC -#define OW_BIT 0 //nožička +#define OW_BIT 0 //noďż˝iďż˝ka */ //#endif -/////////////deklarace fcí////////// - -unsigned char ow_reset (void); -void ow_pulldown (void); -void ow_pullup (void); -unsigned char ow_bitstate (void); //zjistí aktuální stav na 1-wire pinu -unsigned char ow_readbit (void); -void ow_sendbit (unsigned char ow_databit); -char ow_readbyte (void); //přečti bajt -void ow_sendbyte (char ow_byte); //pošli bajt -unsigned char read_scratch (unsigned char *scratch); //přečte celou scratchpad (8bajtů) -unsigned char check_crc (unsigned char crc, unsigned char data); //kontrola crc (porovná 1 bajt s klíčem 0x8C) -//teploměr -int gettemp(void); - //////////////////////////////////////////// unsigned char ow_reset(void) - { - unsigned char ow_rst=1; //neresetováno +{ + unsigned char ow_rst=1; //neresetovďż˝no ow_pulldown(); - wait_us(460); //"480"//reset pulse "480" + _delay_us(460); //"480"//reset pulse "480" ow_pullup(); - wait_us(30); //"35"//odhadem + _delay_us(30); //"35"//odhadem ow_rst = ow_bitstate(); //?present pulse - wait_us(445); //"445"//cca 445 (480-35) (min reset-present = 480) + _delay_us(445); //"445"//cca 445 (480-35) (min reset-present = 480) if(ow_rst) return 0; //no present pulse else return 1; //reseted - } +} //////////////////////////////////////////// void ow_pulldown(void) - { +{ setb(OW_DDR,OW_BIT); - clrb(OW_PORT,OW_BIT); //stáhni 1-wire pin k zemi - } + clrb(OW_PORT,OW_BIT); //stďż˝hni 1-wire pin k zemi +} //////////////////////////////////////////// void ow_pullup(void) - { +{ clrb(OW_DDR,OW_BIT); setb(OW_PORT,OW_BIT); //1-wire pullup - } +} //////////////////////////////////////////// -unsigned char ow_bitstate(void) //4instr //zjistí aktuální stav na 1-wire pinu - { +unsigned char ow_bitstate(void) //4instr //zjistďż˝ aktuďż˝lnďż˝ stav na 1-wire pinu +{ if(bit_is_clear(OW_PIN,OW_BIT)) return (0); else return (1); - } +} //////////////////////////ow_readbit//////// -unsigned char ow_readbit(void) //přečti 1-wire pin - { +unsigned char ow_readbit(void) //pďż˝eďż˝ti 1-wire pin +{ unsigned char ow_bit=0; ATOMIC_BLOCK(ATOMIC_FORCEON) { ow_pulldown(); //3instr //pulldown 5us - wait_us(3); //"5" + _delay_us(3); //"5" ow_pullup(); //3instr - wait_us(3); //"5" + _delay_us(3); //"5" ow_bit=ow_bitstate(); //5instr } - wait_us(40); //"55" + _delay_us(40); //"55" return (ow_bit); - } +} ////////////////////////////ow_sendbit/////// void ow_sendbit(unsigned char ow_databit) - { +{ ATOMIC_BLOCK(ATOMIC_FORCEON) { - ow_databit &=1; //vymaskování nejnižšího bitu + ow_databit &=1; //vymaskovďż˝nďż˝ nejni���ho bitu ow_pulldown(); //3instr //pulldown 10us - wait_us(6); //"10" + _delay_us(6); //"10" if (ow_databit) ow_pullup(); //3instr else ow_pulldown(); //3instr - wait_us(30); //"55"//DS sampling min 50us + _delay_us(30); //"55"//DS sampling min 50us ow_pullup(); - wait_us(3); //"5" + _delay_us(3); //"5" } - } +} /////////////////////////////////////////// -char ow_readbyte(void) //přečti bajt - { +char ow_readbyte(void) //pďż˝eďż˝ti bajt +{ char ow_byte = 0; for (char i=0; i<8; ) { @@ -117,22 +103,22 @@ char ow_readbyte(void) //p i++; } return (ow_byte); - } +} /////////////////////////////////////////// -void ow_sendbyte(char ow_byte) //pošli bajt - { +void ow_sendbyte(char ow_byte) //poďż˝li bajt +{ for (char i=0; i<8; ) { - ow_sendbit( ow_byte >> i); //stačí odrotovat - vymaskování provede fce ow_sendbit + ow_sendbit( ow_byte >> i); //sta�� odrotovat - vymaskovďż˝nďż˝ provede fce ow_sendbit i++; } - } +} ////////////////////////////////////////// unsigned char read_scratch (unsigned char *scratch) - { +{ unsigned char crc=0; for (unsigned char i = 0; i < 9; i++) { @@ -140,10 +126,10 @@ unsigned char read_scratch (unsigned char *scratch) crc = check_crc(crc, scratch[i]); } return (crc); //0 = OK - } +} ////////////////////////////////////////// unsigned char check_crc (unsigned char crc, unsigned char data) - { +{ crc = crc ^ data; for (unsigned char i = 0; i < 8; i++) { @@ -153,29 +139,29 @@ unsigned char check_crc (unsigned char crc, unsigned char data) crc >>= 1; } return crc; - } +} ////////////////////////////////////////// -////////fce teploměru///////// +////////fce teplomďż˝ru///////// int gettemp(void) - { +{ unsigned char crc_ok=1, reseted=0; unsigned char scratch[9]; int temp=0; reseted=ow_reset(); //reset ow_sendbyte(0xcc); //SKIP ROM [CCh] ow_sendbyte(0x44); //CONVERT T [44h] - //wait_ms(750); //750 + //_delay_ms(750); //750 ow_reset(); //reset ow_sendbyte(0xcc); //SKIP ROM [CCh] ow_sendbyte(0xbe); //READ SCRATCHPAD [BEh] crc_ok= read_scratch (scratch); - temp = scratch[0]; //dolní bajt - temp |= (scratch[1] << 8); //horní bajt + temp = scratch[0]; //dolnďż˝ bajt + temp |= (scratch[1] << 8); //hornďż˝ bajt if(reseted&&(crc_ok==0)) return (temp); else return (0x5fff); //error - } +} ///////////////////////////// diff --git a/SW/ds18b20_1.h b/SW/ds18b20_1.h new file mode 100644 index 0000000000000000000000000000000000000000..0500e9b8da84616da08713fdfa1fb6b1fa7033b9 --- /dev/null +++ b/SW/ds18b20_1.h @@ -0,0 +1,15 @@ +#pragma once + +unsigned char ow_reset (void); +void ow_pulldown (void); +void ow_pullup (void); +unsigned char ow_bitstate (void); //zjistĂ aktuálnĂ stav na 1-wire pinu +unsigned char ow_readbit (void); +void ow_sendbit (unsigned char ow_databit); +char ow_readbyte (void); //pĹ™eÄŤti bajt +void ow_sendbyte (char ow_byte); //pošli bajt +unsigned char read_scratch (unsigned char *scratch); //pĹ™eÄŤte celou scratchpad (8bajtĹŻ) +unsigned char check_crc (unsigned char crc, unsigned char data); //kontrola crc (porovnĂ 1 bajt s kĂłdem 0x8C) + +//teplomÄ›r +int gettemp(void); diff --git a/SW/macros.h b/SW/macros.h new file mode 100644 index 0000000000000000000000000000000000000000..1c3841d08a53fe5882408166cd2b6b9d45bfb279 --- /dev/null +++ b/SW/macros.h @@ -0,0 +1,10 @@ +// +// Created by martin.vitek on 15.7.15. +// + +#pragma once + +// Zmena bitu portu, IO registru nebo promenne: +#define setb(bajt,bit) bajt |= 1<<(bit) //nastav bit +#define clrb(bajt,bit) bajt &= ~(1<<(bit)) //nuluj bit +#define negb(bajt,bit) bajt ^= 1<<(bit) //neguj bit diff --git a/SW/teplomer2_003/default/teplomer2_003.eep b/SW/teplomer2_003/default/teplomer2_003.eep deleted file mode 100644 index 1996e8fde5d7311bbef07a199045173b4bebb079..0000000000000000000000000000000000000000 --- a/SW/teplomer2_003/default/teplomer2_003.eep +++ /dev/null @@ -1 +0,0 @@ -:00000001FF diff --git a/SW/teplomer2_003/default/teplomer2_003.hex b/SW/teplomer2_003/default/teplomer2_003.hex deleted file mode 100644 index 12eb77a596ff43ac791c5537d70c172718094ca4..0000000000000000000000000000000000000000 --- a/SW/teplomer2_003/default/teplomer2_003.hex +++ /dev/null @@ -1,71 +0,0 @@ -:1000000012C02CC02BC02AC029C028C02DC126C0B8 -:1000100025C024C023C022C021C020C01FC01EC0D4 -:100020001DC01CC01BC011241FBECFE5D4E0DEBF25 -:10003000CDBF10E0A0E6B0E0E6E3F4E002C005903A -:100040000D92A237B107D9F710E0A2E7B0E001C0E6 -:100050001D92A737B107E1F7A8D1EBC1D1CF4F93DC -:100060005F9344E1509160005A95F1F74A95D1F7BA -:100070008A95B9F79A95AAF75F914F9108954F9392 -:10008000409161004A95F1F78A95D1F79A95C2F7A8 -:100090004F9108951F93BA9AC2988CEC91E0EFDFCC -:1000A000BA98C29A8EE190E0EADF16B38DEB91E048 -:1000B000E6DF169516951095812F81701F91089592 -:1000C000BA9AC2980895BA98C29A089586B390E0F1 -:1000D0009695879596958795817008950F931F93B0 -:1000E000F894BA9AC29883E090E0C9DFBA98C29AAD -:1000F00083E090E0C4DF06B3789488E290E0BFDF4D -:1001000010E01695079516950795802F81701F9121 -:100110000F9108951F93182FF894BA9AC29886E009 -:1001200090E0ADDF10FF03C0BA98C29A02C0BA9A3D -:10013000C2988EE190E0A3DFBA98C29A83E090E083 -:100140009EDF78941F9108951F93CF93DF9310E063 -:10015000C0E0D0E0C3DF90E00C2E02C0880F991FF2 -:100160000A94E2F7182B2196C830D10599F7812F10 -:10017000DF91CF911F9108950F931F93CF93DF933A -:10018000C0E0D0E0082F10E0C8010C2E02C0959509 -:1001900087950A94E2F7BEDF2196C830D105A1F712 -:1001A000DF91CF911F910F910895682790E02CE87F -:1001B000862F869560FF03C0682F622701C0682FD5 -:1001C0009F5F9830A9F7862F0895EF92FF921F93B3 -:1001D000CF93DF937C0110E0C0E0D0E0B5DF682F63 -:1001E000F701EC0FFD1F8083812FDFDF182F219691 -:1001F000C930D10599F7DF91CF911F91FF90EF9012 -:1002000008951F93DF93CF93CDB7DEB729970FB62D -:10021000F894DEBF0FBECDBF3DDF182F8CECACDFF6 -:1002200084E4AADF37DF8CECA7DF8EEBA5DFCE01FD -:100230000196CBDF99814A81112349F0882339F453 -:10024000292F30E0942F80E0282B392B02C02FEF8C -:100250003FE5C90129960FB6F894DEBF0FBECDBFAA -:10026000CF91DF911F9108951F920F920FB60F92B9 -:1002700011242F933F934F935F936F937F938F93AB -:100280009F93AF93BF93EF93FF93809172008F5F23 -:1002900080937200843010F0109272008FEF82BB56 -:1002A00020917200E22FF0E080E290E0022E02C086 -:1002B000959587950A94E2F785BB8091750090919A -:1002C00076008F5F9F4519F4E359FF4F5AC02130E4 -:1002D00039F1213030F0223079F1233009F054C067 -:1002E00039C0809175009091760097FF0DC0809184 -:1002F000750090917600909581959F4F9093740032 -:10030000809373008FE73FC08091750090917600D5 -:1003100060E170E067D0709374006093730034C044 -:1003200080917300909174006AE070E05BD0662366 -:1003300059F1E62FF0E023C0809173009091740092 -:100340006AE070E04FD0FC01EE59FF4F808180954C -:100350008F7D19C0809175009091760060E170E00A -:1003600041D021E732E0AC01429FC001439F900D94 -:10037000529F900D112468EE73E034D0FB01EE59CA -:10038000FF4F8081809582BBFF91EF91BF91AF912C -:100390009F918F917F916F915F914F913F912F919D -:1003A0000F900FBE0F901F9018958FEF81BB8FE3BA -:1003B00084BB8EB581608EBD8EB582608EBD8EB5DC -:1003C00088608EBD81E08BBD89E38ABD89B780617D -:1003D00089BF8FB780688FBF14DF909376008093BA -:1003E0007500FACF97FB092E07260AD077FD04D0B7 -:1003F0000CD006D000201AF4709561957F4F0895B7 -:10040000F6F7909581959F4F0895AA1BBB1B51E16C -:1004100007C0AA1FBB1FA617B70710F0A61BB70B74 -:10042000881F991F5A95A9F780959095BC01CD0119 -:060430000895F894FFCFCF -:1004360085025F419DD5C3D6DE45DFC780009E8815 -:0204460088002C -:00000001FF diff --git a/SW/teplomer2_003/teplomer2_003.c b/SW/teplomer2_003/teplomer2_003.c deleted file mode 100644 index 0e63a37994bec1c31ddc66eece2d6dcc15057d47..0000000000000000000000000000000000000000 --- a/SW/teplomer2_003/teplomer2_003.c +++ /dev/null @@ -1,123 +0,0 @@ -#define F_CPU 8000000 //8MHz - -#include <avr/io.h> -#include <avr/interrupt.h> - -#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); - } -} \ No newline at end of file diff --git a/SW/teplomer2_003/wait.c b/SW/teplomer2_003/wait.c deleted file mode 100644 index 5a4b3ff09d277e12765380da7006f8e206289467..0000000000000000000000000000000000000000 --- a/SW/teplomer2_003/wait.c +++ /dev/null @@ -1,70 +0,0 @@ -/*--------------------------------------------------------------------------- - -soubor: wait.c -verze: 1.0 -datum: 9.1.2012 -popis: - -Cekaci rutiny a makra pro bitove operace -Cekaci rutiny jsou mnohem uspornejsi nez bezne "delay.h" - -Tento soubor vynikl ze souboru "mojelib.h" jehoz autora bohuzel neznam. - ----------------------------------------------------------------------------*/ - - -// Zmena bitu portu, IO registru nebo promenne: -#define setb(bajt,bit) bajt |= 1<<(bit) //nastav bit -#define clrb(bajt,bit) bajt &= ~(1<<(bit)) //nuluj bit -#define negb(bajt,bit) bajt ^= 1<<(bit) //neguj bit - -// Casove smycky: -void wait_ms (unsigned int c); // cekej milisekund(max65553): -void wait_us (unsigned int c); // cekej mikrosekund(max65553): - - -//cekej milisekund: -unsigned char reg21 = F_CPU / 60000; // F_CPU = frekv. oscilatoru [Hz], - // (vnitrni konstanta prekladace) -void wait_ms (unsigned int c) -{ - asm("push r20"); - asm("push r21"); -asm("_Wms0:"); - asm("ldi r20,0x14"); -asm("_Wms1:"); - asm("lds r21,reg21"); -asm("_Wms2:"); - asm("dec r21"); - asm("brne _Wms2"); - asm("dec r20"); - asm("brne _Wms1"); - asm("dec r24"); - asm("brne _Wms0"); - asm("dec r25"); - asm("brpl _Wms0"); - asm("pop r21"); - asm("pop r20"); -} - - -//cekej mikrosekund: -unsigned char reg20 = F_CPU / 6000000 + 1; -void wait_us(unsigned int c) -{ - asm("push r20"); -asm("_wus0:"); - asm("lds r20,reg20"); // 1-6MHz: r20=1 6-12MHz: r20=2 -asm("_wus1:"); - asm("dec r20"); - asm("brne _wus1"); - asm("dec r24"); - asm("brne _wus0"); - asm("dec r25"); - asm("brpl _wus0"); - asm("pop r20"); -} - -//eof -//(c) OK1ZKV 2012 -