Установка значений регистра в PIC16F876 с использованием Hi Tech PICC - PullRequest
0 голосов
/ 23 января 2012

Я использую MPLABx и компилятор HI Tech PICC.Моя целевая микросхема - PIC16F876.Глядя на включаемый файл pic16f876.h, выясняется, что можно установить системные регистры микросхемы, ссылаясь на них по имени.

Например, в регистре CCP1CON, биты от 0 до 3установить, как работают модули CCP и PWM.Глядя на файл pic16f876.h, похоже, что можно ссылаться только на эти 4 бита, не меняя значения остальных регистров CCP1CON.

Однако я попытался сослаться наэти 4 бита различными способами, но безуспешно.

Я пробовал;

CCP1CON.CCP1M=0xC0; this results in "error: struct/union required
CCP1CON:CCP1M=0xC0; this results in "error: undefined identifier "CCP1M"

, но оба не удалось.Я прочитал руководство по компилятору Hi Tech PICC, но не могу понять, как это сделать.

Из файла pic16f876.h мне кажется, что я должен иметь возможность ссылаться на эти подмножества в системерегистрируется по имени, как они определены в файле .h.Кто-нибудь знает, как этого добиться?

Выдержка из pic16f876.h

// Register: CCP1CON
volatile unsigned char           CCP1CON             @ 0x017;
// bit and bitfield definitions
volatile bit CCP1Y               @ ((unsigned)&CCP1CON*8)+4;
volatile bit CCP1X               @ ((unsigned)&CCP1CON*8)+5;
volatile bit CCP1M0              @ ((unsigned)&CCP1CON*8)+0;
volatile bit CCP1M1              @ ((unsigned)&CCP1CON*8)+1;
volatile bit CCP1M2              @ ((unsigned)&CCP1CON*8)+2;
volatile bit CCP1M3              @ ((unsigned)&CCP1CON*8)+3;
#ifndef _LIB_BUILD
volatile union {
struct {
    unsigned    CCP1M               : 4;
    unsigned    CCP1Y               : 1;
    unsigned    CCP1X               : 1;
};
struct {
    unsigned    CCP1M0              : 1;
    unsigned    CCP1M1              : 1;
    unsigned    CCP1M2              : 1;
    unsigned    CCP1M3              : 1;
};
} CCP1CONbits @ 0x017;
#endif

1 Ответ

1 голос
/ 23 января 2012

Вам необходимо получить доступ к элементам битового поля через экземпляр структуры.В данном случае это CCP1CONbits.Поскольку это битовое поле, вам нужно иметь только количество значащих битов, определенных в битовом поле, а не полные восемь битов в вашем коде.

Итак:

CCP1CONbits.CCP1M = 0x0c;

Должно бытьэквивалент того, что вы пытаетесь сделать.Если вы хотите установить все восемь битов одновременно, вы можете использовать CCP1CON = 0xc0.Это установит биты CCP1M в 0x0c, а все остальные биты в ноль.

В заголовке, который вы дали, также есть отдельные битовые символы, так что вы можете сделать это тоже:

CCP1M0 = 1;
CCP1M1 = 1;
CCP1M2 = 0;
CCP1M3 = 0;

Хотябитовый подход чище.

...