AVR:Пример asm:Моргаем светодиодом

Материал из roboforum.ru Wiki
Перейти к: навигация, поиск


Три способа поморгать светодиодом


Пример 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>

Avr primer asm 1.gif