Задача
Считать от 0 до 99 с интервалом около секунды.
Микроконтроллер: ATmega8, кварц 4 МГц. Среда: Atmel Studio / avra (или avra / Atmel Studio). Как настроить среду и прошить контроллер — в статье программирование AVR.
Что понадобится
- ATmega8
- кварц 8 МГц + 2×22 пФ
- два индикатора
- 7 резисторов 330 Ом
- 2 транзисторных ключа
Схема подключения
| Вывод | Подключение |
|---|---|
| PB0…PB6 | сегменты |
| PD0 / PD1 | ключи разрядов |
Алгоритм
- Хранить единицы и десятки в отдельных регистрах.
- Около секунды непрерывно обновлять оба разряда.
- Увеличить единицы; при достижении десяти обнулить и увеличить десятки.
- При достижении ста сбросить счёт.
Листинг на ассемблере
Код проверен ассемблером и собирается без ошибок. Скачать: a13.asm · a13.hex (готовая прошивка).
;=======================================================
; Проект 13. Счётчик 0..99 на двух индикаторах
; ATmega8, 8 МГц. Сегменты PB0..PB6, разряды PD0 и PD1
;=======================================================
.include "m8def.inc"
.def temp = r16
.def tens = r17
.def ones = r18
.def d1 = r19
.def d2 = r20
.def loops = r21
.cseg
.org 0x0000
rjmp RESET
SEGTAB: .db 0b00111111, 0b00000110, 0b01011011, 0b01001111, 0b01100110
.db 0b01101101, 0b01111101, 0b00000111, 0b01111111, 0b01101111
RESET:
ldi temp, low(RAMEND)
out SPL, temp
ldi temp, high(RAMEND)
out SPH, temp
ldi temp, 0x7F
out DDRB, temp
ldi temp, 0x03
out DDRD, temp
clr tens
clr ones
MAIN:
ldi loops, 100 ; около секунды показа
SHOW:
rcall DIGITS
dec loops
brne SHOW
inc ones ; счёт с переносом
cpi ones, 10
brne MAIN
clr ones
inc tens
cpi tens, 10
brne MAIN
clr tens
rjmp MAIN
DIGITS:
cbi PORTD, PD1
mov temp, tens
rcall SEG
out PORTB, temp
sbi PORTD, PD0
rcall DELAY5MS
cbi PORTD, PD0
mov temp, ones
rcall SEG
out PORTB, temp
sbi PORTD, PD1
rcall DELAY5MS
ret
SEG:
ldi ZL, low(SEGTAB<<1)
ldi ZH, high(SEGTAB<<1)
add ZL, temp
clr temp
adc ZH, temp
lpm temp, Z
ret
DELAY5MS:
ldi d2, 52
V2: ldi d1, 255
V1: dec d1
brne V1
dec d2
brne V2
ret
Пояснения
- Хранение по разрядам избавляет от деления — у AVR его нет, а двоично-десятичный счёт решается парой сравнений.
- Пауза отсчитывается числом циклов индикации, поэтому дисплей не гаснет во время ожидания.
- Регистры счётчиков выбраны из старшей половины (r16 и выше) — только с ними работает команда
cpi.
Что дальше
Разобравшись с этим проектом, переходите к следующему в разделе проекты на PIC. Справочник по архитектуре и периферии контроллеров — на странице микроконтроллеры AVR.