]> jspc29.x-matter.uni-frankfurt.de Git - avr.git/commitdiff
added old 1wire project
authorJan Michel <j.michel@gsi.de>
Mon, 5 Jan 2015 11:31:30 +0000 (12:31 +0100)
committerJan Michel <j.michel@gsi.de>
Mon, 5 Jan 2015 11:31:30 +0000 (12:31 +0100)
17 files changed:
1wire/1wire.c [new file with mode: 0644]
1wire/1wire.h [new file with mode: 0644]
1wire/Makefile [new file with mode: 0644]
1wire/adc.c [new file with mode: 0644]
1wire/adc.h [new file with mode: 0644]
1wire/delay.c [new file with mode: 0644]
1wire/delay.h [new file with mode: 0644]
1wire/ds1820.aps [new file with mode: 0644]
1wire/ds1820.aws [new file with mode: 0644]
1wire/main.c [new file with mode: 0644]
1wire/main.h [new file with mode: 0644]
1wire/tempmeas.c [new file with mode: 0644]
1wire/tempmeas.h [new file with mode: 0644]
1wire/timebase.c [new file with mode: 0644]
1wire/timebase.h [new file with mode: 0644]
1wire/uart.c [new file with mode: 0644]
1wire/uart.h [new file with mode: 0644]

diff --git a/1wire/1wire.c b/1wire/1wire.c
new file mode 100644 (file)
index 0000000..29892b3
--- /dev/null
@@ -0,0 +1,128 @@
+/************************************************************************/\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
diff --git a/1wire/1wire.h b/1wire/1wire.h
new file mode 100644 (file)
index 0000000..53d4e5c
--- /dev/null
@@ -0,0 +1,27 @@
+#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
diff --git a/1wire/Makefile b/1wire/Makefile
new file mode 100644 (file)
index 0000000..f9ce0cd
--- /dev/null
@@ -0,0 +1,93 @@
+###############################################################################\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
diff --git a/1wire/adc.c b/1wire/adc.c
new file mode 100644 (file)
index 0000000..6357cd7
--- /dev/null
@@ -0,0 +1,13 @@
+#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
diff --git a/1wire/adc.h b/1wire/adc.h
new file mode 100644 (file)
index 0000000..ea42840
--- /dev/null
@@ -0,0 +1,13 @@
+#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
diff --git a/1wire/delay.c b/1wire/delay.c
new file mode 100644 (file)
index 0000000..b5967e9
--- /dev/null
@@ -0,0 +1,14 @@
+#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
diff --git a/1wire/delay.h b/1wire/delay.h
new file mode 100644 (file)
index 0000000..071427c
--- /dev/null
@@ -0,0 +1,11 @@
+#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
diff --git a/1wire/ds1820.aps b/1wire/ds1820.aps
new file mode 100644 (file)
index 0000000..5198cd9
--- /dev/null
@@ -0,0 +1 @@
+<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
diff --git a/1wire/ds1820.aws b/1wire/ds1820.aws
new file mode 100644 (file)
index 0000000..73153a6
--- /dev/null
@@ -0,0 +1 @@
+<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
diff --git a/1wire/main.c b/1wire/main.c
new file mode 100644 (file)
index 0000000..783cf0a
--- /dev/null
@@ -0,0 +1,76 @@
+#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
diff --git a/1wire/main.h b/1wire/main.h
new file mode 100644 (file)
index 0000000..1e070cf
--- /dev/null
@@ -0,0 +1,44 @@
+/************************************************************************/\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
diff --git a/1wire/tempmeas.c b/1wire/tempmeas.c
new file mode 100644 (file)
index 0000000..5c126e1
--- /dev/null
@@ -0,0 +1,113 @@
+#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
diff --git a/1wire/tempmeas.h b/1wire/tempmeas.h
new file mode 100644 (file)
index 0000000..8fff15f
--- /dev/null
@@ -0,0 +1,5 @@
+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
diff --git a/1wire/timebase.c b/1wire/timebase.c
new file mode 100644 (file)
index 0000000..4ecb593
--- /dev/null
@@ -0,0 +1,50 @@
+\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
diff --git a/1wire/timebase.h b/1wire/timebase.h
new file mode 100644 (file)
index 0000000..8a43f13
--- /dev/null
@@ -0,0 +1,8 @@
+#ifndef _timebase_h_\r
+#define _timebase_h_\r
+\r
+extern uchar volatile second;\r
+\r
+void init_timer( void );\r
+\r
+#endif\r
diff --git a/1wire/uart.c b/1wire/uart.c
new file mode 100644 (file)
index 0000000..ac0f42f
--- /dev/null
@@ -0,0 +1,45 @@
+#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
diff --git a/1wire/uart.h b/1wire/uart.h
new file mode 100644 (file)
index 0000000..e061996
--- /dev/null
@@ -0,0 +1,12 @@
+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