Все, что нельзя запрограммировать на ассемблере, приходится паять.
Этот сайт посвящен моим проектам на PIC контроллерах, доступных для публичного освещения. Все приведенные схемы реализованы в железе и работают в настоящее время в быту или производстве.
Для написания программ использован пакет MPLAB/х , свободно распространяемый фирмой MICROCHIP.
Используется программатор PICKIT2/3, ICD2/3.
Любую конструкцию можно собрать самому, даже если она платная и получить бесплатно код разблокировки.
Также можно приобрести в качестве набора для сборки или готового изделия.
Принимаются заказы на разработку аналогово-цифровой или цифровой электроники, систем управления и электроники для производства с применением контроллеров.
Вопросы и предложения писать на почту Gennadiy.V@gmail.com
Если у Вас есть интересные предложения, закакзы или вопросы и форум Вам не помог - адрес тот же.
Описание и инструкция по применению.
Пример реализации обработчика прерываний модуля USB для недорогих контроллеров от Микрочип.
Дружба с USB началась с использования примера от Микрочипа "USB Device - CDC - Basic Demo - C18 - Low Pin Count USB Development Kit". Все было хорошо, но скомпилировать для работы на процессоре PIC18F13K50 не получилось вообще у меня. Применял PIC18F14K50, и тут вдруг потребовалось много ОЗУ для основной задачи. Переходить на PIC18F2455 / PIC18F2550 не хотелось да и по количеству ног PIC18F14K50 меня вполне устраивал. К тому же он дешевле.
Для изучения и отладки собрал макет по следующей схеме. Печатная плата не разводилась, достаточно было макетной платы.
Принципиальная схема макета (кликабельно)
Скачать в формате sPlan 7.0
Все началось с того ,что на просторах интернета встретились исходники на АСМ для PIC18F2550 USB стека.
После небольшой доработки напильником получилась данная программа обработки прерываний от модуля USB PIC18F14K50 / PIC18F13K50.
Распределение памяти:
;******************************************************************************
; RAM
;******************************************************************************
CBLOCK 0x000
;***************************
STATUS_USB ;состояние USB
STATUS_TEMP ;save STATUS register FOR LOW IRQ
WREG_TEMP ;save working register FOR LOW IRQ
BSR_TEMP ;save BSR register FOR LOW IRQ
FLAGS ;BIT FLAGS
LEN_DATA_READ_FROM_USB
;**************************
; пользовательские переменные
LOCAL_TEMP
LOCAL_TEMP1
LOCAL_TEMP2
ee_addr
ee_data
;**************************
;EMPTY
ENDC
;*********************************
CBLOCK 0x0100
;EMPTY
ENDC
;*********************************
CBLOCK 0x0200 ; FULL BUSY
BD0STAT_OUT ;0x00
BD0CNT_OUT
BD0ADRL_OUT
BD0ADRH_OUT
BD0STAT_IN ;0x04
BD0CNT_IN
BD0ADRL_IN
BD0ADRH_IN
BD1STAT_OUT ;0x08
BD1CNT_OUT
BD1ADRL_OUT
BD1ADRH_OUT
BD1STAT_IN ;0x0C
BD1CNT_IN
BD1ADRL_IN
BD1ADRH_IN
BD2STAT_OUT ;0x10
BD2CNT_OUT
BD2ADRL_OUT
BD2ADRH_OUT
BD2STAT_IN ;0x14
BD2CNT_IN
BD2ADRL_IN
BD2ADRH_IN
BD3STAT_OUT ;0x18
BD3CNT_OUT
BD3ADRL_OUT
BD3ADRH_OUT
BD3STAT_IN ;0x1C
BD3CNT_IN
BD3ADRL_IN
BD3ADRH_IN ;0x1F
TOCHKA_0_BUFF_IN :.8 ;0x20- ;0x27
TOCHKA_0_BUFF_OUT :.24 ;0x28- ;0x3F
TOCHKA_2_BUFF_OUT :.64 ;0x40- ;0x7F
INPUT_BUFFER :.64 ;0x80- ;0xDF TOCHKA_3 IN
OUTPUT_BUFFER :.64 ;0xC0- ;0xFF TOCHKA_3 OUT
ENDC
LEN_TOCHKA_0_BUFF_IN equ .8 ;0x20- ;0x27
LEN_TOCHKA_0_BUFF_OUT equ .24 ;0x28- ;0x3F
LEN_TOCHKA_2_BUFF_OUT equ .64 ;0x40- ;0x7F
LEN_INPUT_BUFFER equ .64 ;0x80- ;0xDF TOCHKA_3 IN
LEN_OUTPUT_BUFFER equ .64 ;0xC0- ;0xFF TOCHKA_3 OUT
;******************************************************************************
; структура флагов
;******************************************************************************
#define FLAG_DATA_USB_PRESENT FLAGS,0 ,AB ;
#define FLAG_DATA_SEND_TO_USB_OK FLAGS,1 ,AB;
#define FLAG_USB_CONFIGURED_STATE FLAGS,2 ,AB;
#define FLAG_PORT_OPEN FLAGS,3 ,AB ;
#define FLAG_NEED_SEND FLAGS,4 ,AB;
#define FLAG_5 FLAGS,5 ,AB ;
#define FLAG_6 FLAGS,6 ,AB ;
#define FLAG_7 FLAGS,7 ,AB;
;******************************************************************************
|
Банк 0 - использовано всего 6 ячеек
STATUS_USB - состояние USB, используется в прерывании
STATUS_TEMP, WREG_TEMP ,BSR_TEMP - сохранение важных регистров , если используются прерывания низкого приоритета.
FLAGS - битовый регистр, флаги текущего состояния
LEN_DATA_READ_FROM_USB - количество принятых байт от компьютера
Банк 1 свободен, для данных пользователя
Банк 2 полностью занят под USB (Buffer Descriptors, USB Data or User Data)
INPUT_BUFFER - буфер, длинной 64 байта, где будут принятые данные от компьютера
OUTPUT_BUFFER - буфер, длинной 64 байта, где будут данные для отпраки на компьютер
Флаги состояния
FLAG_DATA_USB_PRESENT - получены данные от компьютера.
Программа пользователя следит за этим флагом, если он установлен в "1" то в буфере INPUT_BUFFER , который имеет максимальную длину LEN_INPUT_BUFFER находятся принятые данные длинной LEN_DATA_READ_FROM_USB.
После обработки этих данных пользователь должен сбросить флаг FLAG_DATA_USB_PRESENT
FLAG_DATA_SEND_TO_USB_OK
Этот флаг сообщает пользователю, что данные были переданы на компьютер. Сбрасывается пользователем. В нашей тестовой программе пользователя не используется.
FLAG_USB_CONFIGURED_STATE
Этот флаг сообщает пользователю, что устройство подключено к компьютеру и на компьютере успешно установлен драйвер устройства.
Действий не требуется
FLAG_PORT_OPEN
Этот флаг сообщает пользователю, что на компьютере отрыт виртуальный СОМ порт этого устройства для обмена.
Теперь можно предавать данные на компьютер.
FLAG_NEED_SEND
Это флаг пользователя, когда данные готовы на отправку к компьютеру.
Конфигурирование и включение модуля USB
; ==========================================================
; *************** START ********************************
; ==========================================================
START
; ==========================================================
; Конфигурирование и включение модуля USB.
; ==========================================================
_INIT
CLRF STATUS_USB,AB ;СТАТУС USB
CLRF TRISA, AB
CLRF TRISB, AB ;НАСТРОЙКА ПОРТОВ
CLRF TRISC, AB
CLRF INTCON2, AB
CLRF PIE1, AB ;ЗАПРЕТ ПРЕРЫВАНИЙ TM2
CLRF PIE2, AB
CLRF IPR1, AB
CLRF CCP1CON,AB
CLRF ADCON0, AB
CLRF UCON, AB
CLRF SSPCON1, AB
CLRF T1CON, AB
CLRF T2CON, AB
CLRF T3CON, AB
MOVLW B'10010010'
MOVWF T0CON, AB ;TMR0 ВКЛЮЧЁН ПРЕДДЕЛИТЕЛЬ 8
CLRF BAUDCON, AB
MOVLW B'10100110' ;НАСТРОЙКА СКОРОСТИ ПЕРЕДАЧИ
MOVWF TXSTA, AB
MOVLW B'10100000'
MOVWF RCSTA, AB
MOVLW .00 ; 48MZ .155 19200 .25 115200 .12 230400 .00 3000000
MOVWF SPBRG, AB
MOVLW B'00010100'
MOVWF UCFG,AB
CLRF UIE,AB ; ЗАПРЕТИТЬ ПРЕРЫВАНИЯ
BSF UCON,USBEN,AB ;ВКЛЮЧИТЬ USB
CLRF UIR,AB
BSF UIE,URSTIE,AB
BCF RCON,IPEN,AB
BSF INTCON,IPEN,AB ;ВЫКЛЮЧЕНА ПРИОРИТЕТНАЯ СИСТЕМА
BSF INTCON,GIEL,AB
BSF IPR2,USBIP,AB
BSF PIE2,USBIE,AB ;РАЗРЕШИТЬ ПРЕРЫВАНИЯ
;********************
CLRF FLAGS , AB
;***********************************************************************
|
Эту часть придется отредактировать , если использовать другие модули процессора
Пример программы пользователя
;********************************************************************************************* ;USER ;********************************************************************************************* ;********************************************************************************************* BEGIN ;************** TEST READY FOR SEND ************************* ;ЗДЕСЬ НАЧИНАЕТСЯ ОСНОВНАЯ ПРОГРАММА ;ПРИМЕР ОТПРАВКИ ПАКЕТОВ В USB MOVLB 0X02 ;2 БАНК BTFSC 0X1C,7,BB ;ПРОВЕРКА ПРИНАДЛЕЖНОСТИ БУФЕРА 3 IN BRA BEGIN ;************** ; ПРОВЕРКА ПОДКЛЮЧЕННОГО usb И НАСТРОЕННОГО ДРАЙВЕРА НА КОМПЕ BTFSS FLAG_USB_CONFIGURED_STATE BRA BEGIN ;************** ; ПРОВЕРКА ОТКРЫТОГО com ПОРТА BTFSS FLAG_PORT_OPEN BRA BEGIN ;************** ;================================================================================== ;================================================================================== ; ДРАЙВЕР ПОДКЮЧЕН, ПОРТ ОТКРЫТ , МОЖНО ЧИТАТЬ И ПЕРЕДАВАТЬ ;================================================================================== ;================================================================================== ; какая то программа пользователя ;================================================================================== ; ПРОВЕРКА НА НАЛИЧИЕ ДАННЫХ , ПРИНЯТЫХ ПО USB BTFSS FLAG_DATA_USB_PRESENT BRA SKIP_PARSING_INPUT BCF FLAG_DATA_USB_PRESENT ;************** ; ЕСТЬ ДАННЫЕ В БУФФЕРЕ INPUT_BUFFER+.0 : INPUT_BUFFER+.63 ; ДЛИННОЙ LEN_DATA_READ_FROM_USB ;........ ; ОБРАБОТКА ВХОДНЫХ ДАНННЫХ ;........ BSF FLAG_NEED_SEND SKIP_PARSING_INPUT: ;================================================================================== ;================================================================================== ; какая то программа пользователя ;================================================================================== ;================================================================================== ; ПРОВЕРКА , НАДО ЛИ ПЕРЕДАВАТЬ ,ЕСЛИ НАДО , ЗАПОЛНЯЕМ БУФФЕР И ПЕРЕДАЕМ BTFSS FLAG_NEED_SEND BRA SKIP_SEND_TO_USB BCF FLAG_NEED_SEND ; ОТПРАВИМ НАЗАД MOVLW 0X02 ;КОЛЛИЧЕСТВО ОТПРАВЛЯЕМЫХ БАЙТ ОТ 0 ДО 64 БАЙТА ADDWF LEN_DATA_READ_FROM_USB,W,AB ANDLW b'00000111' ; ВСЕГО НЕ БОЛЕЕ 7 ДЛЯ ПРИМЕРА ;В WREG ЧИСЛО БАЙТ НА ОТПРАВКУ MOVWF BD3CNT_IN,BB ; ОТДАДИМ КОЛИЧКСТВО МОДУЛЮ usb ; ЗАПОЛНИМ БУФЕР OUTPUT_BUFFER+.0 : OUTPUT_BUFFER +.64 -- ДЛИНА 1-64 БАЙТА MOVLW ' ' ;ПЕРВЫЙ БАЙТ ПОСЫЛКИ В ДАННОМ СЛУЧАЕ ПРОБЕЛ MOVWF OUTPUT_BUFFER+.0,BB MOVF LEN_DATA_READ_FROM_USB,W,AB ;ВТОРОЙ БАЙТ ПОСЫЛКИ (ДЛИННА ) ADDLW 0x30 MOVWF OUTPUT_BUFFER+.1,BB ; СКОПИРУЕМ ЭХО ПЕРВЫЕ 5 MOVFF INPUT_BUFFER+.0, OUTPUT_BUFFER+.2 MOVFF INPUT_BUFFER+.1, OUTPUT_BUFFER+.3 MOVFF INPUT_BUFFER+.2, OUTPUT_BUFFER+.4 MOVFF INPUT_BUFFER+.3, OUTPUT_BUFFER+.5 MOVFF INPUT_BUFFER+.4, OUTPUT_BUFFER+.6 ;МОЖНО ОТПРАВЛЯТЬ CALL USB_SEND SKIP_SEND_TO_USB ;================================================================================== ;********************************************************************************** ;Остальная программа пользователя ;********************************************************************************** GOTO BEGIN ;********************************************************************************** ;********************************************************************************** |
Вот так все просто.
В итоге у нас имеется обработчик прерываний, который прозрачно для основной программы обеспечивает коммуникацию по USB.
Бонусом получено 500 байт свободного ОЗУ ( для PIC18F14K50).
В примере также есть подпрограммы задержки и чтения/ записи в EEPROM. Если использовать схему со светодиодами ,то при открытии порта на компьютере получим имитацию бегущего огня.
ПО распространяется под лицензией Freeware. Вы можете скачать с сайта схемы, инструкции, прошивки бесплатно.
Скачать исходник.
Скачать прошивку.
Скачать драйвер виртуального порта от Микрочипа.
Обсудить на форуме
Купить
USB PICµBASIC Mid Hardware
USB PICµBASIC LOGIC CONTROLLER
DDS генератор сигналов "OSKAR-DDS"
Термостол для оплавления паяльной пасты
Осциллограф Карманный "OSKAR" V3.1
Электроника и механика 3-х координатного станка ЧПУ (Hobby CNC)
Простой счетчик
Измеритель ESR и емкости конденсаторов
Самодельный установщик SMD компонентов - раскладочный станок "SMD PLACER V2"
Прибор для измерения частоты, емкости, индуктивности, сопротивления
Выключатель /диммер светодиодных лент с ДУ.
Светомузыка «СЕМИЦВЕТИК» + автомат световых эффектов.
Универсальный прибор для автомобиля. Часы, термометр, вольтметр, тахометр.