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

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Vova777
Вымогатель припоя
Сообщения: 507
Зарегистрирован: Чт июн 16, 2011 15:06:10
Откуда: электрощитовая

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

Сообщение Vova777 »

При нажатии на кнопку 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                ;
; ============
даешь высокое напряжение
Реклама
Vova777
Вымогатель припоя
Сообщения: 507
Зарегистрирован: Чт июн 16, 2011 15:06:10
Откуда: электрощитовая

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

Сообщение Vova777 »

Мне кажется, она слишком долго зацикливается на этом участке:

Код: Выделить всё

Loop:                     ; формируем задержку
subi delay1, 1            ;
subi delay2, 0            ;
subi delay3, 0            ;
brcc Loop                 ;
ret
Программа из книжки, под кварц 4 МГц, что тут не так?
даешь высокое напряжение
Реклама
eufs
Опытный кот
Сообщения: 772
Зарегистрирован: Вс апр 10, 2011 02:24:06
Откуда: г.Северодонецк

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

Сообщение eufs »

У вас книжка неправильная.

Код: Выделить всё

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

Код: Выделить всё

subi delay3,0
бит переноса всегда сбрасывается
C0FFEE=‭12648430‬
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6312
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

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

Сообщение Jack_A »

eufs писал(а):У вас книжка неправильная.
Книжку, видимо, писал чукча-писатель, а не читатель ( даташитов ) . Вывод : книжка книжкой, но мозгу надо держать включенной.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение ChipKiller »

Jack_A писал(а):Книжку, видимо, писал чукча-писатель...
... к сожалению таких очень много и "плюс помощь типографии" при наборе текста :)
Реклама
Vova777
Вымогатель припоя
Сообщения: 507
Зарегистрирован: Чт июн 16, 2011 15:06:10
Откуда: электрощитовая

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

Сообщение Vova777 »

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

Код: Выделить всё

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

Код: Выделить всё

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

ChipKiller посмотрите, пожалуйста, там мой последний пост.
даешь высокое напряжение
Реклама
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»