Сергей Борщ (23.12.2008 13:00, просмотров: 182) ответил 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;