Uso atmega32u4 (arduino pro micro), alimentado desde usb.
En la ficha técnica de atmega32u4 pág. 267 se afirma:
Cuando se detecta un reinicio de USB en la línea USB (estado SE0 con una duración mínima de 2.5μs), el controlador realiza las siguientes operaciones:
• todos los puntos finales están deshabilitados
• el punto final de control predeterminado permanece configurado
Sin embargo, este ejemplo demuestra que el punto final de control está deshabilitado. ¿Cuál es la razón de ello?
#include <avr/io.h>
void main(void)
{
UHWCON |= 1 << UVREGE; /* enable internal USB pads regulator */
/* start pll */
PLLCSR |= 1 << PINDIV;
PLLCSR |= 1 << PLLE;
while (!(PLLCSR & (1<<PLOCK))) ;
/* start usb controller */
USBCON |= 1 << USBE;
USBCON &= ~(1 << FRZCLK);
/* configure control endpoint */
UENUM = 0;
UECONX |= 1 << EPEN;
UECFG0X = (0 << 6) | 0; /* control type, out direction */
UECFG1X |= (2 << 4) | (0 << 2); /* size 32, one bank */
UECFG1X |= 1 << ALLOC;
USBCON |= 1 << OTGPADE; /* enable VBUS pad */
while (!(USBSTA & (1 << VBUS))) ; /* wait until VBUS line detects power from host */
UDCON &= ~(1 << DETACH); /* pull up D+ (attach) */
while(1) {
if (!(UECFG1X & (1 << ALLOC))) {
DDRB |= 1 << PB0;
PORTB |= 1 << PB0;
}
}
}
Construir con:
avr-gcc -c -pipe -gdwarf-2 -g2 -mmcu=atmega32u4 -fshort-enums -fno-inline-small-functions -fpack-struct -Wall -fno-strict-aliasing -funsigned-char -funsigned-bitfields -ffunction-sections -I. -DF_CPU=16000000UL -mrelax -fno-jump-tables -x c -Os -std=gnu99 -Wstrict-prototypes test.c -o test.o
avr-gcc test.o -o test.elf -lm -Wl,-Map=test.map,--cref -Wl,--gc-sections -Wl,--relax -mmcu=atmega32u4
avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature test.elf test.hex