А вот код инкапсулирующий ЦАП
Код
#ifndef __DAC12_HPP__
#define __DAC12_HPP__
#include "430.hpp"
struct DAC12_CTL
{
bit DAC12GRP : 1; /* Группировка ЦАП12. Группируется DAC12_x с DAC12_х, имеющий следующий
* более высокий порядковый номер. 0 Нет группировки 1 ЦАП`ы сгруппированы */
bit DAC12ENC : 1; /* Включение преобразования ЦАП12. Этот бит включает модуль ЦАП12,
* когда DAC12LSELx>0. Когда DAC12LSELx=0, бит DAC12ENC игнорируется.
* 0 ЦАП12 выключен 1 ЦАП12 включен */
bit DAC12IFG : 1; /* Флаг прерывания ЦАП12 0 Прерывание не ожидается 1 Прерывание ожидается */
bit DAC12IE : 1; /* Разрешение прерывания от ЦАП12 0 Запрещено 1 Разрешено */
bit DAC12DF : 1; /* Формат данных ЦАП12 0 Натуральный двоичный 1 Формат с дополнением до двух */
bit DAC12AMP : 3; /* Настройка усилителя ЦАП12. Эти биты выбирают время установки в зависимости
* от потребляемого тока для входного и выходного усилителей ЦАП12
* DAC12AMPx Входной буфер Выходной буфер
* 000 Выключен ЦАП12 выключен, выход в высокоимпедансном состоянии
* 001 Выключен ЦАП12 выключен, на выходе 0В
* 010 Низкая скорость/ток Низкая скорость/ток
* 011 Низкая скорость/ток Средняя скорость/ток
* 100 Низкая скорость/ток Высокая скорость/ток
* 101 Средняя скорость/ток Средняя скорость/ток
* 110 Средняя скорость/ток Высокая скорость/ток
* 111 Высокая скорость/ток Высокая скорость/ток */
bit DAC12IR : 1; /* Входной диапазон ЦАП12.
* Этот бит устанавливает диапазон входного опорного напряжения и выходного напряжения.
* 0 Полный диапазон выходного напряжения ЦАП12 равен 3-х кратному опорному напряжению
* 1 Полный диапазон выходного напряжения ЦАП12 равен 1-но кратному опорному напряжению */
bit DAC12CALON : 1; /* Включение калибровки ЦАП12. Этот бит инициирует последовательность калибровки
* смещения ЦАП12 и сбрасывается автоматически после завершения калибровки.
* 0 Калибровка не выполняетс
* 1 Инициирование калибровки / выполняется калибровка */
bit DAC12LSEL : 2; /* Выбор загрузки ЦАП12. Выбирается сигнал запуска загрузки защелки ЦАП12. Для обновлени
* ЦАП должен быть установлен DAC12ENC, за исключением случая, когда DAC12LSELx=0.
* 00 Загрузка в защелку ЦАП12 выполняется при записи в DAC12_xDAT
* (DAC12ENC игнорируется)
* 01 Загрузка в защелку ЦАП12 выполняется при записи в DAC12_xDAT, или,
* когда используется группировка, при записи во все регистры DAC12_xDAT группы
* 10 Фронт сигнала c Таймера_А3.Выход1 (TA1)
* 11 Фронт сигнала c Таймера_B7.Выход2 (TB2) */
bit DAC12RES : 1; /* Выбор разрешения ЦАП12 0 12-разрядное разрешение 1 8-разрядное разрешение */
bit DAC12SREF : 2; /* Выбор опорного напряжения ЦАП12 00 VREF+ 01 VREF+ 10 VeREF+ 11 VeREF+ */
bit reserved : 1; /* Не используется */
};
__no_init volatile DAC12_CTL dac12_ctl[2] @ 0x01C0;
struct DAC12_DAT
{
unsigned int data :12; /* данные ЦАП */
unsigned int reserved : 4; /* Не используется */
};
__no_init volatile DAC12_DAT dac12_dat[2] @ 0x01C8;
class DAC12
{
byte n;
public:
DAC12(byte no) : n(no-1)
{}
enum grouping{ nogrp, grp};
void group(grouping g){ dac12_ctl[n].DAC12GRP = grp; } // группировка ЦАПов
void on( void) { dac12_ctl[n].DAC12ENC = 1; } // включение и
void off(void) { dac12_ctl[n].DAC12ENC = 0; } // выключение ЦАП
bit is_interrupt(void){ return dac12_ctl[n].DAC12IFG; } // Флаг прерывания ЦАП12
void enable_interrupt(){ dac12_ctl[n].DAC12IE = 1; } // Разрешение прерывания от ЦАП12
void disable_interrupt(){dac12_ctl[n].DAC12IE = 0; } // Запрет прерывания от ЦАП12
enum formats{ natural, up_to_two};
void data_format( formats fmt){ dac12_ctl[n].DAC12DF = fmt; } // Формат данных ЦАП12
/* не стал делать enum */
void amp_cust( byte a){ dac12_ctl[n].DAC12AMP = a; } // Настройка усилителя ЦАП12.
enum ranges{ x3, x1};
void range( ranges r){ dac12_ctl[n].DAC12IR = r; } // Входной диапазон ЦАП12.
void calibration(void){ dac12_ctl[n].DAC12CALON = 1; } // Включение калибровки ЦАП12.
enum run_signals{ DAC12_DAT, DAC12_DAT_or_group, A3_1, B7_2};
void sel_loading(run_signals s) { dac12_ctl[n].DAC12LSEL = s; } // Выбор загрузки ЦАП12.
enum permissions{ x12, x8};
void permission( permissions p){ dac12_ctl[n].DAC12RES = p; } // Выбор разрешения ЦАП12
enum reference_voltages{ VREF, VREF_, VeREF, VeREF_ };
void ref_volt( reference_voltages v){ dac12_ctl[n].DAC12SREF = v; } // Выбор опорного напряжения ЦАП12
int operator =( int value)
{ return dac12_dat[n].data = value & 0x0FFF; }
};
#endif
Обеспокоен Вашим молчанием, господа

. Хотелось бы узнать мнение компетентных специалистов.