Для исследования характеристик, которые можно будет получить с помощью микроконтроллерной приставки к ПК была применена плата от другого прибора, в которой был установлен микроконтроллер PIC16F877A, все порты которого были выведены не внешние соединения.
(рисунок взят из документации на микроконтроллер PIC16F877. www.microchip.com)
Для подключению к ПК был выбран COM порт, для согласования TTL уровней микроконтроллера и логических уровней порта RS232 была применена микросхема преобразователя MAX232:
(рисунок из документации на микросхему MAX232. www.maxim-ic.com)
Как внезапно оказалось, во время эксперимента не оказалось конденсаторов на 1,0 мкФ для обвязки MAX232, что вынудило установить вместо них керамические на 0,1 мкФ. Как показали испытания, микросхема смогла выдать уровни +/- 6В, что немного превышало "теоретический" порог в 0/+5В для COM порта. Связь с ПК на скорость 9600 кбит/с держалась без сбоев.
Схема подключения микроконтроллера получилась достаточно простая:
Вместо микроконтроллера PIC16F877A можно вполне установить значительно более дешевый PIC12F675 в 8-ми выводном корпусе. Выбор на PIC16F877A пал только ввиду его наличии на рабочем столе.
Для получения максимального быстродействия, управляющая программа была написана на Ассемблере. Исходный код приведен ниже.
Программа вначале проводит инициализацию нужных регистров, затем выдает в COM порт слово "Ready" и далее идет циклический опрос АЦП и передача значений сразу по RS232. Для предварительных проверок была выбрана низкая скорость работы - 9600 кбит/с. Дальше планируется поднять ее до 115 кбит/с. МК работал с кварцем на 4 МГц.
LIST p=16F877
#include "P16F877.INC"
w equ 0
f equ 1
; Переменные в ОЗУ
PauseBuffer equ 0x20
org 0
goto start ; (Start)
start
; Инициализация МК
; Первичная подготовка
bcf STATUS,RP0 ; Банк 0
bcf STATUS,RP1 ; Банк 0
clrf INTCON ; Запрет всех прерываний
; Инициализация порта А. PORTA0 - вход АЦП
clrf PORTA ; Очищаем опрт А
bsf STATUS,RP0 ; Банк 1
movlw b'11111111' ; Все ножки порта на вход
movwf TRISA
bcf STATUS,RP0 ; Банк 0
movlw b'11000001' ;
movwf ADCON0 ; Адресс 1Fh (банк 0)
bsf STATUS,RP0 ; Банк 1
movlw b'00000000' ; Сдвиг-влево; Опорное напряжение: питание и земля
movwf ADCON1 ; Адресс 9Fh (банк 1)
bcf STATUS,RP0 ; Банк 0
; Инициализация порта E.
clrf PORTE
bsf STATUS,RP0 ; Банк 1
movlw b'00000000' ; Все ножки порта на вход
movwf TRISE
movlw b'10111111' ;
movwf TRISC
bcf STATUS,RP0 ; Банк 0
; Установка прерывания по завершению преобразования АЦП
bcf PIR1,ADIF ; Сбразываем флаг прерывания (банк 0)
bsf STATUS,RP0 ; Банк 1
bsf PIE1,ADIE ; Включаем прерывание от АЦП (банк 1)
bsf INTCON,PEIE ; Включение прерывания от переферии (банк -)
; Настройка UART
movlw b'10100110' ; Передача 8 бит
movwf TXSTA ; Передатчик включен (банк 1)
; Асинхронный режим передачи
; Высокая скорость работы
bcf STATUS,RP0 ; Банк 0
movlw b'10010000' ; Последовательный порт включен
movwf RCSTA ; Передача - 8 бит (банк 0)
; Непрерывный прием выключен
; Адресс не проверяем
bsf STATUS,RP0 ; Банк 1
movlw 0x19 ; Скорость приема/передачи 2-125кбит/с;
movwf SPBRG ; 3-56кбит/с (банк 1)
bcf STATUS,RP0 ; Банк 0
; Все готовов
; Передаем по RS232 слово "Ready"
movlw 52h ; R
movwf TXREG ; (банк 0)
call WaitTX
movlw 65h ; e
movwf TXREG
call WaitTX
movlw 61h ; a
movwf TXREG
call WaitTX
movlw 64h ; d
movwf TXREG
call WaitTX
movlw 79h ; y
movwf TXREG
call WaitTX
; Теперь мы готовы к циклическому опросу АЦП
; Включаем прерывания
;bsf INTCON,GIE ; Глобальное разрешение прерываний
reADC ; Делаем паузу
call PauseForADC
bsf ADCON1,GO
btfsc ADCON1,GO
goto $-1
movf ADRESH,W
movwf TXREG
call WaitTX
goto reADC
goto $-1 ; Зависаем
WaitTX
bsf STATUS,RP0 ; Банк 1
btfss TXSTA,TRMT ; Ждем окончания передачи (банк 0)
goto $-1
bcf STATUS,RP0 ; Банк 0
return
PauseForADC
movlw 0xFF
movwf PauseBuffer
decfsz PauseBuffer
goto $-1
return
END;
20.02.2008