Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Тема закрыта

ATmega8L-8PU, программа-счетчик почему-то не работает.

Пн июн 11, 2012 14:20:43

При нажатии на кнопку PB0, программа должна изменять число, отображаемое на ЖК-индикаторе. Но обрабатывается только первое нажатие, число меняется с 0 на 1 и все, на дальнейшие нажатия она не реагирует. Почему?
Код:
; ******************************
; Автор: ххх                   *
; Дата: 11.06.2012             *
; Версия: 0.1                  *
; Имя файла: Indicator         *
; Для AVR: ATmega8L-8PU        *
; Тактовая частота: 4 МГц      *
; ******************************
; Выполняемые функции: Управление семисегментным ЖК-индикатором, функция подавления дребезга контактов
; ============
.device ATmega8
.nolist
.include "C:\Program Files\Atmel\AVR Studio 5.0\avrassembler\include\m8def.inc"
.list
; ============
; Блок объявлений
.def temp    = r16
.def counter = r17
.def delay1  = r16         ; так надо
.def delay2  = r18
.def delay3  = r19
; ============
; Начало программы
rjmp Init
; ============
; Подпрограммы
Debounce:                 ; инициализируем регистры счетчика числом 0x13880 (для четности добавляем 0: 0х013880)
ldi delay1, 0x80          ;
ldi delay2, 0x38          ;
ldi delay3, 0x01          ;

Loop:                     ; формируем задержку
subi delay1, 1            ;
subi delay2, 0            ;
subi delay3, 0            ;
brcc Loop                 ;
ret
; ============
Init:
; Тело программы
; ==========
; Подблок инициализации стека
ldi temp, low(ramend)     ;
out spl, temp             ;
ldi temp, high(ramend)    ;
out sph, temp             ;
; ==========

ser temp                  ;
out DDRD, temp            ; выходы
ldi temp, 0b11111110      ;
out DDRB, temp            ; PB0 - вход, остальные не используются

ldi r20, 0b01111110       ; код для цифры "0"
out PortD, temp           ; показать цифру "0"
ldi temp, 0b00000001      ;
out PortB, temp           ; PB0 - подтяжка, остальные не используются

ldi r21, 0b00110000       ; коды цифр индикатора
ldi r22, 0b01101101       ;
ldi r23, 0b01111001       ;
ldi r24, 0b00110011       ;
ldi r25, 0b01011011       ;
ldi r26, 0b01011111       ;
ldi r27, 0b01110000       ;
ldi r28, 0b01111111       ;
ldi r29, 0b01111011       ;
clr counter               ;
; ============
Start:
sbic PinB, 0              ;
rjmp Start                ; если нет
inc counter               ;

cpi counter, 10           ;
brne PC + 2               ; если нет
clr counter               ;

ldi ZL, 20                ;
add ZL, counter           ;
ld temp, Z                ;
out PortD, temp           ;
rcall Debounce            ; задержка

ReleaseWait:
sbis PinB, 0              ;
rjmp ReleaseWait          ; если нет
rcall Debounce            ; задержка
rjmp Start                ;
; ============

Re: ATmega8L-8PU, программа-счетчик почему-то не работает.

Пн июн 11, 2012 15:05:22

Мне кажется, она слишком долго зацикливается на этом участке:
Код:
Loop:                     ; формируем задержку
subi delay1, 1            ;
subi delay2, 0            ;
subi delay3, 0            ;
brcc Loop                 ;
ret

Программа из книжки, под кварц 4 МГц, что тут не так?

Re: ATmega8L-8PU, программа-счетчик почему-то не работает.

Вт июн 12, 2012 01:24:18

У вас книжка неправильная.
Код:
Loop:                     ; формируем задержку
subi delay1, 1            ;
SBCI delay2, 0            ;вычитаем ноль и бит переноса!
SBCI delay3, 0            ;
brcc Loop                 ;
ret

Иначе из цикла не выйдет,потому как
Код:
subi delay3,0
бит переноса всегда сбрасывается

Re: ATmega8L-8PU, программа-счетчик почему-то не работает.

Вт июн 12, 2012 10:55:42

eufs писал(а):У вас книжка неправильная.

Книжку, видимо, писал чукча-писатель, а не читатель ( даташитов ) . Вывод : книжка книжкой, но мозгу надо держать включенной.

Re: ATmega8L-8PU, программа-счетчик почему-то не работает.

Вт июн 12, 2012 11:44:43

Jack_A писал(а):Книжку, видимо, писал чукча-писатель...
... к сожалению таких очень много и "плюс помощь типографии" при наборе текста :)

Re: ATmega8L-8PU, программа-счетчик почему-то не работает.

Вт июн 12, 2012 14:14:17

eufs писал(а):У вас книжка неправильная.
Код:
Loop:                     ; формируем задержку
subi delay1, 1            ;
SBCI delay2, 0            ;вычитаем ноль и бит переноса!
SBCI delay3, 0            ;
brcc Loop                 ;
ret

Иначе из цикла не выйдет,потому как
Код:
subi delay3,0
бит переноса всегда сбрасывается

Спасибо большое, без вас я бы не смог разобраться. Я еще не умею правильно писать программы. На самом деле, в книжке ошибки не было. :facepalm: Это моя вина, я не увидел этого, по своей не внимательности не правильно написал. Просто эти команды так похожи... :facepalm:
А книжка называется: Джон Мортон. Микроконтроллеры AVR. Вводный курс, можете убедиться сами, ошибки там не было.
Извините... :facepalm:

ChipKiller посмотрите, пожалуйста, там мой последний пост.
Тема закрыта