Всем привет !
Наблюдаю не способность мк avr attiny13 - отработать команду sbis или sbic в прерывание таймера.
Среда avr studio 4, симулятор proteus 8, отладочная плата attiny13 - на всякий случай проверяю в реальном железе.
Решил для закрепления навыков в программирование avr написать программу спец сигнал. Задаём режим работы таймера (Phase correct PWM)
В прерывание меняем число до скольки считать - сколько будет по времени выставлена 1, а сколько 0 в течение одного импульса
Решил добавить кнопочку - по нажатию которой будет менятся шаг модуля отсчета таймера - влияет на характер звука.
Возникла идея с экономить на обработке антидребезга. Нашёл место в программе - куда она попадает максимально редко - и там
проверять нажатие кнопки - это в прерывние таймера там есть условие которое выполняется через 10-15 срабатываний прерывания.
Но увы там это команда не срабатывает - может мк на время прерывания что-то отключает по чтению порта командый sbis ?
Команда sbis
-
neitrino777
- Родился
- Сообщения: 19
- Зарегистрирован: Вс сен 09, 2018 06:42:27
Команда sbis
Работа - продажа электронных компонентов. А для души - есть Ассемблер, дочка и сын.
- Реклама
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18546
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Команда sbis
рассказы о проблемах без приложения кода - пустая трата времени
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
-
Demiurg
- Это не хвост, это антенна
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
- Контактная информация:
Re: Команда sbis
С чего взято, что команды не работают? Как это проверено? На железе? В симуляторах? Доказательства и код в студию.
-
neitrino777
- Родился
- Сообщения: 19
- Зарегистрирован: Вс сен 09, 2018 06:42:27
Re: Команда sbis
*******************************************
.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 ;
.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 ;
Последний раз редактировалось neitrino777 Вс дек 01, 2019 19:19:22, всего редактировалось 1 раз.
Работа - продажа электронных компонентов. А для души - есть Ассемблер, дочка и сын.
-
Demiurg
- Это не хвост, это антенна
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
- Контактная информация:
Re: Команда sbis
Меня умиляет наивность начинающих ассемблерщиков. По выложеннойму портянке коду мы должны телепатировать и угадывать назначение устройства. Вы ТЗ изложите. Что за устройство, примерный алгоритм работы УСТРОЙСТВА (не программы!).
- Реклама
-
neitrino777
- Родился
- Сообщения: 19
- Зарегистрирован: Вс сен 09, 2018 06:42:27
Re: Команда sbis
Прошу прощения слишком рано задал вопрос. Разберусь. Не работает как я хотел в любом случае.
А идея была такая. Генерируется сигнал с постепенным увеличением а затем уменьшения периода импульса. А кнопка должна менять шаг увеличения периода.
Просто забавный звуковой эффект. В дальнейшим сигнал сглаживается - что больше походить на синусоиду
А идея была такая. Генерируется сигнал с постепенным увеличением а затем уменьшения периода импульса. А кнопка должна менять шаг увеличения периода.
Просто забавный звуковой эффект. В дальнейшим сигнал сглаживается - что больше походить на синусоиду
Работа - продажа электронных компонентов. А для души - есть Ассемблер, дочка и сын.
Re: Команда sbis
Может так.
Код: Выделить всё
rep: nop
sbis PINB,2 ;PB2
;sbis PORTB,2 ;PB2
dec period
rjmp rep ; ; Переход назад на 1 шаг - бесконечный цикл (программа работает по прерыванию таймера)-
neitrino777
- Родился
- Сообщения: 19
- Зарегистрирован: Вс сен 09, 2018 06:42:27
Re: Команда sbis
Спасибо большое AKL и всем кто потратил время на меня. Элементарная невнимательность - не тот регистор смотрел. (Летел крокодил - один зелёный другой на север)
Работа - продажа электронных компонентов. А для души - есть Ассемблер, дочка и сын.


