Для работы USB в режиме High Speed нам понадобиться кварц на 12 МГц. Почему 12 МГц? Дело в том, что этот МК допускает работу с кварцами до 20 МГц, для USB нужно 48 МГц. Внутри МК есть аппаратный умножитель частоты на 4,
(4 * 12 МГц = 48МГц).
Для скорости Low Speed можно поставить кварц на 6 МГц.
Обсуждение выбора кварца смотрите здесь:USB в PIC18F14K50 на 6МГц.
-
#include <18F14K50.h>
-
-
#FUSES NOWDT //Без сторожевого
таймера
-
#FUSES WDT128 //Делитель сторожевого
таймера 1:128
-
#FUSES HS //Высокоскоростной
кварц (выше 4 МГц)
-
#FUSES NOFCMEN //Fail-safe clock
monitor disabled
-
#FUSES BROWNOUT //Сброс при опасном
снижении напряжения питания
-
#FUSES BORV19
-
#FUSES PUT //Таймер задержки
включения питания
-
#FUSES NOCPD //No EE protection
-
#FUSES STVREN //Перезагружать МК при
переполнении стека
-
#FUSES NODEBUG //No Debug mode for
ICD
-
#FUSES NOXINST //Extended set
extension and Indexed Addressing mode disabled (Legacy mode)
-
#FUSES NOWRT //Память программ не
защищена от записи
-
#FUSES NOWRTD //Data EEPROM not
write protected
-
#FUSES NOWRTC //configuration not
registers write protected
-
#FUSES IESO //Внутренний регулятор
питания включен
-
#FUSES NOEBTR //Memory not protected
from table reads
-
#FUSES NOEBTRB //Boot block not
protected from table reads
-
#FUSES NOMCLR //Master Clear pin
used for I/O
-
#FUSES NOPROTECT //Code not protected
from reading
-
#FUSES NOCPB //No Boot Block code
protection
-
#FUSES NOWRTB //Boot block not write
protected
-
#FUSES NOLVP //Режим низковольтного
программирования отключен
-
#FUSES NOHFOFST
-
#FUSES NOWRT0
-
#FUSES NOWRT1
-
#FUSES USBDIV1
-
#FUSES PCLKEN
-
#FUSES BBSIZ2K //2K words Boot Block
size
-
#FUSES PLLEN //Тактовая частота от кварца умножается на 4. Для USB нужна тактовая 48 МГц.
-
#FUSES CPUDIV4 //Тактовая частота ядра делится на 4
-
-
#use delay(clock=12M,RESTART_WDT) //Тактовая частота ядра 12 МГц
-
-
-
#use fast_io(A) // Работа с портами без переключения
-
#use fast_io(B) // каждый раз регистров TRIS
-
#use fast_io(C) //
-
-
-
//#define USB_CON_SENSE_PIN PIN_RA3 //Появление лог.1 на этой ножке дает знать USB-стеку, что МК подключили к USB хоста. Можно закомментировать данную сстроку и тогда стек будет считать что МК постоянно подключен к USB.
-
#include <usb_cdc.h>
-
-
void usb_dialog(void);
-
-
void main(void)
-
{
-
setup_spi(SPI_SS_DISABLED);
-
setup_wdt(WDT_OFF);
-
setup_timer_0(RTCC_INTERNAL);
-
setup_timer_1(T1_DISABLED);
-
setup_timer_2(T2_DISABLED,0,1);
-
setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
-
setup_comparator(NC_NC_NC);//
This device COMP currently not supported by the PICWizard
-
-
enable_interrupts(INT_EXT);
-
-
set_tris_b(0b01111111);
-
-
usb_init_cs();
-
usb_attach();
-
-
delay_ms(250);
delay_ms(250);
delay_ms(250);
delay_ms(250);
-
delay_ms(250);
delay_ms(250);
delay_ms(250);
delay_ms(250);
-
-
usb_cdc_putc("USB by
PIC18F14K50 working!!!\n\rPress any key");
-
-
while(1)
-
{
-
usb_task();
-
usb_dialog();
-
-
if (usb_cdc_carrier.dte_present)
//Готовность принимать данные
-
output_high(PIN_B7);
-
else
-
output_low(PIN_B7);
-
-
delay_ms(250);
-
}
-
}
-
-
void usb_dialog(void)
-
{ unsigned
char key;
-
-
// Тут будем вести пимитивный диалог. Подключительс к
этому
-
// виртуальному порту через HiperTerminal или другую
-
// терминальную программу на скорости 9600 кбит/с
-
-
if (usb_cdc_kbhit())
//Есть ли принятые данные в буфере?
-
{ key=usb_cdc_getc();
//Получем байт из буфера
-
usb_cdc_putc(key);
-
usb_cdc_putc("\n\r");
-
switch(key)
{
-
case '1'
: usb_cdc_putc("You
are selected Computer \n\r");
break;
-
case '2'
: usb_cdc_putc("You
are selected uController \n\r");
break;
-
case '3'
: usb_cdc_putc("You
are selected uComputer \n\r");
break;
-
default :
usb_cdc_putc("\n\rSelect
item:\n\r1. Computer\n\r2.
Microcontroller\n\r3. PDA\n\r>:");
break;
-
}
-
}
-
}
Итак! USB работает! Железка отвечает на наши вопросы! Далее дело только за Вашей фантазией! Удачи!
USB-шнур был сделан из куска коротенького (0.5м) USB-удлинителя, который неудачно (для себя) подвернулся под руку :)
Не заработало? Проверяем внимательно монтаж, полярность
USB D+/D-, сам кварц и др. Если все правильно, но при
подключении получаем сообщение "неопознанное USB-устройство",
то вполне возможно, что Ваш компилятор выставляет неправильное слово
конфигурации для PIC18F14K50. Я столкнулся с этим в
компиляторе CSS версий 4.093, 4.076.
После компиляции, перед прошивкой в микроконтроллер, я вручную изменял слово конфигурации. Для
приведеного выше примера я использовал следующую комбинацию фьюз: