ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
5 июля
143148 Топик полностью
Сергей Борщ (23.12.2008 13:00, просмотров: 163) ответил kentawrik на Да, именно так я и привязываю - проблема в том что сделав например класс таймер - я не могу ему переопределить эти переменные. Проще макросами сделать получилось. Но остановился на простых теплэтэх...
Если он у вас "привязывается" к железу на этапе компиляции - посмотрите на шаблоны. #ifndef USCIB_H__ #define USCIB_H__ #include <io.h> #ifndef USCIA_H__ enum usci_module_t { USCI0, USCI1 }; #endif template <usci_module_t const module> class uscib_t { public: class uscb_ctl0_t /* USCI Bx Control Register 0 */ { public: uint8_t operator=(uint8_t value) { module == USCI0 ? UCB0CTL0 = value : UCB1CTL0 = value; return value; } uint8_t operator|=(uint8_t value) { module == USCI0 ? UCB0CTL0 |= value : UCB1CTL0 |= value; return value; } uint8_t operator&=(uint8_t value) { module == USCI0 ? UCB0CTL0 &= value : UCB1CTL0 &= value; return value; } operator uint8_t() { return module == USCI0 ? UCB0CTL0 : UCB1CTL0; } } static CTL0; class uscb_ctl1_t /* UCI Bx Control Register 1 */ { public: uint8_t operator=(uint8_t value) { module == USCI0 ? UCB0CTL1 = value : UCB1CTL1 = value; return value; } uint8_t operator|=(uint8_t value) { module == USCI0 ? UCB0CTL1 |= value : UCB1CTL1 |= value; return value; } uint8_t operator&=(uint8_t value) { module == USCI0 ? UCB0CTL1 &= value : UCB1CTL1 &= value; return value; } operator uint8_t() { return module == USCI0 ? UCB0CTL1 : UCB1CTL1; } } static CTL1; ......... }; #endif // USCIB_H__ template <uint8_t const address, usci_module_t module, dma_channel_t channel> class i2c_t { typedef uscib_t<module> USCIB; typedef dma_t<channel> DMA; public: static INLINE inline void on(); static INLINE inline void off(); ..... }; template <uint8_t const address, usci_module_t module, dma_channel_t channel> void i2c_t<address, module, channel>::on() { USCIB::CTL1 = UCSWRST; USCIB::CTL0 = 0 | (0 * UCA10) // 7-bit self address | (0 * UCSLA10) // 7-bit slave address | (0 * UCMM) // no multi-master | (1 * UCMST) // master | UCMODE_3 // I2C | (1 * UCSYNC) // sync mode ; USCIB::BR1 = (16000000UL / 400000UL) >> 8; USCIB::BR0 = (16000000UL / 400000UL) & 0xFF; USCIB::STAT = 0; // clear all flags USCIB::I2CSA = address; USCIB::CTL1 = 0 | UCSSEL1 | UCSSEL0 // SMCLK | UCTR // transmitter | (0 * UCSWRST) // release reset ; *(USCIB::PORT() + 3) |= USCIB::SDA_BIT | USCIB::SCL_BIT; //PxSEL } template <uint8_t const address, usci_module_t module, dma_channel_t channel> void i2c_t<address, module, channel>::off() { *(USCIB::PORT() + 3) &= ~(USCIB::SDA_BIT | USCIB::SCL_BIT); //PxSEL USCIB::CTL1 = UCSWRST; } ............ static i2c_t<I2C_address, USCI0, DMA2 > I2C;