Страница 1 из 1

Команда sbis

Добавлено: Вс дек 01, 2019 08:36:34
neitrino777
Всем привет !
Наблюдаю не способность мк avr attiny13 - отработать команду sbis или sbic в прерывание таймера.
Среда avr studio 4, симулятор proteus 8, отладочная плата attiny13 - на всякий случай проверяю в реальном железе.
Решил для закрепления навыков в программирование avr написать программу спец сигнал. Задаём режим работы таймера (Phase correct PWM)
В прерывание меняем число до скольки считать - сколько будет по времени выставлена 1, а сколько 0 в течение одного импульса
Решил добавить кнопочку - по нажатию которой будет менятся шаг модуля отсчета таймера - влияет на характер звука.
Возникла идея с экономить на обработке антидребезга. Нашёл место в программе - куда она попадает максимально редко - и там
проверять нажатие кнопки - это в прерывние таймера там есть условие которое выполняется через 10-15 срабатываний прерывания.
Но увы там это команда не срабатывает - может мк на время прерывания что-то отключает по чтению порта командый sbis ?

Re: Команда sbis

Добавлено: Вс дек 01, 2019 10:18:15
ARV
рассказы о проблемах без приложения кода - пустая трата времени

Re: Команда sbis

Добавлено: Вс дек 01, 2019 17:39:54
Demiurg
С чего взято, что команды не работают? Как это проверено? На железе? В симуляторах? Доказательства и код в студию.

Re: Команда sbis

Добавлено: Вс дек 01, 2019 18:06:59
neitrino777
*******************************************
.include "tn13def.inc"
;****** РЕГИСТРЫ
.def tmp0=r16 ; используется везде
.def period=r17 ; Шаг увеличения длительности уровня сигнала

;*******************************************
rjmp RESET ;Reset Handle
reti ;Внешнее настраиваемое прерывание External InterruptO Vector Address
reti ;Внешнее прерывание по изменению состояния вывода External Interruptl Vector Address
reti ;Прерывание по переполнению таймера/счетчика 0
reti ;EE_READY_vect EEPROM готова
reti ;ANALOG_COMP_vect Аналоговый компаратор переключился
reti ;TIMER0_COMPA_vect Прерывание по сравнению, канал A таймера/счетчика 0
rjmp timer ;TIMER0_COMPB_vect Прерывание по сравнению, канал B таймера/счетчика 0
reti ;WDT_vect Сторожевой таймер (если используется в качестве источника прерывания)
reti ;ADC_vect Преобразование АЦП завершено

reset:
ldi tmp0, low(RAMEND) ; Стандартная инициализация стека
out SPL,tmp0
ldi tmp0,(0<<CS02)|(0<<CS01)|(1<<CS00)|(0<<WGM02) ; 1 - активации делителя таймера. Максимальный делитель 1024 - 1.2 мгц./1024 = 1171 гц.
out tccr0B,tmp0 ; Выставляем делитель на 1024, Задаём режим работы таймера (Phase correct PWM)
ldi tmp0,(1<<OCIE0B)|(0<<TOIE0) ; Включаем прерывания по сравнению с значениями OCIE0B и переполнение
out TIMSK0,tmp0
ldi tmp0,(1<<WGM00)|(1<<WGM01)|(0<<COM0B0)|(1<<COM0B1) ; Задаём режим работы таймера (WGM02 уже установили в 1, режим переключ ) ;
out tccr0A,tmp0 ;
ldi tmp0,(1<<DDB1)|(0<<DDB2) ; Шестую ногу порта на выход это OC0B и порт pb2 на вход для кнопки изменения периода
out DDRB,tmp0 ; Это - OCR0B - Выход B схемы сравнения таймера/счетчика T0
ldi tmp0,(1<<PB2)
out portb,tmp0 ; Нужно подтянуть вывод PB0 к + питания, что бы не ловил помехи - кнопку на землю
;ldi tmp0,240 ; Модуль отсчета, задание частоты переключения вывода OC0B, 6 ножка
;out OCR0B,tmp0 ; 128 даёт частоту 291 гц.
ldi period,10 ; Переменная period - регулирует шаг изменения отношения уровня 1 и 0 т.е. Он же ШИМ.
sei ; сколько будет по времени выставлена 1, а сколько 0 в течение одного импульса (прерыван таймера)
rep: nop
sbis PORTB,PB2
dec period
rjmp rep ; ; Переход назад на 1 шаг - бесконечный цикл (программа работает по прерыванию таймера)

; ************* ***********************
timer: brts uvelich ; проверяем флаг Т если установлен уходим на увеличение периода
sub tmp0,period ; Вычитание из TMP0 до скольки считать таймеру от 0 до 255, модуль отсчёта OCR0B
out OCR0B,tmp0 ; Заносим в регистор сравнения новое значение до скольки считать
brcs perenos ; проверяем флаг переноса если установлен - устанавливаем флаг Т
reti ; Возвращаемся из подпрограммы
perenos: set ; Фиксируем факт переноса флагом Т
;sbis PORTB,PB2 ; Смотрим состояние порта pb2 и пропускаем следующую команду еслии установлен в 1
;dec period ; Увеличиваем период если кнопка нажата, порт DDB0 в 1 устав. (дребезг должен компенсир прерыв по таймеру)
reti ; возвращаемся из прерывания
uvelich: add tmp0,period ; увеличиваем модуль отсчёта на величину периода (шаг прироста)
out OCR0B,tmp0 ;
brvs umenshen ; проверяем флаг переполнения - если установлен - сбрасываем свой флаг Т
reti
umenshen: clt
reti ;

Re: Команда sbis

Добавлено: Вс дек 01, 2019 18:39:01
Demiurg
Меня умиляет наивность начинающих ассемблерщиков. По выложеннойму портянке коду мы должны телепатировать и угадывать назначение устройства. Вы ТЗ изложите. Что за устройство, примерный алгоритм работы УСТРОЙСТВА (не программы!).

Re: Команда sbis

Добавлено: Вс дек 01, 2019 19:27:09
neitrino777
Прошу прощения слишком рано задал вопрос. Разберусь. Не работает как я хотел в любом случае.
А идея была такая. Генерируется сигнал с постепенным увеличением а затем уменьшения периода импульса. А кнопка должна менять шаг увеличения периода.
Просто забавный звуковой эффект. В дальнейшим сигнал сглаживается - что больше походить на синусоиду

Re: Команда sbis

Добавлено: Пн дек 02, 2019 04:48:47
akl
Может так.

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

rep: nop
	sbis PINB,2	;PB2
;sbis PORTB,2	;PB2
dec period
rjmp rep ; ; Переход назад на 1 шаг - бесконечный цикл (программа работает по прерыванию таймера)

Re: Команда sbis

Добавлено: Пн дек 02, 2019 05:53:53
neitrino777
Спасибо большое AKL и всем кто потратил время на меня. Элементарная невнимательность - не тот регистор смотрел. (Летел крокодил - один зелёный другой на север)