AVR:Пример asm:Моргаем светодиодом — различия между версиями
Vooon (обсуждение | вклад) (Новая: Категория:Nix-06 Три способа поморгать светодиодом == Пример 1 == Аппаратный , с использованием таймер...) |
Vooon (обсуждение | вклад) |
||
(не показана 1 промежуточная версия этого же участника) | |||
Строка 1: | Строка 1: | ||
[[Категория:Nix-06]] | [[Категория:Nix-06]] | ||
+ | [[Категория:asm]] | ||
Три способа поморгать светодиодом | Три способа поморгать светодиодом | ||
Строка 171: | Строка 172: | ||
</source> | </source> | ||
− | [[Изображение: | + | [[Изображение:avr_primer_asm_1.gif]] |
Текущая версия на 23:27, 2 сентября 2007
Три способа поморгать светодиодом
Пример 1
Аппаратный , с использованием таймера\счетчика Т1 <source lang="asm"> .include "c:\...\m8def.inc"
.cseg .org 0
- ------------------ Вектора прерываний ---------------------------
rjmp PROG
- -----------------------------------------------------------------
- Начало программы
PROG: ;PROG
ldi R16,high(RAMEND) out SPH,R16 ldi R16,low(RAMEND) out SPL,R16 ldi R16,(1<<COM1A0) out TCCR1A,R16 ldi R16,(1<<CS10)|(1<<CS11) out TCCR1B,R16 sbi DDRB,1
- Конец программы (бесконечный цикл)
END_PROG: ;END PROG
rjmp END_PROG
</source>
Пример 2
По прерыванию от таймера\счетчика Т1 <source lang="asm"> .include "c:\...\m8def.inc"
.cseg .org 0
- ------------------ Вектора прерываний ---------------------------
rjmp PROG reti ; rjmp SUBI_INT0 reti ; rjmp SUBI_INT1 reti ; rjmp SUBI_TIMER2_COMPARE reti ; rjmp SUBI_TIMER2_OVERFLOW reti ; rjmp SUBI_TIMER1_INPUT reti ; rjmp SUBI_TIMER1_COMPARE_A reti ; rjmp SUBI_TIMER1_COMPARE_B rjmp SUBI_TIMER1_OVERFLOW reti ; rjmp SUBI_TIMER0_OVERFLOW reti ; rjmp SUBI_SPI reti ; rjmp SUBI_USART_RECEIVE reti ; rjmp SUBI_USART_DATA_EMPTY reti ; rjmp SUBI_USART_TRANSMIT reti ; rjmp SUBI_ADC reti ; rjmp SUBI_EEPROM reti ; rjmp SUBI_COMPARATOR reti ; rjmp SUBI_TWI reti ; rjmp SUBI_SPM
- -----------------------------------------------------------------
- Начало программы
PROG: ;PROG
ldi R16,high(RAMEND) out SPH,R16 ldi R16,low(RAMEND) out SPL,R16 ldi R16,(1<<TOIE1) out TIMSK,R16 ldi R16,$00 out TCCR1A,R16 ldi R16,(1<<CS10)|(1<<CS11) out TCCR1B,R16 sbi DDRB,1 clr R20 sei
- Конец программы (бесконечный цикл)
END_PROG: ;END PROG
rjmp END_PROG
- -----------------------------------------------------------------
;SUBI TIMER1_OVERFLOW
SUBI_TIMER1_OVERFLOW:
push R16 in R16,SREG push R16 inc R20 ;R20+ sbrc R20,1 ;IF R20.1=1 GOTO Label1 rjmp Label1 sbi PORTB,1 ;PORTB.1=1
LABEL1:
sbrs R20,1 ;IF R20.1=0 GOTO Label2 rjmp Label2 cbi PORTB,1 ;PORTB.1=0
LABEL2:
pop R16 ;END SUBI out SREG,R16 pop R16 reti
</source>
Пример 3
Программный,с использованием циклов задержек. <source lang="asm"> .include "c:\...\m8def.inc"
.cseg .org 0
- ------------------ Вектора прерываний ---------------------------
rjmp PROG
- -----------------------------------------------------------------
- Начало программы
PROG: ;PROG
ldi R16,high(RAMEND) out SPH,R16 ldi R16,low(RAMEND) out SPL,R16 sbi DDRB,1 ;DDRB.1=1 clr R20 clr R21
LABEL1:
dec R20 ;R20-
LABEL2:
dec R21 ;R21- call SUB_PAUSE ;GOSUB PAUSE cpi R21,$00 ;IF R21<>$00 GOTO Label2 brne Label2 cpi R20,$00 ;IF R20<>$00 GOTO Label1 brne Label1 sbi PORTB,1 ;PORTB.1=1
LABEL3:
dec R20 ;R20-
LABEL4:
dec R21 ;R21- call SUB_PAUSE ;GOSUB PAUSE cpi R21,$00 ;IF R21<>$00 GOTO Label4 brne Label4 cpi R20,$00 ;IF R20<>$00 GOTO Label3 brne Label3 cbi PORTB,1 ;PORTB.1=0 rjmp Label1 ;GOTO Label1
- -----------------------------------------------------------------
;SUB PAUSE
SUB_PAUSE:
NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP
ret ;END SUB </source>