CODE
#include <avr/io.h>
#include <avr/wdt.h>
#include <avr/power.h>
#define F_CPU 16000000UL
#include <util/delay.h>
int main()
{
DDRC |= 1 << DDC6; // Порт С - как выход
MCUSR &= ~(1 << WDRF);
wdt_disable();
clock_prescale_set(clock_div_1);
//CLKPR = 0x80; // Бит разрешение изменения делителя
//CLKPR = 0x00; // Установка делителя на 1 F = 16 MHz
PORTC |= (1 << PC6); // РС6 - зажечь диод
//REGCR = (1 << REGDIS);
UDIEN = 0x00; //
UDINT = 0x00; //
USBCON |= (1 << USBE);
USBCON &= ~(1 << FRZCLK);
PLLCSR |= (1 << PLLP0); // Установить делитель PLL
if ((PLLCSR & 0x1C) == 0x04)
PORTC = 0x00; // Потушить диод
PLLCSR |= (1 << PLLE); // Enable PLL
while((PLLCSR & 0x01) != 0x01) // Захват в петле PLL
PORTC = 0x00; // Потушить диод
PORTC |= (1<<PC6); // РС6 - зажечь диод
/*------Начало настройки нулевой КТ------*/
UENUM = 0x00; // Нулевая конечая точка
//UECONX |= 0x29; // Бит разрешения работы КТ + бит сброса переключения данных
UECONX |= (1 << STALLRQ);
UECONX |= (1 << EPEN); // Бит разрешения работы КТ + бит сброса переключения данных
//UECFG0X = 0x81; // Bulk, in
//UECFG0X = 0x00; // Control, out
//UECFG0X = 0x01; // Control, in
//UECFG1X = 0x36; // 64 байта, 2-ой банк, выделение буфера
UECFG1X = 0x32; // 64 байта, 1 банк, выделение буфера
//UECFG1X = 0x10; // 16 байт, 1 банк, очистка буфера
while ((UESTA0X & 0x80) != 0x80) // Проверка корректности настройки КТ
PORTC = 0x00; // Потушить диод, диод горит - КТ сформировалась корректно*/
/*------Конец настройки КТ------*/
PORTC |= (1<<PC6); // РС6 - зажечь диод
//UERST |= 0x01; // Сброс нулевой конечной точки
//UERST = 0x00; // Очистка, для завершения броса и начала использования FIFO.
UENUM = 0x00; // Выбор нулевой КТ
UDCON &= ~(1 << DETACH);
while((UDINT & 0x04) != 0x04)
PORTC = 0x00; // Потушить диод, ожидание флага Start of Frame
PORTC |= (1<<PC6); // РС6 - зажечь диод
UDINT &= ~(1 << SOFI);
while((UEINTX & 0x08) != 0x08)
PORTC = 0x00; // Потушить диод, ожидание пакета SETUP, бит RXSTPI
PORTC |= (1<<PC6); // РС6 - зажечь диод
while(1);
return 0;
}
#include <avr/wdt.h>
#include <avr/power.h>
#define F_CPU 16000000UL
#include <util/delay.h>
int main()
{
DDRC |= 1 << DDC6; // Порт С - как выход
MCUSR &= ~(1 << WDRF);
wdt_disable();
clock_prescale_set(clock_div_1);
//CLKPR = 0x80; // Бит разрешение изменения делителя
//CLKPR = 0x00; // Установка делителя на 1 F = 16 MHz
PORTC |= (1 << PC6); // РС6 - зажечь диод
//REGCR = (1 << REGDIS);
UDIEN = 0x00; //
UDINT = 0x00; //
USBCON |= (1 << USBE);
USBCON &= ~(1 << FRZCLK);
PLLCSR |= (1 << PLLP0); // Установить делитель PLL
if ((PLLCSR & 0x1C) == 0x04)
PORTC = 0x00; // Потушить диод
PLLCSR |= (1 << PLLE); // Enable PLL
while((PLLCSR & 0x01) != 0x01) // Захват в петле PLL
PORTC = 0x00; // Потушить диод
PORTC |= (1<<PC6); // РС6 - зажечь диод
/*------Начало настройки нулевой КТ------*/
UENUM = 0x00; // Нулевая конечая точка
//UECONX |= 0x29; // Бит разрешения работы КТ + бит сброса переключения данных
UECONX |= (1 << STALLRQ);
UECONX |= (1 << EPEN); // Бит разрешения работы КТ + бит сброса переключения данных
//UECFG0X = 0x81; // Bulk, in
//UECFG0X = 0x00; // Control, out
//UECFG0X = 0x01; // Control, in
//UECFG1X = 0x36; // 64 байта, 2-ой банк, выделение буфера
UECFG1X = 0x32; // 64 байта, 1 банк, выделение буфера
//UECFG1X = 0x10; // 16 байт, 1 банк, очистка буфера
while ((UESTA0X & 0x80) != 0x80) // Проверка корректности настройки КТ
PORTC = 0x00; // Потушить диод, диод горит - КТ сформировалась корректно*/
/*------Конец настройки КТ------*/
PORTC |= (1<<PC6); // РС6 - зажечь диод
//UERST |= 0x01; // Сброс нулевой конечной точки
//UERST = 0x00; // Очистка, для завершения броса и начала использования FIFO.
UENUM = 0x00; // Выбор нулевой КТ
UDCON &= ~(1 << DETACH);
while((UDINT & 0x04) != 0x04)
PORTC = 0x00; // Потушить диод, ожидание флага Start of Frame
PORTC |= (1<<PC6); // РС6 - зажечь диод
UDINT &= ~(1 << SOFI);
while((UEINTX & 0x08) != 0x08)
PORTC = 0x00; // Потушить диод, ожидание пакета SETUP, бит RXSTPI
PORTC |= (1<<PC6); // РС6 - зажечь диод
while(1);
return 0;
}