/* * Teplica001.asm * * Created: 11.03.2020 13:34:48 * Author: Иванов И.Г. * 3 крана * * * */ .include "m328pdef.inc" #define F_CPU 16000000 .equ fck = 16000000 ;частота в герцах внутренний осц с устан сдив8 .equ BAUD = 9600 ;скорость .equ UBRR_value = (fck/(BAUD*16))-1 ;значение для регистра .equ OneSec = fck/256 ;счетчик 1 секунда предделитель 256 ; микросхема часов DS1302 // 2(PD2)-CLK // 3(PD3)-DAT // 4(PD4)-RST(CE) .equ PinCLK = PIND2 ;2 .equ PinDAT = PIND3 ;3 .equ PinRST = PIND4 ;4 ; выбор шагового мотора для работы с кранами // 5(PD5)-1 мотор // 6(PD6)-2 мотор // 7(PD7)-3 мотор .equ Mtr01EN = PIND5 ;5 .equ Mtr02EN = PIND6 ;6 .equ Mtr03EN = PIND7 ;7 ; датчики состояния кранов .equ Tap01_On = PINB0 ;8 .equ Tap01_Off = PINB1 ;9 .equ Tap02_On = PINB2 ;10 .equ Tap02_Off = PINB3 ;11 .equ Tap03_On = PINB4 ;12 .equ Tap03_Off = PINB5 ;13 .equ Tap03_OffDW = PINC4 ;A4 вместо неисправной 13 ; выводы обмоток шаговых двигателей .equ MtrAmns = PINC0 ;A0 .equ MtrApls = PINC1 ;A1 .equ MtrBmns = PINC2 ;A2 .equ MtrBpls = PINC3 ;A3 ;флаги в байте флагов FlagByte .equ SwGoGo = 0 ;0 флаг начатия полива .equ Mtr01_On_Off = 1 ;1 полив по крану 1 .equ Mtr02_On_Off = 2 ;2 полив по крану 2 .equ Mtr03_On_Off = 3 ;3 полив по крану 3 .DSEG //0x0100 ArdDTime: .BYTE 6 ;время дата на устройстве ssmmhhDDMMYY FlagByte: .BYTE 1 ;см выше SwWrkTime: .BYTE 2 ;время полива в секундах MaskDoW: .BYTE 1 ;маска дней недели WaterOn: .BYTE 2 ;время открытия mmhh WaterOFF: .BYTE 2 ;время закрытия mmhh WaterPer: .BYTE 2 ;время открытия одного крана FazaAct: .BYTE 1 ;фаза двигателя (на все одна) ;портовые переменные LnRxD: .BYTE 1 ;количество байт на прием CntrRxD: .BYTE 1 ;счетчик приемника BufRxD: .BYTE 16 ;буфер приемника TmNxBt: .BYTE 1 ;таймер ожидания следующего байта lnTxD: .BYTE 1 ;количество передаваемых байт CntrTxD: .BYTE 1 ;счетчик передатчика BufTxD: .BYTE 16 ;буфер передатчика .eseg //0x0000 EEPROM EMaskDoW: .BYTE 1 ;маска дней недели EWaterOn: .BYTE 2 ;время открытия mmhh во флеш EWaterOFF: .BYTE 2 ;время закрытия mmhh во флеш EWaterPer: .BYTE 2 ;время открытия одного крана .cseg //0x0000 Programm Label_01: jmp Label_03 ; Reset jmp Label_02 ; External Interrupt Request 0 jmp Label_02 ; External Interrupt Request 1 jmp Label_02 ; Pin Change Interrupt Request 0 jmp Label_02 ; Pin Change Interrupt Request 0 jmp Label_02 ; Pin Change Interrupt Request 1 jmp Label_02 ; Watchdog Time-out Interrupt jmp Label_02 ; Timer/Counter2 Compare Match A jmp Label_02 ; Timer/Counter2 Compare Match B jmp Label_02 ; Timer/Counter2 Overflow jmp Label_02 ; Timer/Counter1 Capture Event jmp Int_T1MA_01 ; Timer/Counter1 Compare Match A // обработчик прерывания 1 СЕКУНДА jmp Int_T1MB_01 ; Timer/Counter1 Compare Match B jmp Label_02 ; Timer/Counter1 Overflow jmp Label_02 ; TimerCounter0 Compare Match A jmp Label_02 ; TimerCounter0 Compare Match B jmp Label_02 ; Timer/Couner0 Overflow jmp Label_02 ; SPI Serial Transfer Complete jmp Int_Recv_01 ; USART Rx Complete // принят байт jmp Label_02 ; USART, Data Register Empty jmp Label_02 ; USART Tx Complete jmp Label_02 ; ADC Conversion Complete jmp Label_02 ; EEPROM Ready jmp Label_02 ; Analog Comparator jmp Label_02 ; Two-wire Serial Interface jmp Label_02 ; Store Program Memory Read Label_02: reti cli jmp Label_01 ;поле констант ;длина принимаемой команды в зависимости от параметра с учетом двух байт CRC LnRxCMD: .db 0x04 ;1 - команда запроса времени даты .db 0x0A ;2 - команда записи времени даты .db 0x04 ;1 - команда запроса времени .db 0x04 ;1 - команда запроса времени ;таблица значений ацп для термопары с 10 до 70 град с шагом 1 град tmprgrid: .dw 0x014A ; 330 10 .dw 0x0156 ; 342 .dw 0x0162 ; 354 .dw 0x016E ; 366 .dw 0x017A ; 378 .dw 0x0186 ; 390 .dw 0x0192 ; 402 .dw 0x019E ; 414 .dw 0x01AB ; 427 .dw 0x01B7 ; 439 .dw 0x01C3 ; 451 20 .dw 0x01CF ; 463 1 .dw 0x01DC ; 476 2 .dw 0x01E8 ; 488 3 .dw 0x01F4 ; 500 4 .dw 0x0200 ; 512 25 10кОм .dw 0x020C ; 524 .dw 0x0218 ; 536 .dw 0x0224 ; 548 .dw 0x022F ; 559 .dw 0x023B ; 571 30 .dw 0x0246 ; 582 .dw 0x0252 ; 594 .dw 0x025D ; 605 .dw 0x0268 ; 616 .dw 0x0272 ; 626 .dw 0x027D ; 637 .dw 0x0287 ; 647 .dw 0x0292 ; 658 .dw 0x029C ; 668 .dw 0x02A5 ; 677 40 .dw 0x02AF ; 687 .dw 0x02B9 ; 697 .dw 0x02C2 ; 706 .dw 0x02CB ; 715 .dw 0x02D4 ; 724 .dw 0x02DC ; 732 .dw 0x02E5 ; 741 .dw 0x02ED ; 749 .dw 0x02F5 ; 757 .dw 0x02FD ; 765 50 .dw 0x0305 ; 773 .dw 0x030C ; 780 .dw 0x0313 ; 787 .dw 0x031A ; 794 .dw 0x0321 ; 801 .dw 0x0328 ; 808 .dw 0x032E ; 814 .dw 0x0335 ; 821 .dw 0x033B ; 827 .dw 0x0341 ; 833 60 .dw 0x0346 ; 838 .dw 0x034C ; 844 .dw 0x0351 ; 849 .dw 0x0357 ; 855 .dw 0x035C ; 860 .dw 0x0361 ; 865 .dw 0x0366 ; 870 .dw 0x036A ; 874 .dw 0x036F ; 879 tmprgridend: .dw 0x0373 ; 883 70 ;старт программы - инициализация Label_03: eor r1, r1 ;r1 в ноль out SREG, r1 ;в SREG ноль ;------------------------------------------ ;время включения ldi r16,15 ;мин sts WaterOn,r16 ldi r16,9 ;час sts WaterOn+1,r16 ;время отключения ldi r16,30 ;мин sts WaterOff,r16 ldi r16,11 ;час sts WaterOff+1,r16 ;маска дней недели ldi r16,0b00101100 sts MaskDoW,r16 ;байт маски дней недели ;время открытия одного крана в секундах ldi r16,low(15*60) ;мин sts WaterPer,r16 ldi r16,high(15*60) ;час sts WaterPer+1,r16 ;------------------------------------------- ;-------------------------------------------------------------------------- ;системные настройки ;определить стек ldi r28,low(RAMEND) ; ldi r29,high(RAMEND);конец рамы out SPH, r29 ; out SPL, r28 ;загрузить стек ;настройка уарта ldi R16,high(UBRR_value) ;устанавливаем скорость 9600 бод sts UBRR0H,R16 ldi R16,low(UBRR_value) sts UBRR0L,R16 ldi R16,0b10011000 ;прерывание по приему, разрешен прием и передача, 8 бит sts UCSR0B,R16 ldi R16, 0b10000110 ;работа с UCSR0C, асинхр, 8 бит, без контроля чет, 1 стоп sts UCSR0C,R16 ldi R16, 0x00 sts CntrRxD,r16 ;счетчик приемника в ноль sts TmNxBt,r16 ;таймер ожидания в 0 ldi R16, 0x04 ;4 байта на прием sts LnRxD,r16; ;Т1 настроить на 1 секунду ldi r16, 0b00000000 ; sts TCCR1A, r16 ;норм раб, OC1A отключен, OC1B отключен, WGM11 0, WGM10 0 ldi r16, 0b00001100 ;clk/256, WGM13 0, wgm12 1 sts TCCR1B, r16 ;предделитель 256 100, Clear Timer On Compare (Сброс по совпадению) по А 0100 ldi r16, 0b00000000 ;clk/256 sts TCCR1C, r16 ;предделитель ldi r16, high(OneSec) ; sts OCR1AH, r16 ;задать частоту 1гц ldi r16, low(OneSec) ; sts OCR1AL, r16 ;задать частоту по А ldi r16,high(OneSec/250/2) ; sts OCR1BH, r16 ;задать первый временной отступ по В половина 500гц ldi r16,low(OneSec/250/2) ;что бы каждое десятое не совпадало с прерыванием по секунде sts OCR1BL, r16 ;задать прерывание по В ldi r16, 0x06 ; sts TIMSK1, r16 ;прерывание по совпадению А и В ldi r16, 0x00 ; sts TIMSK2, r16 ; нет прерываний по т2 ;----------------------------------------------------------------- ;настройки по переферии ;настройка порта D ножки 2,3,4 для чтения времени с DS1302 in r16,DDRD sbr r16,(1< in r24,PINC sbr r24,(1< in r24,PINC sbr r24,(1< in r24,PINC cbr r24,(1< in r24,PINC cbr r24,(1< in r24,PINC cbr r24,(1< in r24,PINC cbr r24,(1< in r24,PINC cbr r24,(1< in r24,PINC sbr r24,(1<