# avr-asm lang=es explorando programación de microcontroladores avr a través de asm, en attiny85. {s-camino} # herramientas en debian-based: ``` sudo apt install gcc-avr avrdude avr-libc ``` # attiny85 => https://ww1.microchip.com/downloads/en/devicedoc/atmel-2586-avr-8-bit-microcontroller-attiny25-attiny45-attiny85_datasheet.pdf datasheet ## diagrama de pines ```diagrama de pines ┌──────┐ PB5 │1 8│ VCC PB3 │2 7│ PB2 PB4 │3 6│ PB1 GND │4 5│ PB0 └──────┘ ``` además, cada pin es: * 1: PB5 / PCINT5 / ~RESET / ADC0 / dW * 2: PB3 / PCINT3 / XTAL1 / CLKI / ~OC1B / ADC3 * 3: PB4 / PCINT4 / XTAL2 / CLKO / OC1B / ADC2 * 5: PB0 / MOSI / DI / SDA / AIN0 / OC0A / ~OC1A / AREF / PCINT0 * 6: PB1 / MISO / DO / AIN1 / OC0B / OC1A / PCINT1 * 7: PB2 / SCK / USCK / SCL / ADC1 / T0 / INT0 / PCINT2 para flashear nos interesan los pines desde el punto de vista de SPI: ```pines spi ┌──────┐ ~RESET │1 8│ VCC │2 7│ SCK │3 6│ MISO GND │4 5│ MOSI └──────┘ ``` ## programador => https://www.fischl.de/usbasp/ USBasp - USB programmer for Atmel AVR controllers (web) ### udev rule possible udev rule for e.g. /etc/udev/rules.d/80-usbasp.rules, por si las dudas. en principio no se debería necesitar. ``` ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="05dc", OWNER="user", GROUP="dialout", MODE="0777" ``` ## makefile para ensamblar y flashear ```makefile # Makefile # nombre del programa sin .S : PROG = test # config hardware BOARD = attiny85 PROGRAMMER = usbasp # ensambla programa a .hex hex: avr-gcc -Os -DF_CPU=8000000 -mmcu=$(BOARD) -c $(PROG).S avr-ld -o $(PROG).elf $(PROG).o avr-objcopy $(PROG).elf -O ihex $(PROG).hex rm $(PROG).o $(PROG).elf # flashea flash: avrdude -c $(PROGRAMMER) -p $(BOARD) -U flash:w:$(PROG).hex:i # lee la memoria flash a read.hex read: avrdude -c $(PROGRAMMER) -p $(BOARD) -U flash:r:read.hex:i # prueba conexión con programador y micro test: avrdude -c $(PROGRAMMER) -p $(BOARD) ``` # programas software experimental, compartido como referencia y sin garantía de ningún tipo :) ## test.S enciende un el pin PB0 — conecta un led ``` ; test.S ; enciende un pin #include .org 0x0000 ldi r17, (1< ; *********************** ; vectores de interrupts: ; *********************** ; Reset .org 0x0000 rjmp main ; *********************** ; Main ; *********************** .org 0x0010 main: ; pin PB0 (OC0A) como pin de salida ldi r16, (1< ; *********************** ; vectores de interrupts: ; *********************** ; Reset .org 0x0000 rjmp main ; *********************** ; Main ; *********************** .org 0x0010 main: ; pin PB0 (OC0A) como pin de salida ldi r16, (1< ; *********************** ; vectores de interrupts: ; *********************** ; Reset .org 0x0000 rjmp main ; dirección 0x0003 * 2 .org 0x0006 rjmp timer1compareA_isr ; dirección 0x0004 * 2 .org 0x0008 rjmp timer1overflow_isr ; *********************** ; Main ; *********************** .org 0x001E main: ;---------------------------------- ; configuración general ;---------------------------------- ; habilita interrupciones sei ; pin PB0 (OC0A) como pin de salida ldi r16, (1<