Я программирую PIC18F94K20 для работы в сочетании с кораблем MCP7941X I2C RTCC и устройством 24AA128 I2C CMOS Serial EEPROM. В настоящее время у меня есть код, который успешно инициализирует значения секунд/дней/и т. д. RTCC и запускает таймер, переключая светодиод при обороте каждую секунду.
Я пытаюсь расширить код, чтобы считывать правильные данные для этих значений, однако у меня возникают проблемы, когда я пытаюсь учесть различные «лишние» биты в значениях. Карта памяти может помочь несколько прояснить мою проблему:
Возьмем, к примеру, столбец часов или адрес 02h. Бит 6 устанавливается равным 1, чтобы переключать 12-часовое время, добавляя 01000000 к биту часов. Я могу прочитать все содержимое байта по этому адресу, но я хочу использовать оператор if, чтобы определить, используется ли время в 12 или 24 часа, и соответствующим образом настроить. Меня не беспокоят 10-часовые биты, так как я могу достаточно легко вычислить это с помощью цикла преобразования BCD (я думаю).
Ранее я использовал побитовый оператор ИЛИ в C, чтобы увеличить исходные данные часов до 24. Я инициализировал часы в этом конкретном случае до 0x11 и установил бит управления 12 часами, который равен 0x64. При установке времени:
WriteI2C(0x11|0x64);
который, как вы можете видеть, использует побитовое ИЛИ.
При считывании часов назад, как я могу включить операторы в свой код, чтобы отделить лишние биты от реальных битов времени? Я попытался сделать что-то вроде этого:
current_seconds = ReadI2C();
current_seconds = ST & current_seconds;
но это полностью все портит. Он компилируется, но устройство «зависает» на этой последовательности.
Как мне отделить биты ST / AMPM / VBATEN от фактических данных, которые мне нужны, и какой хороший метод реализации циклов for для различных обстоятельств, которые они представляют (например, чтение 12-часового времени, если бит 6 = 0). и 24 часа, если бит6 = 1, и т. д.).
Я немного новичок в C, и это мой первый опыт в электронике, поэтому я очень ценю любую помощь. Спасибо.
WriteI2C(0x11|0x64)
совсем не то, что вы говорите, как вы думаете, - 12-часовой бит 6 является десятичным64
, тогда как ваш шестнадцатеричный0x64
имеет биты 2, 5 и 6. В шестнадцатеричном формате правильное значение будет0x40
, или вы можете просто использовать побитовые сдвиги, чтобы получить то же значение:(1<<6)
- person Arkku   schedule 20.02.2014