2021-09-26 23:09:44 +03:00

61 lines
1.9 KiB
NASM

;
; Project name: led-blink-example
; Description: Blink an led every one second
; Source code: https://github.com/sergeyyarkov/attiny24a_led-blink-example
; Device: ATtiny24A
; Package: 14-pin-PDIP_SOIC
; Assembler: gavrasm v5.0
; Fuses: lfuse: 0xC2, hfuse: 0xDF, efuse: 0xFF, lock:0xFF
;
; Written by Sergey Yarkov 23.09.2021
.device ATtiny24A ; Setup device name
.list ; Enable listing
.macro init_stack_p ; Setup stack pointer
ldi @0, low(@1)
out SPL, @0
.endm
.equ LED_DIR = DDRA ; LED Direction
.equ LED_PORT = PORTA ; LED Port
.equ LED_PIN = PINA0 ; LED Pin
.org 0x00 ; Start program at 0x00
.cseg ; Code segment
main: ; Start up program
init_stack_p r16, RAMEND
rcall init_ports ; Initialize MCU ports
loop: ; Program loop
rcall toggle_led ; Toggle an LED
rcall delay_1s ; Delay for 1 sec
rjmp loop ; Jump to program loop again
toggle_led: ; Toggle an LED
eor r17, r16 ; Toggle bit
out LED_PORT, r17 ; Update port of LED
ret
init_ports: ; Init MCU ports
ldi r16, (1<<LED_PIN) ; Load to r16 high bit
out LED_DIR, r16 ; Set LED direction to output
ret
delay_1s: ; For 8Mhz frequency
.equ outer_count = 71
.equ inner_count = 28168
ldi r18, outer_count ; Load outer loop counter value
_reset: ; Load inner loop counter value
ldi r24, low(inner_count)
ldi r25, high(inner_count)
_loop: ; Delay loop ; e.g inner_count*(2+2)-1 = inner loop cycles
sbiw r24, 1 ; 2 cycles
brne _loop ; 2 cycles or 1
dec r18 ; 1 cycles
brne _reset ; 2 cycles or 1
ldi r18, outer_count
ret