--- /dev/null
+/************************************************************************/\r
+/* */\r
+/* Access Dallas 1-Wire Devices */\r
+/* */\r
+/* Author: Peter Dannegger */\r
+/* danni@specs.de */\r
+/* */\r
+/************************************************************************/\r
+#include "main.h"\r
+\r
+\r
+#ifndef W1_PIN\r
+#define W1_PIN PD6\r
+#define W1_IN PIND\r
+#define W1_OUT PORTD\r
+#define W1_DDR DDRD\r
+#endif\r
+\r
+\r
+bit w1_reset(void)\r
+{\r
+ bit err;\r
+\r
+ W1_OUT &= ~(1<<W1_PIN);\r
+ W1_DDR |= 1<<W1_PIN;\r
+ DELAY( DELAY_US( 550 )); // 480 us\r
+ cli();\r
+ W1_DDR &= ~(1<<W1_PIN);\r
+ DELAY( DELAY_US( 100 ));\r
+ err = W1_IN & (1<<W1_PIN); // no presence detect\r
+ sei();\r
+ DELAY( DELAY_US( 480 ));\r
+ if( (W1_IN & (1<<W1_PIN)) == 0 ) // short circuit\r
+ err = 1;\r
+ return err;\r
+}\r
+\r
+\r
+uchar w1_bit_io( bit b )\r
+{\r
+ cli();\r
+ W1_DDR |= 1<<W1_PIN;\r
+ DELAY( DELAY_US( 1.5 ));\r
+ if( b )\r
+ W1_DDR &= ~(1<<W1_PIN);\r
+ DELAY( DELAY_US( 15 - 5 ));\r
+ if( (W1_IN & (1<<W1_PIN)) == 0 )\r
+ b = 0;\r
+ DELAY( DELAY_US( 60 - 0 ));\r
+ W1_DDR &= ~(1<<W1_PIN);\r
+ sei();\r
+ return b;\r
+}\r
+\r
+\r
+uint w1_byte_wr( char b )\r
+{\r
+ char i = 8, j;\r
+ do{\r
+ j = w1_bit_io( b & 1 );\r
+ b >>= 1;\r
+ if( j )\r
+ b |= 0x80;\r
+ }while( --i );\r
+ return b;\r
+}\r
+\r
+\r
+uint w1_byte_rd( void )\r
+{\r
+ return w1_byte_wr( 0xFF );\r
+}\r
+\r
+\r
+uchar w1_rom_search( char diff, char idata *id )\r
+{\r
+ char i, j, next_diff;\r
+ bit b;\r
+\r
+ if( w1_reset() )\r
+ return PRESENCE_ERR; // error, no device found\r
+ w1_byte_wr( SEARCH_ROM ); // ROM search command\r
+ next_diff = LAST_DEVICE; // unchanged on last device\r
+ i = 8 * 8; // 8 bytes\r
+ do{\r
+ j = 8; // 8 bits\r
+ do{\r
+ b = w1_bit_io( 1 ); // read bit\r
+ if( w1_bit_io( 1 ) ){ // read complement bit\r
+ if( b ) // 11\r
+ return DATA_ERR; // data error\r
+ }else{\r
+ if( !b ){ // 00 = 2 devices\r
+ if( diff > i ||\r
+ ((*id & 1) && diff != i) ){\r
+ b = 1; // now 1\r
+ next_diff = i; // next pass 0\r
+ }\r
+ }\r
+ }\r
+ w1_bit_io( b ); // write bit\r
+ *id >>= 1;\r
+ if( b ) // store bit\r
+ *id |= 0x80;\r
+ i--;\r
+ }while( --j );\r
+ id++; // next byte\r
+ }while( i );\r
+ return next_diff; // to continue search\r
+}\r
+\r
+\r
+void w1_command( char command, char idata *id )\r
+{\r
+ char i;\r
+ w1_reset();\r
+ if( id ){\r
+ w1_byte_wr( MATCH_ROM ); // to a single device\r
+ i = 8;\r
+ do{\r
+ w1_byte_wr( *id );\r
+ id++;\r
+ }while( --i );\r
+ }else{\r
+ w1_byte_wr( SKIP_ROM ); // to all devices\r
+ }\r
+ w1_byte_wr( command );\r
+}\r
--- /dev/null
+#ifndef _1wire_h_\r
+#define _1wire_h_\r
+#define MATCH_ROM 0x55\r
+#define SKIP_ROM 0xCC\r
+#define SEARCH_ROM 0xF0\r
+\r
+#define CONVERT_T 0x44 // DS1820 commands\r
+#define READ 0xBE\r
+#define WRITE 0x4E\r
+#define EE_WRITE 0x48\r
+#define EE_RECALL 0xB8\r
+\r
+#define SEARCH_FIRST 0xFF // start new search\r
+#define PRESENCE_ERR 0xFF\r
+#define DATA_ERR 0xFE\r
+#define LAST_DEVICE 0x00 // last device found\r
+// 0x01 ... 0x40: continue searching\r
+\r
+bit w1_reset(void);\r
+\r
+uint w1_byte_wr( char b );\r
+uint w1_byte_rd( void );\r
+\r
+uchar w1_rom_search( char diff, char idata *id );\r
+\r
+void w1_command( char command, char idata *id );\r
+#endif\r
--- /dev/null
+###############################################################################\r
+# Makefile for the project ds1820\r
+###############################################################################\r
+\r
+## General Flags\r
+PROJECT = ds1820\r
+MCU = atmega8\r
+TARGET = ds1820.elf\r
+CC = avr-gcc\r
+\r
+## Options common to compile, link and assembly rules\r
+COMMON = -mmcu=$(MCU)\r
+\r
+## Compile options common for all C compilation units.\r
+CFLAGS = $(COMMON)\r
+CFLAGS += -Wall -gdwarf-2 -DF_CPU=3686400UL -O1 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums\r
+CFLAGS += -MD -MP -MT $(*F).o -MF dep/$(@F).d \r
+\r
+## Assembly specific flags\r
+ASMFLAGS = $(COMMON)\r
+ASMFLAGS += $(CFLAGS)\r
+ASMFLAGS += -x assembler-with-cpp -Wa,-gdwarf2\r
+\r
+## Linker flags\r
+LDFLAGS = $(COMMON)\r
+LDFLAGS += -Wl,-Map=ds1820.map\r
+\r
+\r
+## Intel Hex file production flags\r
+HEX_FLASH_FLAGS = -R .eeprom -R .fuse -R .lock -R .signature\r
+\r
+HEX_EEPROM_FLAGS = -j .eeprom\r
+HEX_EEPROM_FLAGS += --set-section-flags=.eeprom="alloc,load"\r
+HEX_EEPROM_FLAGS += --change-section-lma .eeprom=0 --no-change-warnings\r
+\r
+\r
+## Objects that must be built in order to link\r
+OBJECTS = delay.o main.o tempmeas.o timebase.o uart.o 1wire.o adc.o \r
+\r
+## Objects explicitly added by the user\r
+LINKONLYOBJECTS = \r
+\r
+## Build\r
+all: $(TARGET) ds1820.hex ds1820.eep ds1820.lss size\r
+\r
+## Compile\r
+DELAY.o: ../DELAY.C\r
+ $(CC) $(INCLUDES) $(CFLAGS) -c $<\r
+\r
+MAIN.o: ../MAIN.C\r
+ $(CC) $(INCLUDES) $(CFLAGS) -c $<\r
+\r
+TEMPMEAS.o: ../TEMPMEAS.C\r
+ $(CC) $(INCLUDES) $(CFLAGS) -c $<\r
+\r
+TIMEBASE.o: ../TIMEBASE.C\r
+ $(CC) $(INCLUDES) $(CFLAGS) -c $<\r
+\r
+UART.o: ../UART.C\r
+ $(CC) $(INCLUDES) $(CFLAGS) -c $<\r
+\r
+1WIRE.o: ../1WIRE.C\r
+ $(CC) $(INCLUDES) $(CFLAGS) -c $<\r
+\r
+ADC.o: ../ADC.C\r
+ $(CC) $(INCLUDES) $(CFLAGS) -c $<\r
+\r
+##Link\r
+$(TARGET): $(OBJECTS)\r
+ $(CC) $(LDFLAGS) $(OBJECTS) $(LINKONLYOBJECTS) $(LIBDIRS) $(LIBS) -o $(TARGET)\r
+\r
+%.hex: $(TARGET)\r
+ avr-objcopy -O ihex $(HEX_FLASH_FLAGS) $< $@\r
+\r
+%.eep: $(TARGET)\r
+ -avr-objcopy $(HEX_EEPROM_FLAGS) -O ihex $< $@ || exit 0\r
+\r
+%.lss: $(TARGET)\r
+ avr-objdump -h -S $< > $@\r
+\r
+size: ${TARGET}\r
+ @echo\r
+ @avr-size -C --mcu=${MCU} ${TARGET}\r
+\r
+## Clean target\r
+.PHONY: clean\r
+clean:\r
+ -rm -rf $(OBJECTS) ds1820.elf dep/* ds1820.hex ds1820.eep ds1820.lss ds1820.map\r
+\r
+\r
+## Other dependencies\r
+-include $(shell mkdir dep 2>/dev/null) $(wildcard dep/*)\r
+\r
--- /dev/null
+#include "adc.h"\r
+\r
+\r
+\r
+void init_adc() {\r
+ //external AREF, right align, channel 0\r
+ ADMUX = (0 << REFS1) | (0 << REFS0) | (0 << ADLAR) | 0;\r
+\r
+ //enable ADC, start conversion, free running, no interrupt, 2^-5 prescaler\r
+ ADCSRA = (1 << ADEN) | (1 << ADSC) | (1 << ADFR) | (1 << ADIE) | (5 << ADPS0);\r
+\r
+return;\r
+}\r
--- /dev/null
+#ifndef _adc_h_\r
+#define _adc_h_\r
+\r
+#include "main.h"\r
+\r
+#define set_adc_port(x) ADMUX = (ADMUX & 0xF0) | (x & 0x0F)\r
+\r
+\r
+void init_adc();\r
+\r
+\r
+\r
+#endif\r
--- /dev/null
+#include "main.h"\r
+\r
+\r
+// Attention !!!\r
+// take care, that during delay no interrupt access a timer register\r
+// or restore TCNT1H\r
+\r
+\r
+void delay( int d ) // d = 0 ... 32000\r
+{\r
+ d += TCNT1; // not atomic !\r
+\r
+ while( (TCNT1 - d) & 0x8000 ); // not atomic !\r
+}\r
--- /dev/null
+#ifndef _delay_h_\r
+#define _delay_h_\r
+\r
+\r
+#define DELAY_US(x) ((uint)( (x) * 1e-6 * XTAL ))\r
+#define DELAY(x) delay(x)\r
+\r
+void delay( int d );\r
+\r
+\r
+#endif\r
--- /dev/null
+<AVRStudio><MANAGEMENT><ProjectName>ds1820</ProjectName><Created>21-Jul-2008 15:53:11</Created><LastEdit>16-Mai-2014 14:28:31</LastEdit><ICON>241</ICON><ProjectType>0</ProjectType><Created>21-Jul-2008 15:53:11</Created><Version>4</Version><Build>4, 14, 0, 589</Build><ProjectTypeName>AVR GCC</ProjectTypeName></MANAGEMENT><CODE_CREATION><ObjectFile>default\ds1820.elf</ObjectFile><EntryFile></EntryFile><SaveFolder>D:\ds1820\</SaveFolder></CODE_CREATION><DEBUG_TARGET><CURRENT_TARGET>AVR Simulator</CURRENT_TARGET><CURRENT_PART>ATmega8.xml</CURRENT_PART><BREAKPOINTS></BREAKPOINTS><IO_EXPAND><HIDE>false</HIDE></IO_EXPAND><REGISTERNAMES><Register>R00</Register><Register>R01</Register><Register>R02</Register><Register>R03</Register><Register>R04</Register><Register>R05</Register><Register>R06</Register><Register>R07</Register><Register>R08</Register><Register>R09</Register><Register>R10</Register><Register>R11</Register><Register>R12</Register><Register>R13</Register><Register>R14</Register><Register>R15</Register><Register>R16</Register><Register>R17</Register><Register>R18</Register><Register>R19</Register><Register>R20</Register><Register>R21</Register><Register>R22</Register><Register>R23</Register><Register>R24</Register><Register>R25</Register><Register>R26</Register><Register>R27</Register><Register>R28</Register><Register>R29</Register><Register>R30</Register><Register>R31</Register></REGISTERNAMES><COM>Auto</COM><COMType>0</COMType><WATCHNUM>0</WATCHNUM><WATCHNAMES><Pane0></Pane0><Pane1></Pane1><Pane2></Pane2><Pane3></Pane3></WATCHNAMES><BreakOnTrcaeFull>0</BreakOnTrcaeFull></DEBUG_TARGET><Debugger><modules><module></module></modules><Triggers></Triggers></Debugger><AVRGCCPLUGIN><FILES><SOURCEFILE>DELAY.C</SOURCEFILE><SOURCEFILE>MAIN.C</SOURCEFILE><SOURCEFILE>TEMPMEAS.C</SOURCEFILE><SOURCEFILE>TIMEBASE.C</SOURCEFILE><SOURCEFILE>UART.C</SOURCEFILE><SOURCEFILE>1WIRE.C</SOURCEFILE><SOURCEFILE>ADC.C</SOURCEFILE><HEADERFILE>DELAY.H</HEADERFILE><HEADERFILE>MAIN.H</HEADERFILE><HEADERFILE>TEMPMEAS.H</HEADERFILE><HEADERFILE>TIMEBASE.H</HEADERFILE><HEADERFILE>UART.H</HEADERFILE><HEADERFILE>1WIRE.H</HEADERFILE><HEADERFILE>ADC.H</HEADERFILE><OTHERFILE>default\ds1820.lss</OTHERFILE><OTHERFILE>default\ds1820.map</OTHERFILE></FILES><CONFIGS><CONFIG><NAME>default</NAME><USESEXTERNALMAKEFILE>NO</USESEXTERNALMAKEFILE><EXTERNALMAKEFILE></EXTERNALMAKEFILE><PART>atmega8</PART><HEX>1</HEX><LIST>1</LIST><MAP>1</MAP><OUTPUTFILENAME>ds1820.elf</OUTPUTFILENAME><OUTPUTDIR>default\</OUTPUTDIR><ISDIRTY>0</ISDIRTY><OPTIONS><OPTION><FILE>1WIRE.C</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>DELAY.C</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>MAIN.C</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>TEMPMEAS.C</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>TIMEBASE.C</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>UART.C</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>main.c</FILE><OPTIONLIST></OPTIONLIST></OPTION></OPTIONS><INCDIRS/><LIBDIRS/><LIBS/><LINKOBJECTS/><OPTIONSFORALL>-Wall -gdwarf-2 -DF_CPU=4000000UL -O1 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums</OPTIONSFORALL><LINKEROPTIONS></LINKEROPTIONS><SEGMENTS/></CONFIG></CONFIGS><LASTCONFIG>default</LASTCONFIG><USES_WINAVR>1</USES_WINAVR><GCC_LOC>C:\Programme\WinAVR-20081205\bin\avr-gcc.exe</GCC_LOC><MAKE_LOC>C:\Programme\WinAVR-20081205\utils\bin\make.exe</MAKE_LOC></AVRGCCPLUGIN><ProjectFiles><Files><Name>D:\ds1820\DELAY.H</Name><Name>D:\ds1820\MAIN.H</Name><Name>D:\ds1820\TEMPMEAS.H</Name><Name>D:\ds1820\TIMEBASE.H</Name><Name>D:\ds1820\UART.H</Name><Name>D:\ds1820\1WIRE.H</Name><Name>D:\ds1820\ADC.H</Name><Name>D:\ds1820\DELAY.C</Name><Name>D:\ds1820\MAIN.C</Name><Name>D:\ds1820\TEMPMEAS.C</Name><Name>D:\ds1820\TIMEBASE.C</Name><Name>D:\ds1820\UART.C</Name><Name>D:\ds1820\1WIRE.C</Name><Name>D:\ds1820\ADC.C</Name></Files></ProjectFiles><IOView><usergroups/><sort sorted="0" column="0" ordername="0" orderaddress="0" ordergroup="0"/></IOView><Files><File00000><FileId>00000</FileId><FileName>main.c</FileName><Status>1</Status></File00000><File00001><FileId>00001</FileId><FileName>1wire.c</FileName><Status>1</Status></File00001><File00002><FileId>00002</FileId><FileName>tempmeas.c</FileName><Status>1</Status></File00002><File00003><FileId>00003</FileId><FileName>uart.c</FileName><Status>1</Status></File00003><File00004><FileId>00004</FileId><FileName>main.h</FileName><Status>1</Status></File00004><File00005><FileId>00005</FileId><FileName>TIMEBASE.C</FileName><Status>1</Status></File00005><File00006><FileId>00006</FileId><FileName>adc.c</FileName><Status>1</Status></File00006><File00007><FileId>00007</FileId><FileName>delay.c</FileName><Status>1</Status></File00007></Files><Events><Bookmarks></Bookmarks></Events><Trace><Filters></Filters></Trace></AVRStudio>\r
--- /dev/null
+<AVRWorkspace><IOSettings><CurrentRegisters/></IOSettings><part name="ATMEGA8"/><Files><File00000 Name="D:\ds1820\main.c" Position="204 94 934 335" LineCol="53 0"/><File00001 Name="D:\ds1820\1wire.c" Position="223 113 943 325" LineCol="83 0"/><File00002 Name="D:\ds1820\tempmeas.c" Position="242 132 962 344" LineCol="0 0"/><File00003 Name="D:\ds1820\uart.c" Position="261 151 981 363" LineCol="18 0"/><File00004 Name="D:\ds1820\main.h" Position="280 170 1000 382" LineCol="7 0"/><File00005 Name="D:\ds1820\TIMEBASE.C" Position="299 189 1019 401" LineCol="15 0"/><File00006 Name="D:\ds1820\adc.c" Position="204 94 924 306" LineCol="0 0"/><File00007 Name="D:\ds1820\delay.c" Position="223 113 943 325" LineCol="0 0"/></Files></AVRWorkspace>\r
--- /dev/null
+#include "main.h"\r
+\r
+uint16_t adc_values[6];\r
+uint32_t temp_values[6];\r
+uint8_t led;\r
+uint8_t count_convs = 0;\r
+\r
+ISR(ADC_vect) {\r
+ uint8_t tmp = ADMUX & 0x07;\r
+ if (count_convs == 1){\r
+ //if(tmp >= 1)\r
+ adc_values[(tmp)] = ADC;\r
+ //else\r
+ // adc_values[(NUM_ADC_CHANNELS-1)] = ADC;\r
+ tmp = (tmp + 1) %NUM_ADC_CHANNELS;\r
+ set_adc_port(tmp);\r
+ }\r
+ count_convs = 1-count_convs;\r
+ }\r
+\r
+\r
+int main( void )\r
+{\r
+ uint8_t i;\r
+\r
+ DDRB = 0xF;\r
+ char s[30];\r
+ init_timer();\r
+ uinit();\r
+ init_adc();\r
+ sei();\r
+ uputsnl( "1-Wire-Reader:" );\r
+ second = 0;\r
+\r
+ for(;;){ // main loop\r
+ if(uart_rx_flag) {\r
+ switch(uart_rx_buffer[0]) {\r
+ case 'y': led ^= 2; uart_rx_counter = 0; break;\r
+ case 'r': led ^= 1; uart_rx_counter = 0; break;\r
+ case 'g': led ^= 4; uart_rx_counter = 0; break;\r
+ case 'd':\r
+ if(uart_rx_counter == 4) {\r
+ OCR2 = ((uart_rx_buffer[1]-'0')*100+(uart_rx_buffer[2]-'0')*10+(uart_rx_buffer[3]-'0'));\r
+ uart_rx_counter = 0;\r
+ }\r
+ break;\r
+ }\r
+\r
+ PORTB = (PORTB & ~0x7) | (led & 0x7);\r
+ uart_rx_flag = 0;\r
+ }\r
+\r
+ if( second %3 == 0 ){\r
+ start_meas();\r
+ second++;\r
+ }\r
+ if( second %3 == 2 ){\r
+ read_meas();\r
+ uputs("ADC: ");\r
+ for(i=0;i<NUM_ADC_CHANNELS;i++) {\r
+ sprintf(s," %10u ",adc_values[i]); \r
+ uputs(s);\r
+ }\r
+ uputsnl(" ");\r
+ uputs("TEMP: ");\r
+ for(i=0;i<NUM_ADC_CHANNELS;i++) {\r
+ temp_values[i] = make_temp_pt100(adc_values[i],i);\r
+ sprintf(s," %10lu ",temp_values[i]); \r
+ uputs(s);\r
+ }\r
+ uputsnl(" ");\r
+ uputsnl(" ");\r
+ second++;\r
+ }\r
+ }\r
+ }\r
--- /dev/null
+/************************************************************************/\r
+/* */\r
+/* 1-Wire Example */\r
+/* */\r
+/* Author: Peter Dannegger */\r
+/* danni@specs.de */\r
+/* */\r
+/************************************************************************/\r
+#ifndef _main_h_\r
+#define _main_h_\r
+#include <avr/io.h>\r
+#include <avr/interrupt.h>\r
+//#include <avr/signal.h>\r
+#include <stdlib.h>\r
+#include <stdio.h>\r
+\r
+//#define XTAL 11059200L\r
+#define XTAL F_CPU\r
+\r
+#define BAUD 19200\r
+#define bauddivider (uint)(1.0 * XTAL / BAUD / 16 - 0.5)\r
+\r
+#define NUM_ADC_CHANNELS 6\r
+\r
+#define uchar unsigned char\r
+#define uint unsigned int\r
+#define bit uchar\r
+#define idata\r
+#define code\r
+\r
+\r
+#define W1_PIN PD5\r
+#define W1_IN PIND\r
+#define W1_OUT PORTD\r
+#define W1_DDR DDRD\r
+\r
+#include "1wire.h"\r
+#include "delay.h"\r
+#include "tempmeas.h"\r
+#include "timebase.h"\r
+#include "uart.h"\r
+#include "adc.h"\r
+\r
+#endif\r
--- /dev/null
+#include "main.h"\r
+\r
+\r
+void start_meas( void ){\r
+ if( W1_IN & 1<< W1_PIN ){\r
+ w1_command( CONVERT_T, NULL );\r
+ W1_OUT |= 1<< W1_PIN;\r
+ W1_DDR |= 1<< W1_PIN; // parasite power on\r
+\r
+ }else{\r
+ //uputsnl( "Short Circuit !" );\r
+ }\r
+}\r
+\r
+\r
+void read_meas( void )\r
+{\r
+ char id[8], diff;\r
+ char s[30];\r
+ uchar i;\r
+ uint temp;\r
+\r
+ for( diff = SEARCH_FIRST; diff != LAST_DEVICE; ){\r
+ diff = w1_rom_search( diff, id );\r
+\r
+ if( diff == PRESENCE_ERR ){\r
+ uputsnl( "No 1-wire Sensor found" );\r
+ break;\r
+ }\r
+ if( diff == DATA_ERR ){\r
+ uputsnl( "1-wire Bus Error" );\r
+ break;\r
+ }\r
+ if( id[0] == 0x28 || id[0] == 0x10 ){ // temperature sensor\r
+ uputs( "ID: " );\r
+ for( i = 0; i < 8; i++ ){\r
+ sprintf( s, "%02X ", id[i] );\r
+ uputs( s );\r
+ }\r
+ w1_byte_wr( READ ); // read command\r
+ temp = w1_byte_rd(); // low byte\r
+ temp |= (uint)w1_byte_rd() << 8; // high byte\r
+ if( id[0] == 0x10 ) // 9 -> 12 bit\r
+ temp <<= 3;\r
+ sprintf( s, " T: %04X", temp ); // hex value\r
+ uputs( s );\r
+ if ((int)temp >= 0) {\r
+ sprintf( s, " = %4d.%01d �C", ((int)temp) / 16, (temp * 4096) / 6553 ); // 0.1�C\r
+ }\r
+ else {\r
+ temp = - temp;\r
+ sprintf( s, " = -%d.%01d �C", ((int)temp) / 16, (temp * 4096) / 6553 ); // 0.1�C\r
+ }\r
+ \r
+ uputsnl( s );\r
+ }\r
+ }\r
+ //uputsnl( "" );\r
+}\r
+\r
+//Coefficients for each amplifier for R *1000*512 = a * ADC + b\r
+const uint32_t a_coeff[6] = {65997L,65997L,65997L,65997L,65997L,65997L};\r
+const uint32_t b_coeff[6] = {7772160L,7772160L,7772160L,7772160L,7772160L,7772160L};\r
+const uint32_t pt100_coeff = 5447L; // (1/385)*2^21\r
+const uint32_t pt100_neg_coeff[4] = {242L, 73L, 1677L, 299L};\r
+const uint8_t pt100_neg_shifts[4] = {0,10,20,19}; //absolute shift\r
+const uint8_t pt100_neg_shift_adjust[4] = {0,10,10,12}; //shift before multiplying\r
+\r
+\r
+const int8_t pt100_offset[4] = {0,-4,3,0};\r
+const uint8_t pt100_gain = 32;\r
+\r
+unsigned long int get_pt100_resistance_simple(uint16_t adc, uint8_t channel) {\r
+ uint32_t temp;\r
+ temp = (uint32_t)(adc+pt100_offset[channel])*5200 / pt100_gain;\r
+ return temp;\r
+ }\r
+\r
+\r
+unsigned long int make_temp_pt100(uint16_t adc, uint8_t channel){\r
+ uint32_t temp;\r
+ uint32_t m,n,o;\r
+ uint32_t erg;\r
+ //resistance is for each channel\r
+ //temp = (uint32_t)adc * a_coeff[channel] + b_coeff[channel];\r
+ temp = get_pt100_resistance_simple(adc,channel);\r
+ //temp >>= 9;\r
+ //this is the resistance in Milliohm, now get temperature in dezikelvin\r
+ if(temp >= 100000L) { //linear case above 0�C\r
+ temp = (temp-100000L)* pt100_coeff * 10L;\r
+ temp >>= 21L;\r
+ }\r
+ else {\r
+ temp >>= 5;\r
+ erg = (0-pt100_neg_coeff[0])*10; //absolute term\r
+ m = pt100_neg_coeff[1] * temp*10; //linear term\r
+ n = pt100_neg_coeff[2] * temp; //quadratic term\r
+ o = pt100_neg_coeff[3] * temp; //cubic term\r
+ m >>= pt100_neg_shift_adjust[1];\r
+ n >>= pt100_neg_shift_adjust[2];\r
+ o >>= pt100_neg_shift_adjust[3];//adjust size by /1024\r
+ n = n*n*10; o=o*o*o*10; //square and cube terms\r
+ n >>= (pt100_neg_shifts[2]-pt100_neg_shift_adjust[2])*2; //do last shifts\r
+ o >>= (pt100_neg_shifts[3]-pt100_neg_shift_adjust[3])*3;\r
+ erg = erg + m + n - o; //add everything\r
+ temp = erg;\r
+ }\r
+ temp += 2732; //change to kelvin\r
+ return temp;\r
+ }\r
+\r
+\r
+\r
--- /dev/null
+void start_meas( void );\r
+void read_meas( void );\r
+\r
+\r
+unsigned long int make_temp_pt100(uint16_t adc, uint8_t channel);
\ No newline at end of file
--- /dev/null
+\r
+/************************************************************************/\r
+/* */\r
+/* Precise 1 Second Timebase */\r
+/* */\r
+/* Author: Peter Dannegger */\r
+/* danni@specs.de */\r
+/* */\r
+/************************************************************************/\r
+#include "main.h"\r
+\r
+\r
+#define DEBOUNCE 256L // debounce clock (256Hz = 4msec)\r
+\r
+\r
+uchar prescaler;\r
+uchar volatile second; // count seconds\r
+\r
+\r
+SIGNAL (SIG_OUTPUT_COMPARE1A)\r
+{\r
+ uchar tcnt1h = TCNT1H;\r
+\r
+ OCR1A += XTAL / DEBOUNCE; // new compare value\r
+\r
+ if( ++prescaler == (uchar)DEBOUNCE ){\r
+ prescaler = 0;\r
+ second++; // exact one second over\r
+#if XTAL % DEBOUNCE // handle remainder\r
+ OCR1A += XTAL % DEBOUNCE; // compare once per second\r
+#endif\r
+ }\r
+ TCNT1H = tcnt1h; // restore for delay() !\r
+}\r
+\r
+\r
+void init_timer( void )\r
+{\r
+ TCCR1B = (1<<CS10); // divide by 1\r
+ OCR1A = 0;\r
+ TCNT1 = -1;\r
+ second = 0;\r
+ prescaler = 0;\r
+\r
+ TIMSK = 1<<OCIE1A;\r
+\r
+ //PWM, output on PB3, prescaler 1\r
+ // TCCR2 = (0 << FOC2) | (1 << WGM21) | (1 << WGM20) | (1 << COM21) | (0 << COM20) | (1<<CS21) | (1 << CS20) ; \r
+ // OCR2 = 127;\r
+}\r
--- /dev/null
+#ifndef _timebase_h_\r
+#define _timebase_h_\r
+\r
+extern uchar volatile second;\r
+\r
+void init_timer( void );\r
+\r
+#endif\r
--- /dev/null
+#include "main.h"\r
+\r
+volatile char uart_rx_buffer[UART_BUFFER_SIZE];\r
+volatile uint8_t uart_rx_counter;\r
+volatile uint8_t uart_rx_flag;\r
+\r
+\r
+ISR(USART_RXC_vect) {\r
+ uart_rx_buffer[uart_rx_counter] = UDR;\r
+ uart_rx_counter++;\r
+ uart_rx_counter %= UART_BUFFER_SIZE;\r
+ uart_rx_flag = 1;\r
+ }\r
+\r
+void uinit( void )\r
+{\r
+ UBRRL = bauddivider; //set baud rate\r
+ UBRRH = bauddivider >> 8;\r
+ UCSRA = 0; //no U2X, MPCM\r
+ UCSRC = 1<<URSEL^1<<UCSZ1^1<<UCSZ0; //8 Bit\r
+ //enable RX, TX, \r
+ UCSRB = (1<<RXCIE)|(0<<TXCIE)|(0<<UDRIE)|(1<<RXEN)|(1<<TXEN); \r
+}\r
+\r
+\r
+void uputchar( char c )\r
+{\r
+ while( (UCSRA & 1<<UDRE) == 0 );\r
+ UDR = c;\r
+}\r
+\r
+\r
+void uputs( char *s )\r
+{\r
+ while( *s )\r
+ uputchar( *s++ );\r
+}\r
+\r
+\r
+void uputsnl( char *s )\r
+{\r
+ uputs( s );\r
+ uputchar('\r');\r
+ uputchar('\n');\r
+}\r
--- /dev/null
+void uinit( void );\r
+void uputchar( char c );\r
+void uputs( char *s );\r
+void uputsnl( char *s );\r
+\r
+\r
+#define UART_BUFFER_SIZE 10\r
+\r
+extern volatile char uart_rx_buffer[10];\r
+extern volatile uint8_t uart_rx_counter;\r
+extern volatile uint8_t uart_rx_flag;\r
+\r