Задание
Снять показания с датчика давления при помощи микроконтроллера PIC и передать их на другое устройство с помощью протокола SPI.
Лист замечаний
Оглавление
Задание. 2
Лист замечаний. 2
Введение. 2
Основная часть. 2
1 Подбор элементов. 2
1.1 Выбор микроконтроллера. 2
2 Программа для микроконтроллера. 2
2.1 Описание работы программы.. 2
2.2 Код программы: 2
2.3 Блок-схема. 2
Список использованных источников. 2
Введение
Использование в современном микроконтроллере «мощного» вычислительного устройства с широкими возможностями, построенного на одной микросхеме вместо целого набора, значительно снижает размеры, энергопотребление и стоимость построенных на его базе устройств.
Типичный микроконтроллер сочетает в себе функции процессора и периферийных устройств, содержит ОЗУ и/или ПЗУ. По сути, это однокристальный компьютер, способный выполнять простые задачи.
В данной работе подберём микроконтроллер, который отвечал бы всем нашим требованиям, и организуем передачу данных по протоколу SPI.
SPI - популярный интерфейс для последовательного обмена данными между микросхемами. Изначально он был придуман компанией Motorola, а в настоящее время используется в продукции многих производителей. Его наименование является аббревиатурой от 'Serial Peripheral Bus', что отражает его предназначение - шина для подключения внешних устройств. Шина SPI организована по принципу 'ведущий-подчиненный'. В качестве ведущего шины обычно выступает микроконтроллер, но им также может быть программируемая логика, DSP-контроллер или специализированная ИС. Подключенные к ведущему шины внешние устройства образуют подчиненных шины. Главным составным блоком интерфейса SPI является обычный сдвиговый регистр, сигналы синхронизации и ввода/вывода битового потока которого и образуют интерфейсные сигналы. Таким образом SPI - протокол обмена данными между двумя сдвиговыми регистрами, каждый из которых одновременно выполняет и функцию приемника, и функцию передатчика. Непременным условием передачи данных по шине SPI является генерация сигнала синхронизации шины. Этот сигнал имеет право генерировать только ведущий шины и от этого сигнала полностью зависит работа подчиненного шины.
Основная часть
Подбор элементов
Выбор микроконтроллера
Главным критерием выбора микроконтроллера для нашей задачи будет наличие АЦП, так как нам необходимо оцифровывать выходной сигнал с преобразователя давления.
Так же нам необходимо наличие не менее 4 портов ввода/вывода, три из них для передачи данных и один - для входящего сигнала с преобразователя давления.
Самый простой и дешёвый микроконтроллер PIC с АЦП это PIC12F675 (рисунок 1).
Рисунок 1 – выводы у микроконтроллера PIC12F675.
Схема подключения микроконтроллера к преобразователю показана на рисунке 2.
Рисунок 2 – схема устройства по приёму и передаче данных о давлении.
Программа для микроконтроллера
Описание работы программы
После включения МК происходит его настройка: устанавливаются предделители для таймеров, настройка портов и т.д.
Порт GP0 будет использоваться как аналоговый вход, к которому будет подключен преобразователь давления. Сам микроконтроллер должен быть установлен как можно ближе к преобразователю, чтобы исключить помехи на линии от преобразователя до АЦП.
Порт GP1 – порт передачи данных.
Порт GP2 – порт с синхронизующим сигналом.
Порт GP3 – не используется.
Порт GP4 – линия выбора ведомого.
Порт GP5 – выход сигнала на светодиод. Светодиод будет зажигаться во время преобразования на АЦП.
Чтобы гарантированно обеспечить высокий уровень на линях DATA (GP1) и SCLK (GP2), необходимы внешние подтягивающие резисторы.
2.2 Код программы:
list p=12f675; list directive to define processor
#include <p12f675.inc>; processor specific variable definitions
errorlevel -302; suppress message 302 from list file
__CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_ON & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT
;***** Определение переменных
w_temp EQU 0x20; variable used for context saving
status_temp EQU 0x21; variable used for context saving
addata EQU 0x22; регистр выходного значения АЦП
davlenie EQU 0x24; регистр со значением давления
T_ EQU 0x25; регистр с временем задержки
N_ EQU 0x26; количество передаваемых бит
;**********************************************************************
ORG 0x000; processor reset vector
goto main; go to beginning of program
ORG 0x004; interrupt vector location
izmerenie
BTFSC PIR1, ADIF; прерывание от АЦП?
goto zapis; да
BTFSS PIR1, TMR1IF; прерывание от Т1?
retfie; нет
BCF PIR1, TMR1IF; отчистить флаг прер-я от Т1
BSF ADCON0, GO_DONE; начать преобразование давления
; зажгём светодиод, который будет гореть во время работы АЦП
BSF GPIO, GP5
retfie
zapis
BCF GPIO, GP5; выключим индикатор работы АЦП
BCF PIR1, ADIF; отчистить флаг прер-я от АЦП
MOVF ADRESH, w; переносим данные из АЦП в буфер
MOVWF davlenie; записываем данные в регистр
CLRF PIR1; отчистим флаги всех прерываний
peredacha; передача значения давления с помощью SPI
MOVLW.8
MOVWF N_; счётчик передачи битов
BCF GPIO, GP4; сброс линии CS в 0
BSF STATUS, RP0; выбор 1-го банка
cikl
MOVLW.6
MOVWF T_; счётчик задержки = 6
RLF davlenie, 1; сдвиг влево регистра со значением давления
BTFSS STATUS, C
BCF TRISIO, 1; передача нуля
NOP; оставляем высокий уровень на линии, передача "1"
; либо для получения стабильного "0"
BSF TRISIO, 2; начало такта
vremja
DECFSZ T_, f; задержка такта на 17 мкс
; 5+5*2+2 = 17 мкс
goto vremja
BCF TRISIO, 2; конец такта
BSF TRISIO, 1; установка единицы на линии данных
DECFSZ N_, f
goto cikl
BCF STATUS, RP0; банк 0
retfie; выход из прерывания
; these first 4 instructions are not required if the internal oscillator is not used
main
call 0x3FF; retrieve factory calibration value
bsf STATUS,RP0; set file register bank to 1
movwf OSCCAL; update register with factory cal value
BCF STATUS, RP0; выбираем 0-й банк
; настройка МК
CLRF GPIO; отчистка портов
CLRF INTCON; выключаем все прерывания
;*** настройка ТАЙМЕРА 1 ***
; Переполение таймера через 0,52 с.
; 255*255*8=0,5202 с
CLRF T1CON; выключаем т1, сбрасываем предделитель
; внутренний такт. сигнал
CLRF TMR1H; Очистка старшего
CLRF TMR1L; и младшего разряда т1
BSF STATUS, RP0; выбираем 1-й банк
CLRF PIE1; выключаем прерывания от периферии
BCF STATUS, RP0; выбираем 0-ой банк
CLRF PIR1; очистка флагов от прерывания периферии
MOVLW b'00110101'; Предделитель 1:8, т1 вкл,
MOVWF T1CON; таймер 1 включен.
;*** конец настройки Т1 ***
BSF STATUS, RP0; выбираем 1-й банк
MOVLW b'00011000'; предделитель перед WDT, приращение TMR0 по фронту
MOVWF OPTION_REG
; настройка АЦП
MOVLW b'00011111'
MOVWF TRISIO; все порты настроены на вход, кроме GP5
BSF ANSEL, 5
BSF ANSEL, 4; 2-6 мкс на получения одного бита от АЦП
BSF ANSEL, 0; Аналоговый вход на GP0
BCF STATUS, RP0; выбираем 0-й банк
CLRF ADCON0
BSF ADCON0, ADON; включен АЦП
; конец настройки АЦП
MOVLW b'11000000'; разрешение глобальных прерываний и
MOVWF INTCON; прерываний от периферии
BSF INTCON, PEIE; прерывания от периферии вкл.
BSF INTCON, GIE; глоб. прер. вкл.
BSF STATUS, RP0; выбираем 1-й банк
BCF TRISIO, 2; низкий уровень сигнала SCLK
BSF PIE1, ADIE; прерывание от АЦП вкл.
BSF PIE1, T1IE; прерывание от Т1 вкл.
BCF STATUS, RP0; банк 0
loop
goto loop; ожидание прерывания от т1 или АЦП
; initialize eeprom locations
ORG 0x2100
DE 0x00, 0x01, 0x02, 0x03
END; directive 'end of program'
Блок-схема
Блок-схема обработки прерываний показана на рисунке 3.
Рисунок 3 – блок-схема обработки прерываний