# avr-asm explorando programación de microcontroladores avr a través de asm, en attiny85. {s-camino} # attiny85 ## 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) ## 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< ./s-camino.gmi {s-camino}