STK500+ATmega8515 программа с таймером - AVR

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Прошу вашей помощи в написании программы для ATmega8515 на IAR ассемблере, я в этом деле новичек (студент). Необходимо написать программу переключения светодиодов с разными частотами. Нажатие на кнопку SB0 должно приводить к переключению индикатора LED0 с периодом 0.5 секунд, нажатие на кнопку SB1 - к переключению LED1 с периодом 2 секунды, нажатие на кнопку SB2 - к переключению индикатора LED2 с периодом 8 секунд. Для формирования прямоугольных импульсов с требуемым периодом повторения необходимо использовать 16-ти разрядный таймер/счетчик Т1 в режиме таймера.

Решение задачи: «STK500+ATmega8515 программа с таймером»

textual
Листинг программы
Flag1 BIT 24h.0
Flag2 BIT 24h.1
Flag11 BIT 24h.2
Flag22 BIT 24h.3
ORG 0
    LJMP start
ORG 003h
    SETB Flag11
    LJMP interupt
ORG 013h
    SETB Flag22
    LJMP interupt
ORG 0Bh         
    LJMP TICK0
ORG 1Bh         
    LJMP TICK1
ORG 100h
start:
    MOV A, #00000111B
    CLR C
    MOV p1, #00000000B
    MOV TMOD,#00010001B
    MOV IE,#10001010B
    MOV TL1,#11110000B
    MOV TH1,#11111111B
    SETB EX0
    SETB EX1
    SETB TR0
    JMP $
 
 
 
interupt:
    SETB TR1
    RETI
 
 
 
TICK1:
    CLR TR1
    MOV TL1,#11110000B
    MOV TH1,#11111111B
    JNB Flag11, Mark11
    XRL 24h, #00000001B
    CLR Flag11
    RETI
    Mark11:
    XRL 24h, #00000010B
    CLR Flag22
    RETI
 
TICK0:      
    DEC A
    JZ INVERT   
    RETI
INVERT:
    MOV A, #00000111B
    JNB Flag1, Mark1
    XRL p1,#00000001B
    Mark1:
    JNB Flag2, Mark2
    XRL p1,#00000010B
    Mark2:
    RETI
END

Объяснение кода листинга программы

  1. Объяснение: В данном коде используется язык ассемблера для программирования микроконтроллеров AVR.
  2. Код начинается с определения трех битовых флагов: Flag1, Flag2 и Flag11.
  3. Затем определяются три точки входа: start, interupt и TICK0.
  4. Функция start() инициализирует регистры микроконтроллера для работы с таймером.
  5. Функция interupt() обслуживает прерывания от таймера.
  6. Функция TICK0() обслуживает счетчик с меньшим таймером.
  7. Функция TICK1() обслуживает счетчик с большим таймером.
  8. Функция main() является бесконечным циклом, который запускается после инициализации.
  9. В функции TICK1() происходит проверка бита Flag11. Если он установлен, то происходит инвертирование битов Flag1 и Flag2.
  10. В функции TICK0() происходит уменьшение значения регистра A на единицу. Если оно достигнет нуля, то происходит инвертирование битов Flag1 и Flag2.
  11. Если бит Flag1 установлен, то происходит переход в функцию Mark1(). Если бит Flag2 установлен, то происходит переход в функцию Mark2().
  12. В функции Mark1() происходит проверка бита Flag2. Если он установлен, то происходит инвертирование бита Flag2.
  13. В функции Mark2() происходит инвертирование бита Flag1.
  14. В конце кода возвращается управление в функцию main().

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.25 из 5