Часы PIC I2C с выхода таймера - PullRequest
0 голосов
/ 02 апреля 2019

Мне нужно связаться с устройством с помощью SMBus и отобразить SOC на семисегментном дисплее. Я использую PIC18F26K83. Семисегментный дисплей требует подключения I2C. Проблема в том, что я буду использовать 2 разных модуля I2C с 2 разными часами I2C. SMBus должен быть между 10 кГц и 100 кГц. Я использую тактовую частоту 8 МГц. С семисегментной частью дисплея я не могу заставить ее работать без установки регистра I2CxCLK в HFINTOSC (0010). Я попытался использовать TMR2 после масштабирования вывода для него. Код таймера ниже:

void InitTimer2(){

T2CLK =0b00000101; //500 kHz
T2CON.B7 = 1; //Timer 2 is on
T2CON.B3=0;
T2CON.B3=0;
T2CON.B3=0; //Timer 2 PostScaler = 1:2 (500/2 = 250 kHz)
T2CON.B3=1;
}

Затем я вызываю эту функцию InitTimer2 () в основном методе. После этого я выбираю I2CxCLK в качестве постмоделированного вывода TMR2 (0110). Тем не менее, это не работает ... Если я непосредственно установить I2CxCLK HFINTOSC, то это работает. (Во всех случаях частота MCU составляет 8 МГц). Итак, мои вопросы:

  1. Это правильная инициализация таймера?

  2. Влияет ли частота моего MCU на частоту таймера?

  3. Есть ли другие способы выбора тактовых сигналов I2C 100 кГц и 250 кГц с частотой микроконтроллера 8 МГц?

I2C clock selection register

1 Ответ

1 голос
/ 04 апреля 2019

Не должна быть функция InitTimer2, как указано ниже:

void InitTimer2(){

T2CLK =0b00000101; //500 kHz
T2CON.B7 = 1; //Timer 2 is on
T2CON.B3=0;
T2CON.B2=0;
T2CON.B1=0; 
T2CON.B0=1;  //Timer 2 PostScaler = 1:2 (500/2 = 250 kHz)
}

Также, пожалуйста, проверьте функцию PMD PIC.См. Стр.275 и стр.277 таблицы.Убедитесь, что TMR2MD = 0.

...