Добрый вечер, Ни у кого нет программы на С++ для часов реального времени? Или что посоветуете при програмировании.
У меня есть 2 варианта программы на ассемблере:
; *****************************************************************************
; RTC, использующие сторожевой таймер
;
; Описание: Эта программа демонстрирует возможность реализации часов реального времени.
; В основной программе MSP430 переводится в режим LPM3.
; Сторожевой таймер формирует прерывание каждую секунду и переводит
; MSP430 в активный режим, который позволяет выполнить основную программу.
; Основная программа вызывает подпрограмму часов Clock и вновь переводит микроконтроллер в режим LPM3.
;
; Эта программа написана для микроконтроллера MSP430F1121, но легко может
; быть переработана для использования в любом микроконтроллере семейства MSP430.
;
; Для хранения информации о часах, минутах и секундах используются три регистра.
;
;*****************************************************************************
#include ”msp430x11x1.h” ; включить файл заголовков
; переменные RTC
#define SEC R13
#define MIN R14
#define HR R15
;–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
; Программа RESET
RSEG CODE
;–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
RESET
MOV #02FEh,SP ; Инициализация указателя стека
CALL #Setup ; Подготовка ЖКИ и основного таймера
; Основная программа
Mainloop
BIS #LPM3,SR ; Установка битов SR для режима LPM3
CALL #Clock ; обновление состояния часов
JMP Mainloop ; окончание основной программы
;–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
; Clock: обновление состояния переменных секунд, минут и часов (SEC, MIN и HR)
;
; Автор: Lutz Bierl.
;
; Эта подпрограмма, которая считает количество часов, минут и секунд.
; Она может использоваться с любым периферийным счетчиком любого микроконтроллера
; семейства MSP430, имеющим период переполнения 1 сек.
;
; Эта подпрограмма весьма специфическая. Она рассчитывает секунды, минуты
; и часы только в двоично-десятичном коде. При необходимости могут быть рассчитаны
; значения и в шестнадцатеричном коде.
;
; Среди примеров применения MSP430 имеются описания реализации часов реального
; времени, которые также рассчитывают и год с учетом коррекции високосного года.
;
;–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
Clock
SETC ; установка бита переноса
DADC.b SEC ; увеличение десятичного значения секунд
CMP.b #060h,SEC ; окончилась минута?
JLO Clockend ; нет, возврат
CLR.b SEC ; Да, очистка секунд
DADC.b MIN ; увеличение десятичного значения минут
CMP.b #060h,MIN ; прошло 60 минут?
JLO Clockend ; Нет, возврат
CLR.b MIN ; Да, очистка минут
DADC.b HR ; увеличение десятичного значения часов
CMP.b #024h,HR ; прошло 24 часа?
JLO Clockend ; Нет, возврат
CLR.b HR ; Да, очистка часов
Clockend
RET ;
;–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
; Setup: Настройка модулей и управляющих регистров
;–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
Setup
BIS.b #BIT0,&IE1 ; Разрешение прерывания от сторожевого таймера
MOV #WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL,&WDTCTL
; Остановка сторожевого таймера
; Установка интервала
; режима таймера и установка
; интервала прерывания
; 1 секунда с ACLK.
ClearRTC
MOV.b #00h,SEC ; Очистка секунд (SEC)
MOV.b #00h,MIN ; Очистка минут (MIN)
MOV.b #00h,HR ; Очистка часов (HR)
EINT ; Разрешение прерываний
RET ; установки выполнены
;–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
; Подпрограмма обработки прерывания от сторожевого таймера:
; ЦП просто переходит в активное состояние в RETI путем манипулирования битами SR
; в переменной SR, которая помещена в стек.
; Флаг прерывания очищается автоматически
;–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
WDINT
BIC #LPM3,0(SP) ; Очистка SR LPM3 битов в верхней части стека
RETI ;
;–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
RSEG INTVEC ; вектора прерываний
;–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
DW RESET ;
DW RESET ;
DW RESET ;
DW RESET ;
DW RESET ;
DW RESET ;
DW RESET ;
DW RESET ;
DW RESET ;
DW RESET ; Таймер Timer_A (CCIFG0)
DW WDINT ; Сторожевой таймер
DW RESET ;
DW RESET ;
DW RESET ;
DW RESET ; NMI, повреждение автогенератора
DW RESET ; POR, внешний сброс, сторожевой таймер
END
пример программы на ассемблере использующая таймер TIMER_A
; RTC, использующие таймер TIMER_A
;
; Описание: Эта программа демонстрирует возможность реализации часов реального времени.
; В основной программе MSP430 переводится в режим LPM3.
; Таймер Timer_A формирует прерывание раз в секунду, по которому
; MSP430 переходит в активный режим и оканчивает выполнение основной программы
; Основная программа вызывает подпрограммы Clock, а затем переводит микроконтроллер в режим LPM3.
;
; Эта программа написана для микроконтроллера MSP430F1121, но легко может
; быть переработана для использования в любом микроконтроллере семейства MSP430.
;
; Для хранения информации о часах, минутах и секундах используются три регистра.
;
;*****************************************************************************
;
#include ”msp430x11x1.h” ; включить файл заголовков определения
; переменных RTC
#define SEC R13
#define MIN R14
#define HR R15
;–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
; Программа RESET
RSEG CODE
;–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
RESET
MOV #02FEh,SP ; Инициализация указателя стека
CALL #Setup ; Подготовка ЖКИ и основного таймера
; Основная программа
Mainloop
BIS #LPM3,SR ; установка битов SR для режима LPM3
CALL #Clock ; обновление часов
JMP Mainloop ; окончание основной программы
;–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
; Clock: Обновление переменных секунд, минут и часов (SEC, MIN и HR)
;
; Автор Lutz Bierl.
;
; Эта подпрограмма, которая считает количество часов, минут и секунд.
; Она может использоваться с любым периферийным счетчиком любого микроконтроллера
; семейства MSP430, имеющим период переполнения 1 сек.
;
; Эта подпрограмма весьма специфическая. Она рассчитывает секунды, минуты
; и часы только в двоично-десятичном коде. При необходимости могут быть рассчитаны
; значения и в шестнадцатеричном коде.
;
; Среди примеров применения MSP430 имеются описания реализации часов реального
; времени, которые также рассчитывают и год с учетом коррекции високосного года.
;
;–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
Clock
SETC ; Установка бита переноса
DADC.b SEC ; увеличение десятичного значения секунд
CMP.b #060h,SEC ; Прошла одна минута?
JLO Clockend ; Нет, возврат
CLR.b SEC ; Да, очистка секунд
DADC.b MIN ; Увеличение десятичного значения минут
CMP.b #060h,MIN ; Прошло 60 минут?
JLO Clockend ; Нет, возврат
CLR.b MIN ; Да, очистка минут
DADC.b HR ; Увеличение десятичного значения часов
CMP.b #024h,HR ; Прошло 24 часа?
JLO Clockend ; Нет, возврат
CLR.b HR ; Да, очистка часов
Clockend
RET ;
;–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
; Setup: Настойка модулей и управляющих регистров
;–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
Setup
MOV #WDTPW+WDTHOLD,&WDTCTL ; Остановка сторожевого таймера
setupTA
MOV #TASSEL0+TACLR,&TACTL ; ACLK – источник для Timer_A.
BIS #CCIE,&CCTL0 ; Разрешение прерывания от CCR0.
MOV #07FFFh,&CCR0 ; загрузка в CCR0 значения 32,767.
BIS #MC0, &TACTL ; запуск TA в режиме ”up to CCR0”
ClearRTC
MOV.b #00h,SEC ; Очистка переменной SEC
MOV.b #00h,MIN ; Очистка переменной MIN
MOV.b #00h,HR ; Очистка переменной HR
EINT ; Разрешение прерываний
RET ;
;–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
; Подпрограмма обработки прерывания от таймера Timer_A:
; ЦП просто переходит в активное состояние в RETI путем манипулирования битами SR
; в переменной SR, которая помещена в стек.
; Флаг прерывания CCR0 очищается автоматически
;–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
CCR0INT
BIC #LPM3,0(SP) ; Очистка битов SR LPM3 переход в верх указателя стека
RETI ;
;–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
RSEG INTVEC ; Вектора прерываний
;–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
DW RESET ;
DW RESET ;
DW RESET ;
DW RESET ;
DW RESET ;
DW RESET ;
DW RESET ;
DW RESET ;
DW RESET ;
DW CCR0INT ; Таймер Timer_A (CCIFG0)
DW RESET ; Сторожевой таймер
DW RESET ;
DW RESET ;
DW RESET ;
DW RESET ; NMI, повреждение автогенератора
DW RESET ; POR, внешний сброс, сторожевой таймер
END
Что лучше использовать при программировании на С++ таймер TIMER_A или сторожевой таймер?И можно ли использовать какую нибуть из этих программ?