; ; Project name: thermostat ; Description: Electronic thermostat on AVR Microcontroller ; Source code: https://github.com/sergeyyarkov/attiny2313a_thermostat ; Device: ATtiny2313A ; Device Datasheet: http://ww1.microchip.com/downloads/en/DeviceDoc/doc8246.pdf ; Package: SOIC-20W_7.5x12.8mm_P1.27mm ; Assembler: AVR macro assembler 2.2.7 ; Clock frequency: 8 MHz External Crystal Oscillator ; Fuses: lfuse: 0xCF, hfuse: 0x9F, efuse: 0xFF, lock: 0xFF ; ; Written by Sergey Yarkov 22.01.2023 .INCLUDE "tn2313Adef.inc" .LIST .DEF TEMP_REG_A = r16 .DEF TEMP_REG_B = r17 .DEF ONE_WIRE_FLAGS = r23 ; Флаги состояния для 1-Wire интерфейса .DEF DISP_NUM_L = r24 ; LSB числа которое сейчас на индикаторе .DEF DISP_NUM_H = r25 ; MSB числа которое сейчас на индикаторе .EQU DIGIT_1_PIN = PD2 ; Пин разряда индикатора 1 .EQU DIGIT_2_PIN = PD3 ; Пин разряда индикатора 2 .EQU DIGIT_3_PIN = PD4 ; Пин разряда индикатора 3 .EQU DIGIT_4_PIN = PD5 ; Пин разряда индикатора 4 .EQU LED_POWER_PIN = PD6 ; Светодиод, который говорит о том что питание подано .EQU ONE_WIRE_LINE = PB1 ; Пин шины 1-Wire .EQU ONE_WIRE_DDR = DDRB .EQU ONE_WIRE_PIN = PINB .EQU OWPRF = 0 ; 1-Wire Флаг присутствия .EQU USI_LATCH_PIN = PB0 ; ST_CP на 74HC595 .EQU USI_DO_PIN = PB6 ; DS на 74HC595 .EQU USI_CLK_PIN = PB7 ; SH_CP на 74HC595 .EQU SW_PLUS_PIN = PB2 ; Кнопка "Минус" .EQU SW_MINUS_PIN = PB3 ; Кнопка "Плюс" .EQU SW_SET_PIN = PB4 ; Кнопка "Установить" .EQU MCU_STATE_DEFAULT = 0x01 ; Режим измерения температуры и сравнения с заданными параметрами .EQU MCU_STATE_PROGRAM = 0x02 ; Режим настройки параметров в EEPROM .EQU MCU_STATE_ERROR = 0x03 ; Режим ошибки, например когда не подключен датчик ; **** МАКРОСЫ ************************************************** .MACRO outi ldi @0, @2 out @1, @0 .ENDMACRO .MACRO display_load ldi DISP_NUM_L, LOW(@0) ldi DISP_NUM_H, HIGH(@0) .ENDMACRO .MACRO _1_wire_pull sbi ONE_WIRE_DDR, ONE_WIRE_LINE .ENDMACRO .MACRO _1_wire_release cbi ONE_WIRE_DDR, ONE_WIRE_LINE .ENDMACRO ; **** СЕГМЕНТ ДАННЫХ ******************************************** .DSEG .ORG SRAM_START MCU_STATE: .BYTE 1 ; Текущее состояние МК SRAM_TEMP_1: .BYTE 2 ; Хранения временного 16-бит числа в ячейке DIGITS: .BYTE 4 ; Ячейки, где хранятся символы, для вывода на индикатор CURRENT_DIGIT: .BYTE 1 ; Номер разряда индикатора, который сейчас горит ; **** СЕГМЕНТ КОДА ********************************************** .CSEG .ORG 0x00 rjmp RESET_vect .ORG 0x000B rjmp PCINT0_vect .ORG 0x000D rjmp TIMER0_COMPA_vect ; **** ДИНАМИЧЕСКАЯ ИНДИКАЦИЯ ************************************ TIMER0_COMPA_vect: push r20 push r21 push r16 in r21, SREG lds r20, CURRENT_DIGIT cpi r20, 5 brge reset_digit_idx rjmp _indicate_1 reset_digit_idx: clr r20 sts CURRENT_DIGIT, r20 _indicate_1: cpi r20, 0 brne _indicate_2 cbi PORTD, DIGIT_2_PIN cbi PORTD, DIGIT_3_PIN cbi PORTD, DIGIT_4_PIN sbi PORTD, DIGIT_1_PIN lds TEMP_REG_A, DIGITS+3 rcall DISPLAY_DECODER rcall USI_TRANSMIT _indicate_2: cpi r20, 1 brne _indicate_3 cbi PORTD, DIGIT_1_PIN cbi PORTD, DIGIT_3_PIN cbi PORTD, DIGIT_4_PIN sbi PORTD, DIGIT_2_PIN lds TEMP_REG_A, DIGITS+2 rcall DISPLAY_DECODER rcall USI_TRANSMIT _indicate_3: cpi r20, 2 brne _indicate_4 cbi PORTD, DIGIT_1_PIN cbi PORTD, DIGIT_2_PIN cbi PORTD, DIGIT_4_PIN sbi PORTD, DIGIT_3_PIN lds TEMP_REG_A, DIGITS+1 rcall DISPLAY_DECODER rcall USI_TRANSMIT _indicate_4: cpi r20, 3 brne _indicate_exit cbi PORTD, DIGIT_1_PIN cbi PORTD, DIGIT_2_PIN cbi PORTD, DIGIT_3_PIN sbi PORTD, DIGIT_4_PIN lds TEMP_REG_A, DIGITS rcall DISPLAY_DECODER rcall USI_TRANSMIT _indicate_exit: inc r20 sts CURRENT_DIGIT, r20 out SREG, r21 pop r16 pop r21 pop r20 reti ; **** ОБРАБОТКА КНОПОК ****************************************** PCINT0_vect: push r16 in r16, SREG sbis PINB, SW_PLUS_PIN rjmp _sw_plus sbis PINB, SW_MINUS_PIN rjmp _sw_minus sbis PINB, SW_SET_PIN rjmp _sw_set rjmp _sw_exit _sw_plus: adiw DISP_NUM_L, 1 rjmp _sw_exit _sw_minus: adiw DISP_NUM_L, 10 rjmp _sw_exit _sw_set: adiw DISP_NUM_L, 63 _sw_exit: out SREG, r16 pop r16 reti ; **** СТАРТ ПРОГРАММЫ ******************************************* RESET_vect: ldi TEMP_REG_A, LOW(RAMEND) out SPL, TEMP_REG_A ; **** ПРОЦЕСС ИНИЦИАЛИЗАЦИИ МК ********************************** MCU_INIT: ; **** ИНИЦИАЛИЗАЦИЯ ПИНОВ ************************************* outi r16, DDRD, (1<