Jelajahi Sumber

First version for test.

Vladimir Shilov 6 tahun lalu
induk
melakukan
982d233dbd
15 mengubah file dengan 995 tambahan dan 108 penghapusan
  1. 1 0
      .gitignore
  2. 438 0
      MNC-IN12.cbp
  3. 8 0
      ReadMe.txt
  4. 97 0
      inc/ds3231.h
  5. 16 16
      inc/event-system.h
  6. 15 6
      inc/i2c.h
  7. 2 2
      inc/list_event.h
  8. 38 6
      inc/main.h
  9. 7 7
      inc/rtos.h
  10. 131 0
      src/ds3231.c
  11. 12 13
      src/event-system.c
  12. 10 0
      src/fuse.c
  13. 99 40
      src/i2c.c
  14. 121 12
      src/main.c
  15. 0 6
      src/rtos.c

+ 1 - 0
.gitignore

@@ -1,3 +1,4 @@
+*.layout
 .dep
 build
 tmp

+ 438 - 0
MNC-IN12.cbp

@@ -0,0 +1,438 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
+<CodeBlocks_project_file>
+	<FileVersion major="1" minor="6" />
+	<Project>
+		<Option title="MNC-IN12" />
+		<Option makefile_is_custom="1" />
+		<Option pch_mode="2" />
+		<Option compiler="avr-gcc" />
+		<MakeCommands>
+			<Build command="$make -f $makefile" />
+			<CompileFile command="$make -f $makefile $file" />
+			<Clean command="$make -f $makefile clean" />
+			<DistClean command="$make -f $makefile distclean$target" />
+			<AskRebuildNeeded command="$make -q -f $makefile" />
+			<SilentBuild command="$make -f $makefile &gt; $(CMD_NULL)" />
+		</MakeCommands>
+		<Build>
+			<Target title="Debug">
+				<Option output="build/MNC-IN12.elf" prefix_auto="1" extension_auto="0" />
+				<Option working_dir="" />
+				<Option object_output="build/Debug/" />
+				<Option type="5" />
+				<Option compiler="avr-gcc" />
+				<Compiler>
+					<Add option="-mmcu=atmega8" />
+					<Add option="-Wfatal-errors" />
+					<Add option="-Wextra" />
+					<Add option="-std=c99" />
+					<Add option="-g" />
+					<Add option="-std=gnu99" />
+				</Compiler>
+			</Target>
+			<Target title="Release">
+				<Option output="build/MNC-IN12.elf" prefix_auto="1" extension_auto="0" />
+				<Option working_dir="" />
+				<Option object_output="build/Release/" />
+				<Option type="5" />
+				<Option compiler="avr-gcc" />
+				<Compiler>
+					<Add option="-mmcu=atmega8" />
+					<Add option="-fomit-frame-pointer" />
+					<Add option="-fexpensive-optimizations" />
+					<Add option="-flto" />
+					<Add option="-Os" />
+					<Add option="-Wfatal-errors" />
+				</Compiler>
+				<Linker>
+					<Add option="-flto" />
+					<Add option="-s" />
+				</Linker>
+			</Target>
+			<Environment>
+				<Variable name="MCU" value="atmega8" />
+			</Environment>
+		</Build>
+		<Compiler>
+			<Add option="-mmcu=atmega8" />
+			<Add option="-Wall" />
+			<Add option="-DF_CPU=16000000UL" />
+			<Add directory="inc" />
+		</Compiler>
+		<Linker>
+			<Add option="-mmcu=atmega8a" />
+			<Add option="-Wl,-Map=$(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).map,--cref" />
+		</Linker>
+		<ExtraCommands>
+			<Add after="avr-size --mcu=atmega8 --format=avr $(TARGET_OUTPUT_FILE)" />
+			<Add after='cmd /c &quot;avr-objdump -h -S $(TARGET_OUTPUT_FILE) &gt; $(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).lss&quot;' />
+			<Add after="avr-objcopy -R .eeprom -R .fuse -R .lock -R .signature -O ihex $(TARGET_OUTPUT_FILE) $(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).hex" />
+			<Add after="avr-objcopy --no-change-warnings -j .eeprom --change-section-lma .eeprom=0 -O ihex $(TARGET_OUTPUT_FILE) $(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).eep" />
+			<Add after="avr-objcopy --no-change-warnings -j .lock --change-section-lma .lock=0 -O ihex $(TARGET_OUTPUT_FILE) $(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).lock" />
+			<Add after="avr-objcopy --no-change-warnings -j .signature --change-section-lma .signature=0 -O ihex $(TARGET_OUTPUT_FILE) $(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).sig" />
+			<Add after="avr-objcopy --no-change-warnings -j .fuse --change-section-lma .fuse=0 -O ihex $(TARGET_OUTPUT_FILE) $(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).fuse" />
+			<Add after="srec_cat $(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).fuse -Intel -crop 0x00 0x01 -offset  0x00 -O $(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).lfs -Intel" />
+			<Add after="srec_cat $(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).fuse -Intel -crop 0x01 0x02 -offset -0x01 -O $(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).hfs -Intel" />
+		</ExtraCommands>
+		<Unit filename=".gitignore" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/alloca.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/assert.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/boot.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/builtins.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/common.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/cpufunc.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/crc16.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/delay.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/eeprom.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/fuse.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/interrupt.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/io.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/io1200.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/io2313.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/io2323.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/io2333.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/io2343.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/io43u32x.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/io43u35x.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/io4414.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/io4433.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/io4434.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/io76c711.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/io8515.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/io8534.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/io8535.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/io86r401.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/io90pwm1.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/io90pwm161.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/io90pwm216.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/io90pwm2b.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/io90pwm316.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/io90pwm3b.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/io90pwm81.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/io90pwmx.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/io90scr100.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/ioa5272.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/ioa5505.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/ioa5702m322.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/ioa5782.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/ioa5790.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/ioa5790n.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/ioa5795.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/ioa5831.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/ioa6285.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/ioa6286.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/ioa6289.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/ioa6612c.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/ioa6613c.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/ioa6614q.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/ioa6616c.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/ioa6617c.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/ioa664251.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/ioat94k.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iocan128.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iocan32.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iocan64.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iocanxx.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom103.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom128.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom1280.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom1281.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom1284.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom1284p.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom1284rfr2.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom128a.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom128rfa1.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom128rfr2.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom16.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom161.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom162.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom163.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom164.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom164pa.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom165.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom165a.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom165p.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom165pa.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom168.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom168a.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom168p.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom168pa.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom169.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom169p.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom169pa.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom16a.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom16hva.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom16hva2.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom16hvb.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom16hvbrevb.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom16m1.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom16u2.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom16u4.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom2560.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom2561.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom2564rfr2.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom256rfr2.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom3000.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom32.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom323.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom324.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom324pa.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom325.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom3250.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom3250pa.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom325pa.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom328p.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom329.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom3290.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom3290pa.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom32a.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom32c1.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom32hvb.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom32hvbrevb.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom32m1.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom32u2.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom32u4.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom32u6.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom406.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom48.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom48a.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom48p.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom48pa.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom48pb.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom64.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom640.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom644.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom644a.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom644p.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom644pa.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom644rfr2.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom645.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom6450.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom649.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom6490.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom649p.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom64a.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom64c1.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom64hve.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom64hve2.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom64m1.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom64rfr2.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom8.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom8515.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom8535.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom88.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom88a.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom88p.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom88pa.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom88pb.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom8a.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom8hva.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iom8u2.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iomx8.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iomxx0_1.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iomxx4.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iomxxhva.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotn10.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotn11.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotn12.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotn13.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotn13a.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotn15.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotn1614.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotn1616.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotn1617.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotn1634.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotn167.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotn20.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotn212.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotn214.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotn22.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotn2313.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotn2313a.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotn24.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotn24a.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotn25.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotn26.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotn261.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotn261a.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotn28.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotn3214.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotn3216.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotn3217.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotn4.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotn40.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotn412.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotn414.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotn416.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotn417.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotn4313.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotn43u.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotn44.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotn441.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotn44a.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotn45.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotn461.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotn461a.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotn48.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotn5.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotn814.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotn816.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotn817.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotn828.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotn84.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotn841.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotn84a.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotn85.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotn861.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotn861a.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotn87.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotn88.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotn9.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotnx4.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotnx5.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iotnx61.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iousb1286.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iousb1287.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iousb162.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iousb646.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iousb647.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iousb82.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iousbxx2.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iousbxx6_7.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iox128a1.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iox128a1u.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iox128a3.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iox128a3u.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iox128a4u.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iox128b1.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iox128b3.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iox128c3.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iox128d3.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iox128d4.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iox16a4.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iox16a4u.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iox16c4.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iox16d4.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iox192a3.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iox192a3u.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iox192c3.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iox192d3.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iox256a3.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iox256a3b.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iox256a3bu.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iox256a3u.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iox256c3.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iox256d3.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iox32a4.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iox32a4u.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iox32c3.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iox32c4.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iox32d3.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iox32d4.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iox32e5.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iox384c3.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iox384d3.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iox64a1.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iox64a1u.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iox64a3.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iox64a3u.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iox64a4u.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iox64b1.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iox64b3.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iox64c3.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iox64d3.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iox64d4.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/iox8e5.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/lock.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/parity.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/pgmspace.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/portpins.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/power.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/sfr_defs.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/signal.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/signature.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/sleep.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/version.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/wdt.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/avr/xmega.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/compat/deprecated.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/compat/ina90.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/compat/twi.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/ctype.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/errno.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/fcntl.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/inttypes.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/locale.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/math.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/setjmp.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/signal.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/stdfix-avrlibc.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/stdint.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/stdio.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/stdlib.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/string.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/sys/types.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/time.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/unistd.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/util/atomic.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/util/crc16.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/util/delay.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/util/delay_basic.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/util/eu_dst.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/util/parity.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/util/setbaud.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/util/twi.h" />
+		<Unit filename="C:/MCU/avr-gcc/avr/include/util/usa_dst.h" />
+		<Unit filename="C:/MCU/avr-gcc/lib/gcc/avr/8.0.1/include-fixed/limits.h" />
+		<Unit filename="C:/MCU/avr-gcc/lib/gcc/avr/8.0.1/include-fixed/syslimits.h" />
+		<Unit filename="C:/MCU/avr-gcc/lib/gcc/avr/8.0.1/include/float.h" />
+		<Unit filename="C:/MCU/avr-gcc/lib/gcc/avr/8.0.1/include/gcov.h" />
+		<Unit filename="C:/MCU/avr-gcc/lib/gcc/avr/8.0.1/include/iso646.h" />
+		<Unit filename="C:/MCU/avr-gcc/lib/gcc/avr/8.0.1/include/stdalign.h" />
+		<Unit filename="C:/MCU/avr-gcc/lib/gcc/avr/8.0.1/include/stdarg.h" />
+		<Unit filename="C:/MCU/avr-gcc/lib/gcc/avr/8.0.1/include/stdatomic.h" />
+		<Unit filename="C:/MCU/avr-gcc/lib/gcc/avr/8.0.1/include/stdbool.h" />
+		<Unit filename="C:/MCU/avr-gcc/lib/gcc/avr/8.0.1/include/stddef.h" />
+		<Unit filename="C:/MCU/avr-gcc/lib/gcc/avr/8.0.1/include/stdfix-gcc.h" />
+		<Unit filename="C:/MCU/avr-gcc/lib/gcc/avr/8.0.1/include/stdfix.h" />
+		<Unit filename="C:/MCU/avr-gcc/lib/gcc/avr/8.0.1/include/stdint-gcc.h" />
+		<Unit filename="C:/MCU/avr-gcc/lib/gcc/avr/8.0.1/include/stdint.h" />
+		<Unit filename="C:/MCU/avr-gcc/lib/gcc/avr/8.0.1/include/stdnoreturn.h" />
+		<Unit filename="C:/MCU/avr-gcc/lib/gcc/avr/8.0.1/include/unwind.h" />
+		<Unit filename="C:/MCU/avr-gcc/lib/gcc/avr/8.0.1/include/varargs.h" />
+		<Unit filename="C:/MCU/avr-gcc/lib/gcc/avr/8.0.1/install-tools/gsyslimits.h" />
+		<Unit filename="C:/MCU/avr-gcc/lib/gcc/avr/8.0.1/install-tools/include/limits.h" />
+		<Unit filename="Makefile" />
+		<Unit filename="ReadMe.txt" />
+		<Unit filename="inc/ds3231.h" />
+		<Unit filename="inc/event-system.h" />
+		<Unit filename="inc/i2c.h" />
+		<Unit filename="inc/list_event.h" />
+		<Unit filename="inc/main.h" />
+		<Unit filename="inc/rtos.h" />
+		<Unit filename="src/ds3231.c">
+			<Option compilerVar="CC" />
+		</Unit>
+		<Unit filename="src/event-system.c">
+			<Option compilerVar="CC" />
+		</Unit>
+		<Unit filename="src/fuse.c">
+			<Option compilerVar="CC" />
+		</Unit>
+		<Unit filename="src/i2c.c">
+			<Option compilerVar="CC" />
+		</Unit>
+		<Unit filename="src/main.c">
+			<Option compilerVar="CC" />
+		</Unit>
+		<Unit filename="src/rtos.c">
+			<Option compilerVar="CC" />
+		</Unit>
+		<Extensions>
+			<code_completion />
+			<envvars />
+			<debugger />
+			<lib_finder disable_auto="1" />
+		</Extensions>
+	</Project>
+</CodeBlocks_project_file>

+ 8 - 0
ReadMe.txt

@@ -1,3 +1,11 @@
 My Nixie Clock IN-12 / Мои часы на ГРИ ИН-12
 
 Решил пустить в дело накопленное добро.
+
+2019.01.18
+---
+2019.01.30
+Первая версия, годная для проверки железа - чтение из RTC и отображение
+минут и секунд, раз в секунду переключение точки. Без кнопок.
+Чтение из RTC сделано без малейших проверок, в случае проблем вместо 
+времени будет мусор.

+ 97 - 0
inc/ds3231.h

@@ -0,0 +1,97 @@
+#pragma once
+#ifndef DS3231_H
+#define DS3231_H
+
+#include <avr/io.h>
+
+/* i2c slave address of the DS3231 chip */
+#define DS3231_I2C_WRADDR  0xD0
+#define DS3231_I2C_RDADDR  0xD1
+
+/* timekeeping registers */
+#define DS3231_TIME_CAL_ADDR        0x00
+#define DS3231_CALENDAR_ADDR        0x03
+#define DS3231_ALARM1_ADDR          0x07
+#define DS3231_ALARM2_ADDR          0x0B
+#define DS3231_CONTROL_ADDR         0x0E
+#define DS3231_STATUS_ADDR          0x0F
+#define DS3231_AGING_OFFSET_ADDR    0x10
+#define DS3231_TEMPERATURE_ADDR     0x11
+
+// control register bits
+#define DS3231_A1IE     0x01
+#define DS3231_A2IE     0x02
+#define DS3231_INTCN    0x04
+#define DS3231_RS1	    0x08
+#define DS3231_RS2	    0x10
+#define DS3231_CONV	    0x20
+#define DS3231_BBSQW	  0x40
+#define DS3231_OSC_OSC	0x80
+
+/* square-wave output frequency */
+#define DS3231_1HZ	    0x00
+#define DS3231_1024HZ	  DS3231_RS1
+#define DS3231_4096HZ	  DS3231_RS2
+#define DS3231_8192HZ	  (DS3231_RS1 | DS3231_RS2)
+
+/* status register bits */
+#define DS3231_A1F      0x01
+#define DS3231_A2F      0x02
+#define DS3231_OSF      0x80
+
+/* RTC Status */
+typedef enum {
+  RTC_OK  = 0x00,
+  RTC_TWI_TimeOut,
+  RTC_TWI_Error
+} rtc_status_t;
+
+/**
+ * @brief   Clock sructure.
+ * @note    structure of ds3231 data.
+ */
+typedef struct {
+  /**
+   * @brief  Seconds
+   */
+  uint8_t Sec;
+  /**
+   * @brief  Minutes
+   */
+  uint8_t Min;
+  /**
+   * @brief  Hours
+   */
+  uint8_t Hr;
+  /**
+   * @brief  Week Day
+   */
+  uint8_t WD;
+  /**
+   * @brief  Day of Month
+   */
+  uint8_t Day;
+  /**
+   * @brief  Month
+   */
+  uint8_t Mon;
+  /**
+   * @brief  Year
+   */
+  uint8_t Year;
+} rtc_t;
+
+void RTC_Init(void);
+
+void RTC_ReadAll(rtc_t * data);
+void RTC_ReadTime(rtc_t * data);
+void RTC_ReadCalendar(rtc_t * data);
+
+void RTC_WriteAll(rtc_t * data);
+void RTC_WriteTime(rtc_t * data);
+void RTC_WriteCalendar(rtc_t * data);
+
+uint8_t bcd2bin(uint8_t bcd);
+uint8_t bin2bcd(uint8_t bin);
+
+#endif // DS3231_H

+ 16 - 16
inc/event-system.h

@@ -1,12 +1,12 @@
-//***************************************************************************
-//
-//  Author(s)...: Pashgan    http://ChipEnable.Ru
-//  Target(s)...: любой микроконтроллер mega
-//  Compiler....: IAR 5.11A
-//  Description.: Заготовка для событийной системы на таблицах
-//  Data........: 30.09.12
-//
-//***************************************************************************
+/**
+ *
+ *  Author(s)...: Pashgan    http://ChipEnable.Ru
+ *  Target(s)...: любой микроконтроллер mega
+ *  Compiler....: IAR 5.11A
+ *  Description.: Заготовка для событийной системы на таблицах
+ *  Data........: 30.09.12
+ *
+ */
 
 /* Define to prevent recursive inclusion -------------------------------------*/
 #pragma once
@@ -19,15 +19,15 @@
 /* вместимость буфера очереди событий */
 #define SIZE_BUF 16
 
-void ES_Init(es_state_t init_state);    //инициализация
-es_state_t ES_GetState(void);           //взять код состояния
-void ES_SetState(es_state_t new_state); //установить код состояния
-es_event_t ES_GetEvent(void);           //взять код события
-void ES_PlaceEvent(es_event_t event);   //разместить событие
-void ES_Dispatch(es_event_t event);     //вызов диспетчера
+void ES_Init(es_state_t init_state);    /* инициализация */
+es_state_t ES_GetState(void);           /* взять код состояния */
+void ES_SetState(es_state_t new_state); /* установить код состояния */
+es_event_t ES_GetEvent(void);           /* взять код события */
+void ES_PlaceEvent(es_event_t event);   /* разместить событие */
+void ES_Dispatch(es_event_t event);     /* вызов диспетчера */
 
 /**
  * ES function prototypes
  */
 
-#endif // EVENT_SYSTEM_H
+#endif /* EVENT_SYSTEM_H */

+ 15 - 6
inc/i2c.h

@@ -6,13 +6,22 @@
 #define TRUE 1
 #define FALSE 0
 
-void I2CInit(void);
-void I2CClose(void);
+typedef enum {
+  TWI_SUCCESS = 0,
+  TWI_TIMEOUT,
+  TWI_ERROR
+} twi_stats_t;
 
-void I2CStart(void);
-void I2CStop(void);
+typedef enum {
+  TWI_ACK = 0,
+  TWI_NACK
+} twi_ask_t;
 
-uint8_t I2CWriteByte(uint8_t data);
-uint8_t I2CReadByte(uint8_t *data,uint8_t ack);	
+void I2C_Init(void);
+void I2C_Close(void);
+twi_stats_t I2C_Start(void);
+twi_stats_t I2C_Stop(void);
+twi_stats_t I2C_WriteByte(uint8_t data);
+twi_stats_t I2C_ReadByte(uint8_t *data, twi_ask_t ack);
 
 #endif

+ 2 - 2
inc/list_event.h

@@ -11,7 +11,7 @@ typedef enum {
 /* коды состояний */
 typedef enum {
   stNoChange = 0x00,
-  // end
+  /* end */
   stLastState
 } es_state_t;
 
@@ -19,4 +19,4 @@ typedef enum {
   #define NULL ((void*)0)
 #endif
 
-#endif //EVENT_LIST_H
+#endif

+ 38 - 6
inc/main.h

@@ -2,17 +2,19 @@
 #ifndef _MAIN_H
 #define _MAIN_H
 
+//#define F_CPU          16000000UL
+
 /**
- * Áèòîâûå ìàêðîñû
+ * Битовые макро�ы
  */
-#define SetBit(x,y)    x |=  (1 << (y))
+#define SetBit(x,y)    x |= (1 << (y))
 #define ClrBit(x,y)    x &= ~(1 << (y))
-#define InvBit(x,y)    (x)^=  (1 << (y))
-#define IsBit(x,y)     (x &  (1 << (y)))
+#define InvBit(x,y)    x ^= (1 << (y))
+#define IsBit(x,y)     (x & (1 << (y)))
 
 #define ResBit(reg,bit)    (reg &= ~_BV(bit))
 /*
- Àâòîìàòè÷åñêè âêëþ÷àåòñÿ avr/sfr_defs.h, êòîðûé ñîäåðæèò:
+ �втоматиче�ки включает�� avr/sfr_defs.h, который �одержит:
 	_BV(bit) === (1<<(bit))
 	bit_is_set(sfr, bit)
 	bit_is_clear(sfr, bit)
@@ -20,4 +22,34 @@
 	loop_until_bit_is_clear(sfr, bit)
 */
 
-#endif // _MAIN_H
+/**
+ * Дефайны
+ */
+/* Port B, puttons, input, pull-up */
+#define BUTTON1_PIN     _BV(PB3)
+#define BUTTON2_PIN     _BV(PB4)
+#define BUTTON3_PIN     _BV(PB5)
+#define BUTTON_PINS     (BUTTON1_PIN | BUTTON2_PIN | BUTTON3_PIN)
+#define BUTTON1_STATE   (PINB & BUTTON1_PIN)
+#define BUTTON2_STATE   (PINB & BUTTON2_PIN)
+#define BUTTON3_STATE   (PINB & BUTTON3_PIN)
+#define BUTTONS_STATE   (PINB & BUTTON_PINS)
+
+/* Port C, Lamp digits, output */
+#define DIGIT_BLANK     0x0F
+#define DIGIT_A0        _BV(PC0)
+#define DIGIT_A1        _BV(PC1)
+#define DIGIT_A2        _BV(PC2)
+#define DIGIT_A3        _BV(PC3)
+#define DIGIT_PINS      (DIGIT_A0 | DIGIT_A1 | DIGIT_A2 | DIGIT_A3)
+
+/* Port D, Lamp anods, Dot, RTC interrupt, UART */
+#define DOT_PIN         _BV(PD2)
+#define ANOD1           _BV(PD4)
+#define ANOD2           _BV(PD5)
+#define ANOD3           _BV(PD6)
+#define ANOD4           _BV(PD7)
+#define ANOD_PINS       (ANOD1 | ANOD2 | ANOD3 | ANOD4)
+
+
+#endif

+ 7 - 7
inc/rtos.h

@@ -26,15 +26,15 @@
 /**
  * Будем использовать таймер 0, период -- 1 мсек
  */
-#define TIMER_HZ		1000
+#define TIMER_HZ		    1000
 #define TIMER_PRESCALER 64
-#define	TIMER_CNT		(0x100 - (F_CPU / TIMER_PRESCALER / TIMER_HZ))
+#define	TIMER_CNT		    (0x100 - (F_CPU / TIMER_PRESCALER / TIMER_HZ))
 
-#define TIMER_TCCR		TCCR0
-#define TIMER_TCNT		TCNT0
-#define TIMER_TIMSK		TIMSK
-#define TIMER_CSB		(1<<CS02)
-#define TIMER_INT		(1<<TOIE0)
+#define TIMER_TCCR		  TCCR0
+#define TIMER_TCNT		  TCNT0
+#define TIMER_TIMSK		  TIMSK
+#define TIMER_CSB		    (1<<CS02)
+#define TIMER_INT		    (1<<TOIE0)
 #define TIMER_OVF_VECT	TIMER0_OVF_vect
 
 /**

+ 131 - 0
src/ds3231.c

@@ -0,0 +1,131 @@
+#include "ds3231.h"
+#include "i2c.h"
+
+//twi_stats_t twi_status;
+
+/**
+ * @brief Инициализация RTC
+ */
+void RTC_Init(void) {
+  I2C_Start();
+  I2C_WriteByte(DS3231_I2C_WRADDR);
+  I2C_WriteByte(DS3231_CONTROL_ADDR);
+  I2C_WriteByte(DS3231_CONV);
+  I2C_Stop();
+}
+
+/**
+ * @brief Чтение времени и календаря
+ */
+void RTC_ReadAll(rtc_t * data) {
+  I2C_Start();
+  I2C_WriteByte(DS3231_I2C_WRADDR);
+  I2C_WriteByte(DS3231_TIME_CAL_ADDR);
+  I2C_Stop();
+
+  I2C_Start();
+  I2C_WriteByte(DS3231_I2C_RDADDR);
+  I2C_ReadByte(&data->Sec, TWI_ACK);
+  I2C_ReadByte(&data->Min, TWI_ACK);
+  I2C_ReadByte(&data->Hr, TWI_ACK);
+  I2C_ReadByte(&data->WD, TWI_ACK);
+  I2C_ReadByte(&data->Day, TWI_ACK);
+  I2C_ReadByte(&data->Mon, TWI_ACK);
+  I2C_ReadByte(&data->Year, TWI_NACK);
+  I2C_Stop();
+}
+
+/**
+ * @brief Чтение времени
+ */
+void RTC_ReadTime(rtc_t * data) {
+  I2C_Start();
+  I2C_WriteByte(DS3231_I2C_WRADDR);
+  I2C_WriteByte(DS3231_TIME_CAL_ADDR);
+  I2C_Stop();
+
+  I2C_Start();
+  I2C_WriteByte(DS3231_I2C_RDADDR);
+  I2C_ReadByte(&data->Sec, TWI_ACK);
+  I2C_ReadByte(&data->Min, TWI_ACK);
+  I2C_ReadByte(&data->Hr, TWI_NACK);
+  I2C_Stop();
+}
+
+/**
+ * @brief Чтение календаря
+ */
+void RTC_ReadCalendar(rtc_t * data) {
+  I2C_Start();
+  I2C_WriteByte(DS3231_I2C_WRADDR);
+  I2C_WriteByte(DS3231_CALENDAR_ADDR);
+  I2C_Stop();
+
+  I2C_Start();
+  I2C_WriteByte(DS3231_I2C_RDADDR);
+  I2C_ReadByte(&data->WD, TWI_ACK);
+  I2C_ReadByte(&data->Day, TWI_ACK);
+  I2C_ReadByte(&data->Mon, TWI_ACK);
+  I2C_ReadByte(&data->Year, TWI_NACK);
+  I2C_Stop();
+}
+
+/**
+ * @brief Запись времени и календаря
+ */
+void RTC_WriteAll(rtc_t * data) {
+  I2C_Start();
+  I2C_WriteByte(DS3231_I2C_WRADDR);
+  I2C_WriteByte(DS3231_CONTROL_ADDR);
+  I2C_WriteByte(data->Sec);
+  I2C_WriteByte(data->Min);
+  I2C_WriteByte(data->Hr);
+  I2C_WriteByte(data->WD);
+  I2C_WriteByte(data->Day);
+  I2C_WriteByte(data->Mon);
+  I2C_WriteByte(data->Year);
+  I2C_Stop();
+}
+
+/**
+ * @brief Запись времени
+ */
+void RTC_WriteTime(rtc_t * data) {
+  I2C_Start();
+  I2C_WriteByte(DS3231_I2C_WRADDR);
+  I2C_WriteByte(DS3231_CONTROL_ADDR);
+  I2C_WriteByte(data->Sec);
+  I2C_WriteByte(data->Min);
+  I2C_WriteByte(data->Hr);
+  I2C_Stop();
+}
+
+/**
+ * @brief Запись календаря
+ */
+void RTC_WriteCalendar(rtc_t * data) {
+  I2C_Start();
+  I2C_WriteByte(DS3231_I2C_WRADDR);
+  I2C_WriteByte(DS3231_CONTROL_ADDR);
+  I2C_WriteByte(data->WD);
+  I2C_WriteByte(data->Day);
+  I2C_WriteByte(data->Mon);
+  I2C_WriteByte(data->Year);
+  I2C_Stop();
+}
+
+/**
+ * @brief Convert BCD value to Binary
+ */
+uint8_t bcd2bin(uint8_t bcd)
+{
+    return (10 * (bcd >> 4) + (bcd & 0x0f));
+}
+
+/**
+ * @brief Convert Binary value to BCD
+ */
+uint8_t bin2bcd(uint8_t bin)
+{
+    return (((bin / 10 ) << 4) | (bin % 10));
+}

+ 12 - 13
src/event-system.c

@@ -1,12 +1,11 @@
-//***************************************************************************
-//
-//  Author(s)...: Pashgan    http://ChipEnable.Ru
-//  Target(s)...: любой микроконтроллер mega
-//  Compiler....: IAR 5.11A
-//  Description.: Заготовка для событийной системы на таблицах
-//  Data........: 30.09.12
-//
-//***************************************************************************
+/**
+ *  Author(s)...: Pashgan    http://ChipEnable.Ru
+ *  Target(s)...: любой микроконтроллер mega
+ *  Compiler....: IAR 5.11A
+ *  Description.: Заготовка для событийной системы на таблицах
+ *  Data........: 30.09.12
+*/
+
 #include "event-system.h"
 #include <avr/pgmspace.h>
 
@@ -113,14 +112,14 @@ void ES_Dispatch(es_event_t event)
     pStateFunc1 = NULL;
     pStateFunc2 = NULL;
 
-    //определяем следующее состояние
+    /* определяем следующее состояние */
     for (i=0; prb(table[i].startEvent) || prb(table[i].endEvent); i++)
     {
-        //если текущее состояние попадает в диапазон
+        /* если текущее состояние попадает в диапазон */
         if ( (_State >= prb(table[i].startState)) && (_State <= prb(table[i].endState)) ) {
-          //если поступившее событие попадает в диапазон
+          /* если поступившее событие попадает в диапазон */
           if((event >= prb(table[i].startEvent)) && (event <= prb(table[i].endEvent)) ) {
-            //меняем состояние если требуется
+            /* меняем состояние если требуется */
             if (prb(table[i].nextstate) != stNoChange) {
               _State = prb(table[i].nextstate);
             }

+ 10 - 0
src/fuse.c

@@ -0,0 +1,10 @@
+#include <avr/io.h>
+
+/**
+ * avrdude: -U lfuse:w:0x3e:m -U hfuse:w:0xc9:m
+ */
+
+FUSES = {
+    .low = 0x3E,
+    .high = 0xC9
+};

+ 99 - 40
src/i2c.c

@@ -10,106 +10,165 @@ COPYRIGHT (C) 2008-2009 EXTREME ELECTRONICS INDIA
 #include <avr/io.h>
 #include "i2c.h"
 
-#define TWI_TIMEOUT    50
+/* Private defines */
+// twi_br must be 3
+#define TWI_SPEED       400000UL
+#define TWI_PRESCALER   4
+#define TWI_BR          ((F_CPU / TWI_SPEED) - 16) / (2 * TWI_PRESCALER)
+#define TWPS_1          ((0<<TWPS1) | (0<<TWPS0))
+#define TWPS_4          ((0<<TWPS1) | (1<<TWPS0))
+#define TWPS_16         ((1<<TWPS1) | (0<<TWPS0))
+#define TWPS_64         ((1<<TWPS1) | (1<<TWPS0))
+#define TWI_PS          TWPS_4
+
+#define TWI_WDT_TIMEOUT 10
+
+/* Private variables */
 uint8_t TWI_WDT;
 
-void I2CInit(void) {
+/**
+ * @brief Initialize TWI
+ * @param None
+ * @return None
+ */
+void I2C_Init(void) {
   //Set up TWI Module
-  TWBR = 32;
-  //TWSR |=((1<<TWPS1)|(1<<TWPS0));
+  TWSR = TWI_PS;
+  TWBR = TWI_BR;
 
   //Enable the TWI Module
-  TWCR|=(1<<TWEN);
+  TWCR |= 1<<TWEN;
 }
 
-void I2CClose(void)
+/**
+ * @brief Disable TWI
+ * @param None
+ * @return None
+ */
+void I2C_Close(void)
 {
   //Disable the module
-  TWCR&=(~(1<<TWEN));
+  TWCR &= ~(1<<TWEN);
 }
 
-void I2CStart(void) {
+/**
+ * @brief TWI Start condition
+ * @param None
+ * @return Operation status
+ */
+twi_stats_t I2C_Start(void) {
   //Put Start Condition on Bus
-  TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWSTA);
+  TWCR= (1<<TWINT) | (1<<TWEN) | (1<<TWSTA);
 
   //Poll Till Done
-  TWI_WDT = TWI_TIMEOUT;
-  while(!(TWCR & (1<<TWINT)) && (TWI_WDT > 0));
+  TWI_WDT = TWI_WDT_TIMEOUT;
+  while (!(TWCR & (1<<TWINT))) {
+    if (TWI_WDT == 0) {
+      return TWI_TIMEOUT;
+    }
+  }
+
+  if ((TWSR & 0xF8) == 0x08 || (TWSR & 0xF8) == 0x10) {
+    //start condition sent from master
+    //or
+    //repeat start condition sent from master
+    return TWI_SUCCESS;
+  } else {
+    return TWI_ERROR;
+  }
+
 }
 
-void I2CStop(void) {
+/**
+ * @brief TWI Stop condition
+ * @param None
+ * @return Operation status
+ */
+twi_stats_t I2C_Stop(void) {
   //Put Stop Condition on bus
-  TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
+  TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
 
   //Wait for STOP to finish
   // зачем это ждать тут? проверять перед стартом и всё!
-  TWI_WDT = TWI_TIMEOUT;
-  while(TWCR & (1<<TWSTO) && (TWI_WDT > 0));
+  TWI_WDT = TWI_WDT_TIMEOUT;
+  while (TWCR & (1<<TWSTO)) {
+    if (TWI_WDT == 0) {
+      return TWI_TIMEOUT;
+    }
+  }
+  return TWI_SUCCESS;
 }
 
-uint8_t I2CWriteByte(uint8_t data) {
+/**
+ * @brief TWI Send Byte
+ * @param None
+ * @return Operation status
+ */
+twi_stats_t I2C_WriteByte(uint8_t data) {
 
-  TWDR=data;
+  TWDR = data;
 
   //Initiate Transfer
-  TWCR=(1<<TWEN)|(1<<TWINT);
+  TWCR = (1<<TWEN) | (1<<TWINT);
 
   //Poll Till Done
-  TWI_WDT = TWI_TIMEOUT;
-  while(!(TWCR & (1<<TWINT))) {
-    if (0 == TWI_WDT) {
-      return -2;
+  TWI_WDT = TWI_WDT_TIMEOUT;
+  while (!(TWCR & (1<<TWINT))) {
+    if (TWI_WDT == 0) {
+      return TWI_TIMEOUT;
     }
   }
 
   //Check Status
-  if((TWSR & 0xF8) == 0x18 || (TWSR & 0xF8) == 0x28 || (TWSR & 0xF8) == 0x40) {
+  if ((TWSR & 0xF8) == 0x18 || (TWSR & 0xF8) == 0x28 || (TWSR & 0xF8) == 0x40) {
     //SLA+W Transmitted and ACK received
     //or
     //SLA+R Transmitted and ACK received
     //or
     //DATA Transmitted and ACK recived
-
-    return TRUE;
+    return TWI_SUCCESS;
   } else {
-    return FALSE;  //Error
+    return TWI_ERROR;  //Error
   }
 }
 
-uint8_t I2CReadByte(uint8_t *data,uint8_t ack) {
+/**
+ * @brief TWI Receive Byte
+ * @param None
+ * @return Operation status
+ */
+twi_stats_t I2C_ReadByte(uint8_t *data, twi_ask_t ack) {
   //Set up ACK
-  if(ack) {
+  if (ack == TWI_ACK) {
     //return ACK after reception
-    TWCR|=(1<<TWEA);
+    TWCR |= (1<<TWEA);
   } else {
     //return NACK after reception
     //Signals slave to stop giving more data
     //usually used for last byte read.
-    TWCR&=(~(1<<TWEA));
+    TWCR &= ~(1<<TWEA);
   }
 
   //Now enable Reception of data by clearing TWINT
-  TWCR|=(1<<TWINT);
+  TWCR |= (1<<TWINT);
 
   //Wait till done
-  TWI_WDT = TWI_TIMEOUT;
+  TWI_WDT = TWI_WDT_TIMEOUT;
   while(!(TWCR & (1<<TWINT))) {
-    if (0 == TWI_WDT) {
-      return -2;
+    if (TWI_WDT == 0) {
+      return TWI_TIMEOUT;
     }
   }
 
   //Check status
-  if((TWSR & 0xF8) == 0x58 || (TWSR & 0xF8) == 0x50) {
+  if ((TWSR & 0xF8) == 0x58 || (TWSR & 0xF8) == 0x50) {
     //Data received and ACK returned
     //  or
     //Data received and NACK returned
-
     //Read the data
-
-    *data=TWDR;
-    return TRUE;
+    *data = TWDR;
+    return TWI_SUCCESS;
   } else {
-    return FALSE;  //Error
+    return TWI_ERROR;  //Error
   }
 }

+ 121 - 12
src/main.c

@@ -12,36 +12,62 @@
 
 #include "main.h"
 #include "i2c.h"
-//#include "ds3231.h"
+#include "ds3231.h"
 #include "rtos.h"
 #include "event-system.h"
 
+/* Defines */
+#define TIMER2_HZ		      250
+#define TIMER2_PRESCALER  256
+#define TIMER2_CS         (1<<CS22 | 1<<CS21 | 0<<CS20)
+#define	TIMER2_CNT		    (0x100 - (F_CPU / TIMER2_PRESCALER / TIMER2_HZ))
+
+/* Variables */
+static volatile uint8_t Digit[4] = {1, 2, 3, 4};
+static rtc_t RTC;
+volatile struct {
+	uint8_t RTC_Int:	1;
+	uint8_t rezerv:   7;
+} Flag;
+
+/* Constants */
+/* Function prototypes */
+void Board_Init(void);
+
 void main(void) {
   /**
    * Локальные переменные
    */
   uint8_t event = 0;
+  Flag.RTC_Int = 0;
 
   /**
    * Инициализация, настройка...
    */
-  // выкл. аналог. компаратор
-  ResBit(ACSR,ACD);
+  Board_Init();
 
-  // Разрешим прерывания
-  sei();
-
-  // Init Scheduler and TDelay
+  // Initialize Scheduler
   RTOS_Init();
 
-  //Initialize I2C Bus
-  I2CInit();
+  // Initialize I2C Bus and RTC
+  I2C_Init();
+  RTC_Init();
+  RTC_ReadAll(&RTC);
 
+  // Initialize Event State Machine
   ES_Init(stNoChange);
 
   /** main loop */
   do {
 
+    if (Flag.RTC_Int != 0) {
+      Flag.RTC_Int = 0;
+      RTC_ReadTime(&RTC);
+      Digit[0] = RTC.Min >> 4;
+      Digit[1] = RTC.Min & 0x0F;
+      Digit[2] = RTC.Sec >> 4;
+      Digit[3] = RTC.Sec & 0x0F;
+    }
     // крутим диспетчер
     RTOS_DispatchTask();
 
@@ -53,18 +79,101 @@ void main(void) {
   } while(1);
 }
 
+/**
+ *  П о д п р о г р а м м ы
+ */
+
+/**
+ * @brief Initializy perephireal
+ */
+void Board_Init(void) {
+  /* power off Analog Comparator */
+  ACSR = ACD;
+
+  /* GPIO */
+  PORTB = BUTTON_PINS; // enable pull-up
+  DDRC = DIGIT_PINS; // as output
+  DDRD = (DOT_PIN | ANOD_PINS); // as output
+
+  /* Timer2 - refresh Nixie values */
+  TCCR2 = TIMER2_CS;
+  TCNT2 = TIMER2_CNT;
+  TIMSK = _BV(TOIE2);
+
+  /* Interrupt from RTC */
+  MCUCR = _BV(ISC11); // falling edge
+  GICR = _BV(INT1);
+
+  /* Enable Interrupts */
+  sei();
+}
+
 /**
  *  П р е р ы в а н и я
  */
 
-/* от часов */
+/**
+ * @brief RTC one seconds interrupt
+ */
 ISR (INT0_vect) {
-	//RTOS_SetTask(GetTimeDate,0,0);
+	// Blink Dot for test
+	PIND |= DOT_PIN;
+	Flag.RTC_Int = 1;
 }
 
+/**
+ * @brief Refresh Nixie output
+ * @note Digit[] must be in range 0x00 - 0x0F
+ */
+ISR(TIMER2_OVF_vect) {
+  static uint8_t idx = 0;
+
+  // reload timer
+  TCNT2 = TIMER2_CNT;
+
+  // read current register value and clean bits
+  uint8_t pd = PORTD & ~ANOD_PINS;
+  uint8_t pc = PORTC & ~DIGIT_PINS;
+
+  // power off lamps
+  PORTD = pd;
+  PORTC =  pc;
+
+  switch (idx) {
+  case 0:
+    // output lamp value
+    PORTC = pc | Digit[0];
+    // power on lamp
+    PORTD = pd | ANOD1;
+    idx = 1;
+    break;
+
+  case 1:
+    PORTC = pc | Digit[1];
+    PORTD = pd | ANOD2;
+    idx = 2;
+    break;
+
+  case 2:
+    PORTC = pc | Digit[2];
+    PORTD = pd | ANOD3;
+    idx = 3;
+    break;
+
+  case 3:
+    PORTC = pc | Digit[3];
+    PORTD = pd | ANOD4;
+    idx = 0;
+    break;
+
+  default:
+    idx = 0;
+    break;
+  }
+}
 
 /**
- * заглушка для неиспользуемых прерываний
+ * @brief заглушка для неиспользуемых прерываний
  */
 ISR(__vector_default,ISR_NAKED) {
 	reti();

+ 0 - 6
src/rtos.c

@@ -29,12 +29,6 @@ inline void RTOS_Init()
   TIMER_TCNT = TIMER_CNT;
   TIMER_TIMSK |= TIMER_INT;
 
-  // микросекундный таймер
-  // prescaler = 8
-  TCCR1B = ((CS12<<0) | (CS11<<1) | (CS10<<0));
-  // interrupt -- not used
-  // set counter to 0
-  TCNT1 = 0;
   // "хвост" в 0
   arrayTail = 0;
 }