Все, что нельзя запрограммировать на ассемблере, приходится паять.
Этот сайт посвящен моим проектам на 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. Вы можете скачать с сайта схемы, инструкции, прошивки бесплатно.
Скачать исходник.
Скачать прошивку.
Скачать драйвер виртуального порта от Микрочипа.
Обсудить на форуме
Купить