; ; 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 .EQU DIGIT_1_PIN = PD2 .EQU DIGIT_2_PIN = PD3 .EQU DIGIT_3_PIN = PD4 .EQU DIGIT_4_PIN = PD5 .EQU LED_POWER_PIN = PD6 .EQU USI_LATCH_PIN = PB0 ; ST_CP on 74HC595 .EQU USI_DO_PIN = PB6 ; DS on 74HC595 .EQU USI_CLK_PIN = PB7 ; SH_CP on 74HC595 .EQU MCU_STATE_DEFAULT = 0x01 ; Режим измерения температуры и сравнения с заданными параметрами .EQU MCU_STATE_PROGRAM = 0x02 ; Режим настройки параметров в EEPROM .EQU MCU_STATE_ERROR = 0x03 ; Режим ошибки, например когда не подключен датчик ; **** СЕГМЕНТ ДАННЫХ ******************************************** .DSEG .ORG SRAM_START MCU_STATE: .BYTE 1 ; Текущее состояние МК NUMBER: .BYTE 2 DIGITS: .BYTE 4 ; Ячейки, где хранятся символы, для вывода на индикатор CURRENT_DIGIT: .BYTE 1 ; Номер разряда индикатора, который сейчас горит ; **** СЕГМЕНТ КОДА ********************************************** .CSEG .ORG 0x00 rjmp RESET_vect .ORG 0x000D rjmp TIMER0_COMPA_vect ; **** ДИНАМИЧЕСКАЯ ИНДИКАЦИЯ ************************************ TIMER0_COMPA_vect: 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 reti RESET_vect: ldi TEMP_REG_A, LOW(RAMEND) out SPL, TEMP_REG_A MCU_INIT: ; **** ИНИЦИАЛИЗАЦИЯ ПОРТОВ ************************************ ldi r16, (1<