Все своими руками » Программа взаимодействия MAX6675 с микроконтроллером PIC






Программа взаимодействия MAX6675 с микроконтроллером PIC

PIC16F628A и MAX6675 по интерфейсу SPI

В статье пойдет разговор об одном из вариантов взаимодействия микроконтроллера PIC16F628A с микросхемой цифрового драйвера термопары — МАХ6675, на ассемблере. Микросхема имеет SPI интерфейс. Вообще давно хотелось сделать терморегулятор для старой, но до сих пор работающей духовки для выпечки пирогов. Все никак не мог определиться с датчиком температуры, но китайцы все решили за меня. Приобрел вот такой модуль на алиэкспресс.


MAX6675 модуль + K Тип термопары Senso Температура градусов модуль для arduino

Что такое SPI, вы можете прочитать в Сети. На эту тему есть очень много информации. Я же в данной статье постараюсь дать комментарии к выполнению кода программы получения данных о температуре с драйвера термопары МАХ6675.
Сначала посмотрим на фигуры 1а и 1b, взятые из документации на микросхему МАХ6675.

Протокол SPI
Рисунок 1а – протокол последовательного интерфейса. Рисунок 1б – синхронизация приема данных.

Исходя из этой информации, мы и будем генерировать на определенных шинах в определенные моменты времени необходимые логические уровни. Шина CS – прижатие шины к нулю воспринимается МАХ6675, как запрос на выдачу данных. SCK – шина тактовых импульсов. SO – шина вывода 16 бит информации. И так, сразу после инициализации регистров микроконтроллера на шине CS выставляем высокий уровень, вывод микроконтроллера, работающий на эту шину, конфигурируем на выход. На шине тактовых импульсов устанавливаем логический ноль, этот вывод контроллера также переключаем на выход. Вывод контроллера, работающего с шиной данных – SO, изначально конфигурируем, как цифровой вход. Для работы программы с МАХ6675 нам потребуются три регистра общего назначения. Count – регистр счетчика принятых байт, Dat_MAX6675_H – старший регистр данных, Dat_MAX6675_L – младший регистр данных, принятых с модуля температуры. Так же в программе присутствует замена текста:

1. #define   SCK  PORTA,3   2pin Выход тактовых импульсов
2. #define   CS   PORTA,4   ; 3pin Шина запроса на вывод данных
3. #define   SO   PORTA,5   ; 4pin Вход данных

PORTA,3 – полноценный вход/выход, PORTA,4 – вход и выход с открытым стоком. К этому выводу необходимо подключить подтягивающий резистор 5,1к. PORTA,5 – имеет только вход .

Все это хорошо, но программа уже подошла к тому месту, когда необходимо получить данные о температуре. Для начала мы записываем в регистр Count количество принимаемых байт – 16. Строки 86,87 к коде программы. В соответствии с фигурой 1b мы прижимаем шину CS, строка 88. Далее, хотя микросхема MAX6675 быстродействующая, делаем небольшую задержку на пару микросекунд, чтобы она успела сообразить, что от ее хотят (с китайцами глаз, да глаз нужен ). Две команды «nop» – строки 89, 90. Строка 91 – формируем передний фронт тактового импульса. Так как биты информации, полученные по последовательному интерфейсу с модуля, будем записывать в регистры Dat_MAX6675_L и Dat_MAX6675_Н путем сдвига влево с использованием флага переноса С, то сначала мы его сбросим – стр.92. Микросхема MAX6675 выводит информацию, начиная со старшего бита.

PIC16F628A и MAX6675 по интерфейсу SPI

Далее проверяем значение принимаемого бита на шине SO — стр.93. Если на шине «0», то по метке shift переходим на сдвиг регистров Dat_MAX6675_L и Dat_MAX6675_Н влево. Если же на шине «1», то мы переводим флаг «С» в единичное состояние, сдвигаем регистры и тогда в младший байт младшего регистра Dat_MAX6675_L запишется единица. После принятия бита информации формируем задний фронт тактового импульса – стр.98. Далее проверяем количество принятых бит – стр.99, если счетчик еще не обнулился, то по метке Read_data возвращаемся за следующим информационным битом. После принятия всех 16 бит мы отпускаем шину CS (стр.102), разрешая тем самым следующее преобразование температуры в код микросхемой MAX6675.

Сведения о температуре находятся в середине 16ти битового кода – биты 14 – 3. То есть 12 бит. 3 и 4 биты это десятые доли градуса, но учитывая страну рождения данного девайса и рабочую температуру в 250 градусов, я решил с долями не связываться. 15й бит является пустым и всегда равен нулю. Интересен 2й бит – имеет нулевое состояние, когда термопара подключена и «1», когда термопара в обрыве. В данной программе нет проверки его состояния. Назначение нулевого и первого бита я не знаю. Итог всего сказанного — нам нужно выделить десять байт температуры. Это биты 14-5.

Пример Т=+579, в bin -0000 0010 0100 0011, после приема с 6675 это будет выглядеть так -01001000 01100000. Воспользуемся инструкциями сдвига вправо с обнулением флага заема/переноса. Нам надо удалить в никуда пять младших байт. В регистр счетчика записываем 5 (стр.104, 105). Сбрасываем флаг переноса – стр.106. Сдвигаем регистры вправо пять раз и в итоге получаем в регистрах Dat_MAX6675_Н и Dat_MAX6675_L число, соответствующее начальному — 0000 0010 0100 0011. Теперь останется конвертировать в двоично-десятичное, а дальше вывести на тот или иной индикатор. Успехов. К.В.Ю.

Скачать файлы


.

.

Просмотров:2 899
Комментариев нет




Оставить комментарий