Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






ISC00 0 1 0 1 ;






ISC01 0 низ. 0 рез. 1 спад 1 фронт ;

Резерв ;

Резерв ; +----- SM 0-Idle mode 1-Power down ; ||+------ SE 0-запрет.спать 1-разреш.спать ; |+------- резерв ; +-------- резерв out MCUCR, TEMP ; ===========================Регистр компаратора======================= ldi TEMP, 0b10110000; Установка режима работы контроллера ;

ACIS0 0 1 0 1 ;

ACIS1 0 изм. 0 рез. 1 спад 1 фронт ;

Резерв ;

ACIE 0-запр.прер. 1-разр.прер. ; +----- ACI Флаг прерывания ; ||+------ ACO Выход компаратора ; |+------- резерв ; +-------- ACD 0-разр.комп. 1-запр.комп. out ACSR, TEMP ; =================================================================== ; Инициализация переменных ; Очистка регистров clr ZL clr TEMP MINIT0: st Z, TEMP inc ZL cpi ZL, 30 brne MINIT0 ; =================================================================== cli; Запретить все прерывания rjmp MAIN   ; /////////////////////////////////////////////////////////////////////////// ; Подпрограмма увеличения счетчика часов на 1 в двоично-десятичном коде (BCD) ; с переходом 23-> 0 ; /////////////////////////////////////////////////////////////////////////// CtChsInc: inc CtChs mov TEMPPP, CtChs andi TEMPPP, 0x0f cpi TEMPPP, 0x0a brne ChsIncR andi CtChs, 0xf0 ldi TEMPPP, 0x10 add CtChs, TEMPPP ChsIncR: cpi CtChs, 0x24 brne ChsIncE clr CtChs ChsIncE: ret   ; /////////////////////////////////////////////////////////////////////////// ; Подпрограмма увеличения счетчика минут на 1 в двоично-десятичном коде (BCD) ; с переходом 59-> 0 ; /////////////////////////////////////////////////////////////////////////// CtMinInc: inc CtMin mov TEMPPP, CtMin andi TEMPPP, 0x0f cpi TEMPPP, 0x0a brne MinIncR andi CtMin, 0xf0 ldi TEMPPP, 0x10 add CtMin, TEMPPP MinIncR: cpi CtMin, 0x60 brne MinIncE clr CtMin MinIncE: ret   ; /////////////////////////////////////////////////////////////////////////// ; Подпрограмма формирования N(час) импульсов в PB_час U0 ; /////////////////////////////////////////////////////////////////////////// ChsSerImp: mov TBin, CtChs andi TBin, 0x0f mov TBCDH, CtChs andi TBCDH, 0x30 swap TBCDH rcall BCDtoBIN cpi Tbin, 0 breq CSIEnd CSIloop: cbi PORTB, PB_U0; Нажать кнопку ЧАС rcall del05s; на 0, 5с dec Tbin brne CSIloop CSIEnd: sbi PORTB, PB_U0; Отпустить кнопку ЧАС ret   ; /////////////////////////////////////////////////////////////////////////// ; Подпрограмма формирования N(мин) импульсов в PB_мин U1 ; /////////////////////////////////////////////////////////////////////////// MinSerImp: mov TBin, CtMin andi TBin, 0x0f mov TBCDH, CtMin andi TBCDH, 0x70 swap TBCDH rcall BCDtoBIN cpi Tbin, 0 breq MSIEnd MSIloop: cbi PORTB, PB_U1; Нажать кнопку МИН rcall del05s; на 0, 5с dec Tbin brne MSIloop MSIEnd: sbi PORTB, PB_U1; Отпустить кнопку МИН ret   ; /////////////////////////////////////////////////////////////////////////// ; Подпрограмма задержки на 0, 5 сек ; /////////////////////////////////////////////////////////////////////////// del05s:; ret;;; ret для режима отладки ldi TEMPDEL, 16 del05s_loop: ldi TEMP, 0xFF-243; Предустановка таймера out TCNT0, TEMP del05s_wait: in TEMPPP, TCNT0 cpi TEMPPP, 0 brne del05s_wait   dec TEMPDEL brne del05s_loop ret   ; /////////////////////////////////////////////////////////////////////////// ; Подпрограмма задержки на 3 сек ; /////////////////////////////////////////////////////////////////////////// del3s: ldi TEMPDEL, 6 del3s_loop: dec TEMPDEL brne del3s_loop ret   ; @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; Подпрограммы записи/чтения данных по любому адресу CMOS ; @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; =================================================================== ; Подпрограмма записи данных по любому адресу в CMOS ; Вход: ZL-адрес TEMP-данные ; Выход: TIME ; Используются: Z, TEMP2, TEMP3 ; =================================================================== PPWRCMOS: mov TEMPPP, TEMP; сохранить данные I2CSTART; { СТАРТ } ldi TEMP, 0b10100000; { SLAVE+/W } rcall PPI2WRBYTE I2CRDBIT; { АСК } mov TEMP, ZL; { АДРЕС ЯП } rcall PPI2WRBYTE I2CRDBIT; { АСК } mov TEMP, TEMPPP; { ДАННЫЕ } rcall PPI2WRBYTE I2CRDBIT; { АСК } I2CSTOP; { СТОП } ret   ; =================================================================== ; Подпрограмма чтения данных по любому адресу из CMOS ; Вход: ZL-адрес ; Выход: TEMP-данные ; Используются: Z, TEMP2, TEMP3 ; =================================================================== PPRDCMOS: I2CSTART; { СТАРТ } ldi TEMP, 0b10100000; { SLAVE+/W } rcall PPI2WRBYTE I2CRDBIT; { АСК } mov TEMP, ZL; { АДРЕС ЯП } rcall PPI2WRBYTE I2CRDBIT; { АСК }   I2CSTART; { СТАРТ } ldi TEMP, 0b10100001; { SLAVE+ R } rcall PPI2WRBYTE I2CRDBIT; { АСК } rcall PPI2RDBYTE; данные читать mov TEMPPP, TEMP; и сохранить ldi TEMP2, 1 I2CWRBIT; { АСК write} I2CSTOP; { СТОП } mov TEMP, TEMPPP; данные восстановить ret   ; =================================================================== ; Подпрограмма передачи БАЙТА по интерфейсу I2C ; Вход: TEMP ; Выход: TEMP2 мл.бит=данные ; Используются: TEMP3 ; =================================================================== PPI2WRBYTE: ldi TEMP3, 8; 8 бит PPI2WRBY0:; Передача старшим битом вперед bst TEMP, 7; T=TEMP(бит7) bld TEMP2, 0; TEMP2(бит0)=T andi TEMP2, 1; Только бит 0 оставить I2CWRBIT; TEMP2 бит0=данные lsl TEMP; < -7...0< -0 dec TEMP3 brne PPI2WRBY0 ret   ; =================================================================== ; Подпрограмма приема БАЙТА по интерфейсу I2C ; Вход: TEMP2 мл.бит=данные ; Выход: TEMP ; Используются: TEMP3 ; =================================================================== PPI2RDBYTE: ldi TEMP3, 8; 8 бит clr TEMP; Очистить приемник PPI2RDBY0: I2CRDBIT; TEMP2 бит0=данные lsl TEMP; Сдвиг влево or TEMP, TEMP2; Накопить данные dec TEMP3; Проверить счетчик бит brne PPI2RDBY0 ret   ; =================================================================== ; Подпрограмма задержки на 5 мкс ; =================================================================== del5mks: ldi TEMPDEL, 14 del5mks_loop: dec TEMPDEL brne del5mks_loop ret ; @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@   ; /////////////////////////////////////////////////////////////////////////// ; Подпрограмма преобразования бинарного кода в двоично-десятичном код (BCD) ; /////////////////////////////////////////////////////////////////////////// BINtoBCD: clr TBCDH; Очистить MSD bBCD0: subi TBin, 10; вход = вход - 10 brcs bBCD1; прервать если заем inc TBCDH; MSD+1 rjmp bBCD0; повтор bBCD1: subi TBin, -10; воостановить 10 единиц ret   ; /////////////////////////////////////////////////////////////////////////// ; Подпрограмма преобразования двоично-десятичного кода (BCD) в бинарный код ; /////////////////////////////////////////////////////////////////////////// BCDtoBIN: BCDb0: subi TBCDH, 1; MSB=MSB - 1 brcs BCDb1; Если переноса нет subi Tbin, -10; выход = выход + 10 rjmp BCDb0; повторить BCDb1: clr TBCDH ret; Иначе выход ; ///////////////////////////////////////////////////////////////////////////   ; ########################## Начало программы ######## MAIN: cbi PORTB, PB_U2; Сброс часов на 1, 5 с rcall del05s rcall del05s rcall del05s sbi PORTB, PB_U2   sbic PIND, PD_SB1; Кнопка УСТ нажата? rjmp SetTime; Нет - установить время SetChs:; Да - установить CMOS rcall CtChsInc; Счетчик часов увеличить на 1 cbi PORTB, PB_U0; Нажать кнопку ЧАС rcall del05s; на 0, 5с sbis PIND, PD_SB1; Кнопка УСТ нажата? rjmp SetChs; Да - повтор ; Нет- установка минут sbi PORTB, PB_U0; Отпустить кнопку ЧАС rcall del3s; Задержка 3 сек   sbic PIND, PD_SB1; Кнопка УСТ нажата? rjmp SetWr; Нет- конец установки SetMin:; Да - установить CMOS rcall CtMinInc; Счетчик минут увеличить на 1 cbi PORTB, PB_U1; Нажать кнопку МИН rcall del05s; на 0, 5с sbis PIND, PD_SB1; Кнопка УСТ нажата? rjmp SetMin; Да - повтор sbi PORTB, PB_U1; Нет- Отпустить кнопку МИН SetWr:; Записать в CMOS время ; //////////////////////////////////////// ; Запись в CMOS минут и часов / ; //////////////////////////////////////// ldi ZL, 0x03; Адрес минут mov TEMP, CtMin; данные rcall PPWRCMOS; записать ; ldi ZL, 0x04; Адрес часов mov TEMP, CtChs; данные rcall PPWRCMOS; записать ; //////////////////////////////////////// rjmp ProgEnd; конец записи - спать SetTime:; Установка времени ; //////////////////////////////////////// ; Чтение из CMOS минут и часов ; //////////////////////////////////////// ldi ZL, 0x03; Адрес минут rcall PPRDCMOS; читать mov CtMin, TEMP; данные ; ldi ZL, 0x04; Адрес часов rcall PPRDCMOS; читать mov CtChs, TEMP; данные ; //////////////////////////////////////// rcall ChsSerImp; Выдать N(час) импульсов в PB_час U0 rcall MinSerImp; Выдать N(мин) импульсов в PB_мин U1 ProgEnd: sleep; Спать rjmp MAIN; В начало ; ##########################Конец программы#############################  






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.