6. Der Code
6.1. Code Example 1 (Timer0)
This code toggles PD5 every 0.5s. The delay_timer0 subroutine uses Timer0 in CTC Mode with a 1024 prescaler and a compare value of 156, creating a 10ms hardware delay per call. This subroutine is called 50 times using software loop with R18 as the counter.
;------------------------
; Assembly Code
;------------------------
#define __SFR_OFFSET 0x00
#include "avr/io.h"
;------------------------
.global main
;===============================================================
main:
LDI R16, 0b00100000 ; to toggle PD5
LDI R17, 0b00000000
;--------------------------------------------
SBI DDRD, 5 ; set PD5 for o/p
OUT PORTD, R17 ; PD5 = 0
;--------------------------------------------
LDI R18, 50 ; set loop counter
l1: RCALL delay_timer0 ; apply delay via timer0
DEC R18
BRNE l1 ; & go back & repeat
;--------------------------------------------
EOR R17, R16 ; R17 = R17 XOR R16
OUT PORTD, R17 ; toggle PD5
LDI R18, 50 ; re-set loop counter
RJMP l1 ; go back & repeat toggle
;===============================================================
delay_timer0: ; ~10ms delay via Timer0
;---------------------------------------------------------
CLR R20
OUT TCNT0, R20 ; initialize timer0 with count=0
LDI R20, 156
OUT OCR0A, R20 ; OCR0 = 9
LDI R20, 0b00000010
OUT TCCR0A, R20
LDI R20, 0b00000101
OUT TCCR0B, R20 ; timer0: CTC mode, prescaler 1024
;---------------------------------------------------------
l2: IN R20, TIFR0 ; get TIFR0 byte & check
SBRS R20, OCF0A ; if OCF0=1, skip next instruction
RJMP l2 ; else, loop back & check OCF0 flag
;---------------------------------------------------------
CLR R20
OUT TCCR0B, R20 ; stop timer0
;---------------------------------------------------------
LDI R20, (1<<OCF0A)
OUT TIFR0, R20 ; clear OCF0 flag
RET
6.2. Code Example 2 (Timer1)
This code toggles PD5 every 0.5s (just like Code Example 1). The delay_timer1 subroutine uses Timer1 in Normal Mode with a 1024 prescaler and a preload value of 57724, creating a 500ms hardware delay per call.
;------------------------
; Assembly Code
;------------------------
#define __SFR_OFFSET 0x00
#include "avr/io.h"
;------------------------
.global main
;===============================================================
main:
LDI R16, 0b00100000 ; to toggle PD5
LDI R17, 0b00000000
;---------------------------------------------
SBI DDRD, 5 ; set PD5 for o/p
OUT PORTD, R17 ; PD5 = 0
;---------------------------------------------
l1: RCALL delay_timer1 ; 0.5 sec delay via timer1
;---------------------------------------------
EOR R17, R16 ; R17 = R17 XOR R16
OUT PORTD, R17 ; toggle PD5
LDI R18, 61 ; re-set loop counter
RJMP l1 ; go back & repeat toggle
;===============================================================
delay_timer1: ; 0.5 sec delay via timer1
;-------------------------------------------------------
.EQU value, 57724 ; value to give 0.5 sec delay
LDI R20, hi8(value)
STS TCNT1H, R20
LDI R20, lo8(value)
STS TCNT1L, R20 ; initialize counter TCNT1 = value
;-------------------------------------------------------
LDI R20, 0b00000000
STS TCCR1A, R20
LDI R20, 0b00000101
STS TCCR1B, R20 ; normal mode, prescaler = 1024
;-------------------------------------------------------
l2: IN R20, TIFR1 ; get TIFR1 byte & check
SBRS R20, TOV1 ; if TOV1=1, skip next instruction
RJMP l2 ; else, loop back & check TOV1 flag
;-------------------------------------------------------
LDI R20, 1<<TOV1
OUT TIFR1, R20 ; clear TOV1 flag
;-------------------------------------------------------
LDI R20, 0b00000000
STS TCCR1B, R20 ; stop timer1
RET
No comments to display
No comments to display