Например TDA7294

Форум РадиоКот • Просмотр темы - Ассемблер (ASM) для AVR в вопросах и ответах
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Вт апр 16, 2024 10:13:04

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 7597 ]     ... , , , 313, , , ...  
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
СообщениеДобавлено: Пн сен 25, 2017 11:19:51 
Друг Кота
Аватар пользователя

Карма: 93
Рейтинг сообщений: 1351
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 14052
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
смотря как выходить
:roll:
можно и "комбинированным" способом через "подстановку вектора возврата"... изменение значения самого указателя стека...
там важнее вопрос - допускается или нет на том участке "вложенное" внешнее прерывание.
:roll:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
СообщениеДобавлено: Вс окт 01, 2017 06:19:15 
Первый раз сказал Мяу!

Зарегистрирован: Вс июн 19, 2016 06:31:18
Сообщений: 24
Рейтинг сообщения: 0
Всем спасибо за подсказку с этим "ldi r16, (1<<USIWMO)|(1<<USICS1)|(1<<USICLK)|(1<<USITC)" разобрался, в СИ то же пользуются таким приемом


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
СообщениеДобавлено: Вт окт 17, 2017 13:49:46 
Встал на лапы

Зарегистрирован: Вт мар 31, 2015 01:12:46
Сообщений: 89
Рейтинг сообщения: 0
Добрый день! Программа на АSM для тини2313 работает не совсем красиво, как того хотелось бы. Сразу скажу, в качестве практического развития пытаюсь сделать освещения на, как бы, модель автомобиля. Есть 4 кнопки, 4 пары св-диодов. Нажимаем кн1-вкл поворот влево, кн2- передний свет и т.д. Далее будет идти речь только о левом повороте и переднем освещении (для простоты и понятности изложения).
Чего хочется: есть две кнопки( с фиксацией). Нажимаем одну - первая пара св-диодов должна моргать (частота 1Гц). Нажимаем вторую кнопку - другая пара св-диодов должна просто засветится.
Что не получается: программа работает правильно, НО! не красиво... допустим, я нажал на кн1 и через долю секунды на кн2. Первая пара св-диодов загорелась, вторая пара тоже уже должна загореться, НО! МК в это время выполняет задержку для свечения первой пары, затем выключит первую пару и вновь 0,5секунды будет выполнять задержку и лишь затем включит мне вторую пару... и эта небольшая задержка во вкл 2-рой пары создает в моей душе неприятный осадок :( :cry: )))
У меня была идея :idea: по коду программы по чаще растолкать команду опроса вкл 2-рой пары, но... интуиция новичка мне подсказывает, что это не профессионально :))
Код программы:
;Инициализация портов
clr R16
out DDRD,R16
ser R16
out PORTD,R16

out DDRB,R16
clr R16
out PORTB,R16
;Основной цикл
MAIN:
check_L:sbis PIND,PIND0 ;Запрос вкл левой пары
rjmp left
cbi PORTB,7
cbi PORTB,6

check_F:sbis PIND,PIND1 ;Запрос вкл передней пары
rjmp frwrd
cbi PORTB,5
cbi PORTB,4
rjmp MAIN


left: sbi PORTB,7 ;Вкл левой пары
sbi PORTB,6
rcall delay_LR
cbi PORTB,7
cbi PORTB,6
rcall delay_LR
rjmp check_F

frwrd: sbi PORTB,5 ;Вкл передней пары
sbi PORTB,4
rjmp check_L
delay_LR:
; ===========
; delay loop generator
; 500000 cycles:
(Задержку вырезал да бы не засорять эфир)
ret

Спасибо за ответ!


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
СообщениеДобавлено: Вт окт 17, 2017 14:30:25 
Друг Кота
Аватар пользователя

Карма: 93
Рейтинг сообщений: 1351
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 14052
Откуда: ДОНЕЦК
Рейтинг сообщения: 1
4 кнопки (да еще и с фиксацией!) и 4 светика (группы светиков) это задача для релейно-контактной логики (не то чтоб для МК). Ну отсилы еще пару NE555...
8)
а тут "МК не справляется"...
:facepalm:


Вернуться наверх
 
Организация питания на основе надежных литиевых аккумуляторов EVE и микросхем азиатского производства

Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
СообщениеДобавлено: Вт окт 17, 2017 16:23:55 
Мудрый кот

Карма: 20
Рейтинг сообщений: 145
Зарегистрирован: Вс дек 25, 2016 08:34:54
Сообщений: 1849
Рейтинг сообщения: 1
dumbass писал(а):
Программа на АSM для тини2313...Чего хочется: есть две кнопки( с фиксацией). Нажимаем одну - первая пара св-диодов должна моргать (частота 1Гц). Нажимаем вторую кнопку - другая пара св-диодов должна просто засветится.
Я бы использовал таймер (частота 1Гц), в прерывании таймера изменял бы состояние первой пары св-диодов.
В основном цикле опрашивал бы кнопки без каких либо задержек, ну разве что на дребезг.
При опросе первой кнопки принимаем решение о запуске таймера или даем разрешение таймеру моргать первой парой св-диодов.
При опросе второй кнопки - зажигаем вторую пару св-диодов.
Где-то так.


Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
СообщениеДобавлено: Вт окт 17, 2017 16:59:42 
Встал на лапы

Зарегистрирован: Вт мар 31, 2015 01:12:46
Сообщений: 89
Рейтинг сообщения: 0
Спасибо за ответы!!!
С помощью NE555 не хочется решать так проблему. Хочется решить программно, а не аппаратно ( для того ж и изучаю МК :) )
Буду пытаться на таймерах... нужно только до них добраться их изучить как следует.
Спасибо за понятный алгоритм и видео, очень доходчиво и понятно.
Если получится, то обязательно поделюсь результатами :)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
СообщениеДобавлено: Ср окт 18, 2017 06:08:23 
Друг Кота
Аватар пользователя

Карма: 86
Рейтинг сообщений: 1018
Зарегистрирован: Чт апр 11, 2013 11:19:59
Сообщений: 4875
Откуда: Минск
Рейтинг сообщения: 0
Если с пониманием таймеров сложности, можно и без них. Просто не использовать полусекундные задержки, а дробить их на более короткие.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
СообщениеДобавлено: Ср окт 18, 2017 08:55:40 
Друг Кота
Аватар пользователя

Карма: 93
Рейтинг сообщений: 1351
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 14052
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
... Хочется решить программно, а не аппаратно ( для того ж и изучаю МК :) )...

Ну ежли только для учебы...
Есть буфер ввода (одновременно ВСЕ ВОЗМОЖНЫЕ комбинации кнопок) и есть буфер вывода (одновременно ВСЕ ВОЗМОЖНЫЕ комбинации включения светиков) есть таймер опроса и таймер инвертора... (независимо - программные или аппаратные).
Можно еще флажок добавить - разрешение работы инвертора.
Итогом - согласно статуса считанного состояния входных линий активируем соответствующие позиции выходных сигналов и флаг разрешения работы инвертора.
Порционно выпихиваем содержимое буфера вывода в порт вывода. А инвертор в ведомы ему моменты меняет статус нужных ему бит в буфере (пока ессно его работа разрешена флажком).
8)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
СообщениеДобавлено: Ср окт 18, 2017 23:08:12 
Друг Кота

Карма: 28
Рейтинг сообщений: 568
Зарегистрирован: Чт май 05, 2011 21:26:34
Сообщений: 4550
Откуда: Украина, Славутич
Рейтинг сообщения: 0
Надо просто правильно разбить программу на задачи. Сделайте так называемый суперцикл, который будет выполняться с заранее заданной задержкой - например 10мс. В этом цикле, смотрим на кнопки и выставляем в переменной "флажки". Задача простая как 5 копеек, не правда ли?
Вторая задача - на каждый флажок своя ветка в суперцикле, с немигающими фарами понятно - ничего дополнительно анализировать не надо, просто смотрим на КОНКРЕТНЫЙ флажок и включаем нужную пару светодиодов, или выключаем.
Немного сложнее с поворотами - для каждого из них заводишь дополнительную переменную счетчик - когда флажок поворота неактивен - принудительно гасим соответствующий светодиод и ОБНУЛЯЕМ его счетчик, если флажок активен - и счетчик равен нулю - меняем состояние светодиода на противоположное. Инкрементируем счетчик, и когда он достигает значения 100(или 50?) - сбрасываем. Всё.

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
СообщениеДобавлено: Чт окт 26, 2017 08:43:22 
Вымогатель припоя
Аватар пользователя

Зарегистрирован: Пт янв 18, 2013 15:11:02
Сообщений: 516
Рейтинг сообщения: 0
Всем привет, не могу справиться с банальной задачей - подключение компаратора и сделать так что бы он вошел в прерывание, из-за разности напряжения в 2 вольта, и подключил PORTB4 . Вот код на ассемблере, и снимок в протеусе.

Спойлер
Код:

// Команда для переименования регистров.
.def ZERO=R22;
.def XXX=R23;
.list; // Отоброжения листинга исполнения команды.
.cseg; работаем с програмной памятью а не озу или eeprom
.org 0; устанавливаем начальную позицию строки
rjmp START; Reset Handler
rjmp START; IRQ0 Handler
rjmp START;; PCINT0Z Handler
rjmp START; Timer0 Overflow Handler
rjmp START; EEPROM Ready Handler
rjmp Comparator; Analog Comparator Handler
rjmp ObrobotkaTIM0_COMPA; TIM0_COMPA CompareA Handler
rjmp START; Timer0 CompareB Handler
rjmp START; Watchdog Interrupt Handler
rjmp START; ADC Conversion Handler

//Оброботка прерывания от компаратора
Comparator:
CLI; команда запрещает глобальные прерывания.
cbi DDRB,4; - Устанавливаем порт как на выход,
sbi PORTB,4; - Подкючаем подтягивающий резистор для включения лампы
sei; - команда разрешает глобальные прерывания
reti; - Выход с под программы прерывания
//оброботка прерывания порта INT0, по высокому сигналу.


//Прерывания при совапдении таймера
ObrobotkaTIM0_COMPA:
inc XXX;
reti;

 /*Код установки таймера счетчика*/
TIMER:
/*
TIFR0 - регистр индикации флагов прерывания
TOV0 - флаг индикации по переполнению таймера
OCF0A,OCF0B - флаг индикации по совпадению.
OCR0A,OCR0B - регистр установки значения для совпадения.
TCCR0A - регистр управления A;
TCCR0B - регистр управления B;
*TIMSK0 - Регистр выбора режима срабатывания прерывания
TOIE0 - по переполнению, OCIE0A - по совпадению со значанием в регистре А,
OCIE0B - по совпадению со значанием в регистре B.
*/

ldi R16, (1<<OCIE0A);Установка режима по совпадению с А;
out TIMSK0, R16;
ldi R16, 0xFF; Устанавливаем значение при совпадении с А
out OCR0A, R16;
ldi R16, 0x00;// Сбрасываем все флаги таймера
out TIFR0, R16;
/*Скорость работы таймера выбираем СК/1024 - где СК - частота работы микроконтролера
в нашем случаи мы выставляем во fuces clkdiv8 что обеспечит нам частоту 9,6Мhz/8=1,2Mhz значит
скорость работы таймера будет 1,2Mhz/1024=1,17Khz что увеличивает счет значения. Чем меньше
частота тем большее время срабатывания до прерывания*/
ldi R16, (1<<CS02)|(0<<CS01)|(1<<CS00);
out TCCR0B, R16;

ret; //возврат из подпрограммы TIMER:

//Определяем начальные параметры микроконтролера.

START:

 CLI; команда запрещает глобальные прерывания.
 //инициализация стэка.(установка максимально размера ОЗУ);
 ldi R17, RAMEND;
 out SPL, R17;
 ldi ZERO, 0x00; //Присваеваем значение 0 переменной zero;
 
 //Отключаем аналогово-цифровой преобразователь
 CBI ADCSRA, ADEN;
//Подключаем компаратор для сравнения сигналов
////Команда CBI устанавливает значение в 0 регистра ACSR ячейки ASD что включает компаратор - по умолчанию он и так включен;
CBI ACSR, ACD;
//Команда SBI устанавливает значение в 1 регистра ACSR ячейки ACIE которая включает разрешения прерывания от компаратора.
SBI ACSR, ACIE;
//Устанавливаем условие генерации прерывания выставляем изменения сосотояния от 0 до 1;
sbi ACSR, ACIS1;
sbi ACSR, ACIS0;
//инициализация портов ввода вывод

//Устанавливаем работу портов на вход и выход.
//Устанавливаем выходы DDB1 и DDB0 работу на вход для компаратора
//Если порт DDB установлен в 1 то данный порт является входам,
//а если в 0 то выходам.
ldi R16,(0<<DDB5)|(0<<DDB4)|(0<<DDB3)|(0<<DDB2)|(1<<DDB1)|(1<<DDB0);
out DDRB, R16;
//Разрешаем глобальные прерывания
sei;
//Переходим к основному циклу проверки
rjmp START1;

START1:
nop;
rjmp START1;


Снимок в протеусе
СпойлерИзображение


Вложения:
Коту.png [27.85 KiB]
Скачиваний: 364
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
СообщениеДобавлено: Чт окт 26, 2017 10:48:51 
Друг Кота

Карма: 64
Рейтинг сообщений: 966
Зарегистрирован: Пт мар 07, 2008 06:54:43
Сообщений: 4220
Откуда: Ижевск
Рейтинг сообщения: 0
Код:
//Если порт DDB установлен в 1 то данный порт является входам,
//а если в 0 то выходам.
DDRx=1 это выход!
Желательно отключать цифровые входы от лап АС
Код:
 //Отключаем аналогово-цифровой преобразователь
; CBI ADCSRA, ADEN;
//Подключаем компаратор для сравнения сигналов
////Команда CBI устанавливает значение в 0 регистра ACSR ячейки ASD что включает компаратор - по умолчанию он и так включен;
;CBI ACSR, ACD;
//Команда SBI устанавливает значение в 1 регистра ACSR ячейки ACIE которая включает разрешения прерывания от компаратора.
;SBI ACSR, ACIE;
//Устанавливаем условие генерации прерывания выставляем изменения сосотояния от 0 до 1;
   LDI   R22,1<<ACIS1|1<<ACIS0|1<<ACIE
   OUT   ACSR,R22
   LDI   R22,1<<AIN1D|1<<AIN0D
   OUT   DIDR0,R22

;sbi ACSR, ACIS1;
;sbi ACSR, ACIS0


Последний раз редактировалось akl Чт окт 26, 2017 11:02:00, всего редактировалось 1 раз.

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
СообщениеДобавлено: Чт окт 26, 2017 10:59:57 
Вымогатель припоя
Аватар пользователя

Зарегистрирован: Пт янв 18, 2013 15:11:02
Сообщений: 516
Рейтинг сообщения: 0
А вот и нет. В книги написано:

Изображение


Вложения:
Коту2.png [56.18 KiB]
Скачиваний: 738
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
СообщениеДобавлено: Чт окт 26, 2017 11:04:28 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
А вот и нет. В книги написано:
Изображение

читайте оригинальные даташиты. в этой книжке ошибка.

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
СообщениеДобавлено: Чт окт 26, 2017 11:13:31 
Вымогатель припоя
Аватар пользователя

Зарегистрирован: Пт янв 18, 2013 15:11:02
Сообщений: 516
Рейтинг сообщения: 0
Ой спасибо действительно ошибка. Изначально все пины МК это входы, переделал код, проверил и все ровно компаратор не входит в прерывания. Что еще не так?

Спойлер
Код:

// Команда для переименования регистров.
.def ZERO=R22;
.def XXX=R23;
.list; // Отоброжения листинга исполнения команды.
.cseg; работаем с програмной памятью а не озу или eeprom
.org 0; устанавливаем начальную позицию строки
rjmp START; Reset Handler
rjmp START; IRQ0 Handler
rjmp START;; PCINT0Z Handler
rjmp START; Timer0 Overflow Handler
rjmp START; EEPROM Ready Handler
rjmp Comparator; Analog Comparator Handler
rjmp ObrobotkaTIM0_COMPA; TIM0_COMPA CompareA Handler
rjmp START; Timer0 CompareB Handler
rjmp START; Watchdog Interrupt Handler
rjmp START; ADC Conversion Handler

//Оброботка прерывания от компаратора
Comparator:
CLI; команда запрещает глобальные прерывания.
sbi PORTB,4; - Подкючаем подтягивающий резистор для включения лампы
sei; - команда разрешает глобальные прерывания
reti; - Выход с под программы прерывания
//оброботка прерывания порта INT0, по высокому сигналу.


//Прерывания при совапдении таймера
ObrobotkaTIM0_COMPA:
inc XXX;
reti;

 /*Код установки таймера счетчика*/
TIMER:
/*
TIFR0 - регистр индикации флагов прерывания
TOV0 - флаг индикации по переполнению таймера
OCF0A,OCF0B - флаг индикации по совпадению.
OCR0A,OCR0B - регистр установки значения для совпадения.
TCCR0A - регистр управления A;
TCCR0B - регистр управления B;
*TIMSK0 - Регистр выбора режима срабатывания прерывания
TOIE0 - по переполнению, OCIE0A - по совпадению со значанием в регистре А,
OCIE0B - по совпадению со значанием в регистре B.
*/

ldi R16, (1<<OCIE0A);Установка режима по совпадению с А;
out TIMSK0, R16;
ldi R16, 0xFF; Устанавливаем значение при совпадении с А
out OCR0A, R16;
ldi R16, 0x00;// Сбрасываем все флаги таймера
out TIFR0, R16;
/*Скорость работы таймера выбираем СК/1024 - где СК - частота работы микроконтролера
в нашем случаи мы выставляем во fuces clkdiv8 что обеспечит нам частоту 9,6Мhz/8=1,2Mhz значит
скорость работы таймера будет 1,2Mhz/1024=1,17Khz что увеличивает счет значения. Чем меньше
частота тем большее время срабатывания до прерывания*/
ldi R16, (1<<CS02)|(0<<CS01)|(1<<CS00);
out TCCR0B, R16;

ret; //возврат из подпрограммы TIMER:

//Определяем начальные параметры микроконтролера.

START:

 CLI; команда запрещает глобальные прерывания.
 //инициализация стэка.(установка максимально размера ОЗУ);
 ldi R17, RAMEND;
 out SPL, R17;
 ldi ZERO, 0x00; //Присваеваем значение 0 переменной zero;
 
 //Отключаем аналогово-цифровой преобразователь
 CBI ADCSRA, ADEN;
//Подключаем компаратор для сравнения сигналов
////Команда CBI устанавливает значение в 0 регистра ACSR ячейки ASD что включает компаратор - по умолчанию он и так включен;
CBI ACSR, ACD;
//Команда SBI устанавливает значение в 1 регистра ACSR ячейки ACIE которая включает разрешения прерывания от компаратора.
SBI ACSR, ACIE;
//Устанавливаем условие генерации прерывания выставляем изменения сосотояния от 0 до 1;
sbi ACSR, ACIS1;
sbi ACSR, ACIS0;
//инициализация портов ввода вывод

//Устанавливаем работу портов на вход и выход.
//Устанавливаем выходы DDB1 и DDB0 работу на вход для компаратора
//Если порт DDB установлен в 1 то данный порт является выходам,
//а если в 0 то входам.
ldi R16,(0<<DDB5)|(1<<DDB4)|(0<<DDB3)|(0<<DDB2)|(0<<DDB1)|(0<<DDB0);
out DDRB, R16;
//Разрешаем глобальные прерывания
sei;
//Переходим к основному циклу проверки
rjmp START1;

START1:
nop;
rjmp START1;




Протеус:
Спойлер[img]
download/file.php?id=295092
[/img]



Цитата:
Желательно отключать цифровые входы от лап АС


Попробовал как советовали выше:
Спойлер
Код:

// Команда для переименования регистров.
.def ZERO=R22;
.def XXX=R23;
.list; // Отоброжения листинга исполнения команды.
.cseg; работаем с програмной памятью а не озу или eeprom
.org 0; устанавливаем начальную позицию строки
rjmp START; Reset Handler
rjmp START; IRQ0 Handler
rjmp START;; PCINT0Z Handler
rjmp START; Timer0 Overflow Handler
rjmp START; EEPROM Ready Handler
rjmp Comparator; Analog Comparator Handler
rjmp ObrobotkaTIM0_COMPA; TIM0_COMPA CompareA Handler
rjmp START; Timer0 CompareB Handler
rjmp START; Watchdog Interrupt Handler
rjmp START; ADC Conversion Handler

//Оброботка прерывания от компаратора
Comparator:
CLI; команда запрещает глобальные прерывания.
sbi PORTB,4; - Подкючаем подтягивающий резистор для включения лампы
sei; - команда разрешает глобальные прерывания
reti; - Выход с под программы прерывания
//оброботка прерывания порта INT0, по высокому сигналу.


//Прерывания при совапдении таймера
ObrobotkaTIM0_COMPA:
inc XXX;
reti;

 /*Код установки таймера счетчика*/
TIMER:
/*
TIFR0 - регистр индикации флагов прерывания
TOV0 - флаг индикации по переполнению таймера
OCF0A,OCF0B - флаг индикации по совпадению.
OCR0A,OCR0B - регистр установки значения для совпадения.
TCCR0A - регистр управления A;
TCCR0B - регистр управления B;
*TIMSK0 - Регистр выбора режима срабатывания прерывания
TOIE0 - по переполнению, OCIE0A - по совпадению со значанием в регистре А,
OCIE0B - по совпадению со значанием в регистре B.
*/

ldi R16, (1<<OCIE0A);Установка режима по совпадению с А;
out TIMSK0, R16;
ldi R16, 0xFF; Устанавливаем значение при совпадении с А
out OCR0A, R16;
ldi R16, 0x00;// Сбрасываем все флаги таймера
out TIFR0, R16;
/*Скорость работы таймера выбираем СК/1024 - где СК - частота работы микроконтролера
в нашем случаи мы выставляем во fuces clkdiv8 что обеспечит нам частоту 9,6Мhz/8=1,2Mhz значит
скорость работы таймера будет 1,2Mhz/1024=1,17Khz что увеличивает счет значения. Чем меньше
частота тем большее время срабатывания до прерывания*/
ldi R16, (1<<CS02)|(0<<CS01)|(1<<CS00);
out TCCR0B, R16;

ret; //возврат из подпрограммы TIMER:

//Определяем начальные параметры микроконтролера.

START:

 CLI; команда запрещает глобальные прерывания.
 //инициализация стэка.(установка максимально размера ОЗУ);
 ldi R17, RAMEND;
 out SPL, R17;
 ldi ZERO, 0x00; //Присваеваем значение 0 переменной zero;
 
 //Отключаем аналогово-цифровой преобразователь
 CBI ADCSRA, ADEN;
//Подключаем компаратор для сравнения сигналов
LDI R22,1<<ACIS1|1<<ACIS0|1<<ACIE;
OUT ACSR,R22;

LDI R22,1<<AIN1D|1<<AIN0D;//Если какой-либо из входов ADC3-0 используется как аналоговый,
OUT DIDR0,R22;//то в соответствующий бит ADC3D-ADC0D нужно устанавливать логическую единицу.


//Устанавливаем работу портов на вход и выход.
//Устанавливаем выходы DDB1 и DDB0 работу на вход для компаратора
//Если порт DDB установлен в 1 то данный порт является выходам,
//а если в 0 то входам.
ldi R16,(0<<DDB5)|(1<<DDB4)|(0<<DDB3)|(0<<DDB2)|(0<<DDB1)|(0<<DDB0);
out DDRB, R16;
//Разрешаем глобальные прерывания
sei;
//Переходим к основному циклу проверки
rjmp START1;

START1:
nop;
rjmp START1;



Жаль но прерывания все равно нет.


Вложения:
Коту3.png [28.06 KiB]
Скачиваний: 358
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
СообщениеДобавлено: Чт окт 26, 2017 15:45:29 
Мудрый кот

Карма: 20
Рейтинг сообщений: 145
Зарегистрирован: Вс дек 25, 2016 08:34:54
Сообщений: 1849
Рейтинг сообщения: 0
Жаль но прерывания все равно нет.
У вас в схеме протеуса ошибка, состояние вывода PB0 не определено, поставьте на вывод PB0 резистор 10к на землю.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
СообщениеДобавлено: Чт окт 26, 2017 20:42:46 
Друг Кота

Карма: 28
Рейтинг сообщений: 568
Зарегистрирован: Чт май 05, 2011 21:26:34
Сообщений: 4550
Откуда: Украина, Славутич
Рейтинг сообщения: 0
и в программе недопустимые ошибки....
На старте не обязательно запрещать прерывания - они и так запрещены. В обработчике прерывания разрешать/запрещать прерывания НЕ НУЖНО, они запрещаются и разрешаться сами при входе в прерывание и выполнении команды RETI соответственно.

А вот что делать в прерывании КРАЙНЕ НЕ РЕКОМЕНДУЕТСЯ так это менять регистр статуса.
Ваша команда INC в обработчике прерывания таймера его меняет. Поскольку прерывание возникает в самый неожиданный момент выполнения программы, внезапное изменение регистра статуса может оказаться большим нежданчиком для программы и получишь постоянные глюки "из ниоткуда и везде".
Если в обработчике выполняется хоть одна команда изменяющая регистр статуса, его надо при входе в обработчик сохранить а перед выходом - освободить. Обычно для этого отводят отдельный регистр который больше нигде не используется - только в прерывании и только для хранения регистра статуса. Или если все регистры в ходу то сначала делаем PUSH любого регистра в стек и может использовать его в тех же целях, не забыв потом и этот регистр восстановить перед выходом из прерывания.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
СообщениеДобавлено: Пт окт 27, 2017 07:32:57 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
Alexeyslav писал(а):
а перед выходом - освободить
восстановить

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
СообщениеДобавлено: Пт окт 27, 2017 07:57:36 
Вымогатель припоя
Аватар пользователя

Зарегистрирован: Пт янв 18, 2013 15:11:02
Сообщений: 516
Рейтинг сообщения: 0
И все равно нет прерывания по компаратору, спасибо всем за советы учту.
Переделанный код согласно замечанием: Может кто свой небольшой пример на асемблере скинет, что бы компаратор уходил в прерывания.
Спойлер
Код:
/ Команда для переименования регистров.
.def ZERO=R22;
.def XXX=R23;
.list; // Отоброжения листинга исполнения команды.
.cseg; работаем с програмной памятью а не озу или eeprom
.org 0; устанавливаем начальную позицию строки
rjmp START; Reset Handler
rjmp START; IRQ0 Handler
rjmp START;; PCINT0Z Handler
rjmp START; Timer0 Overflow Handler
rjmp START; EEPROM Ready Handler
rjmp Comparator; Analog Comparator Handler
rjmp START; TIM0_COMPA CompareA Handler
rjmp START; Timer0 CompareB Handler
rjmp START; Watchdog Interrupt Handler
rjmp START; ADC Conversion Handler

//Оброботка прерывания от компаратора
Comparator:
sbi PORTB,4; - Подкючаем подтягивающий резистор для включения лампы
reti; - Выход с под программы прерывания
//оброботка прерывания порта INT0, по высокому сигналу.




//Определяем начальные параметры микроконтролера.

START:

 //инициализация стэка.(установка максимально размера ОЗУ);
 ldi R17, RAMEND;
 out SPL, R17;
 ldi ZERO, 0x00; //Присваеваем значение 0 переменной zero;
 
 //Отключаем аналогово-цифровой преобразователь
 CBI ADCSRA, ADEN;
//Подключаем компаратор для сравнения сигналов
LDI R22,1<<ACIS1|1<<ACIS0|1<<ACIE;
OUT ACSR,R22;

LDI R24,1<<AIN1D|1<<AIN0D;//Если какой-либо из входов ADC3-0 используется как аналоговый,
OUT DIDR0,R24;//то в соответствующий бит ADC3D-ADC0D нужно устанавливать логическую единицу.

//Устанавливаем работу портов на вход и выход.
//Устанавливаем выходы DDB1 и DDB0 работу на вход для компаратора
//Если порт DDB установлен в 1 то данный порт является выходам,
//а если в 0 то входам.
ldi R16,(0<<DDB5)|(1<<DDB4)|(0<<DDB3)|(0<<DDB2)|(0<<DDB1)|(0<<DDB0);
out DDRB, R16;

//Разрешаем глобальные прерывания
sei;
//Переходим к основному циклу проверки
rjmp START1;

START1:
nop;
rjmp START1;


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
СообщениеДобавлено: Пт окт 27, 2017 08:13:08 
Мудрый кот

Карма: 20
Рейтинг сообщений: 145
Зарегистрирован: Вс дек 25, 2016 08:34:54
Сообщений: 1849
Рейтинг сообщения: 0
strengerst писал(а):
И все равно нет прерывания по компаратору, спасибо всем за советы учту.
Переделанный код согласно замечанием: Может кто свой небольшой пример на асемблере скинет, что бы компаратор уходил в прерывания.
Вот рабочий пример в протеусе.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
СообщениеДобавлено: Пт окт 27, 2017 08:16:49 
Друг Кота

Карма: 64
Рейтинг сообщений: 966
Зарегистрирован: Пт мар 07, 2008 06:54:43
Сообщений: 4220
Откуда: Ижевск
Рейтинг сообщения: 0
strengerst писал(а):
Жаль но прерывания все равно нет.
Адаптировал программу и проверил в железе на tiny2313, благо распиновка и поддержка такая же как tiny13. Работает!
Спойлер
Код:
   .INCLUDE "tn2313def.inc"

// Команда для переименования регистров.
.def ZERO=R22;
.def XXX=R23;
.list; // Отоброжения листинга исполнения команды.
.cseg; работаем с програмной памятью а не озу или eeprom
.org 0; устанавливаем начальную позицию строки
rjmp START; Reset Handler
   .org $0A
rjmp Comparator; Analog Comparator Handler
   .org $0D
ObrobotkaTIM0_COMPA:
inc XXX;
reti;
//Оброботка прерывания от компаратора
Comparator:
sbi PINB,4; - Подкючаем подтягивающий резистор для включения лампы
reti; - Выход с под программы прерывания

//Определяем начальные параметры микроконтролера.

START:
 //инициализация стэка.(установка максимально размера ОЗУ);
;Initial Value10011111, т.е. для tiny13 две следующие команды не нужны
 ldi R17, RAMEND;
 out SPL, R17;
 ldi ZERO, 0x00; //Присваеваем значение 0 переменной zero;
 
//инициализация портов ввода вывод

//Устанавливаем работу портов на вход и выход.
//Устанавливаем выходы DDB1 и DDB0 работу на вход для компаратора
//Если порт DDB установлен в 1 то данный порт является выходам,
//а если в 0 то входам.
   SBI   DDRB,4
;   ldi R16,1<<DDB4
;   out DDRB, R16;
//Подключаем компаратор для сравнения сигналов
   LDI   R22,1<<ACIE;1<<   ACIS1|1<<ACIS0|1<<ACIE
   OUT   ACSR,R22
   LDI   R22,1<<   AIN1D|1<<AIN0D
   OUT   DIDR,R22; отключение цифровых входов от аналоговой части
;   OUT   DIDR0,R22; отключение цифровых входов от аналоговой части


   SBI   ACSR,ACI; очистка флага AC
;Alternatively, ACI is cleared by writing a logic one to the flag

;   RCALL   TIMER
//Разрешаем глобальные прерывания
sei;
START1:
;nop;
rjmp START1;
.EXIT
Для tiny13 будет так
Спойлер
Код:
   .INCLUDE "tn13def.inc"

// Команда для переименования регистров.
.def ZERO=R22;
.def XXX=R23;
.list; // Отоброжения листинга исполнения команды.
.cseg; работаем с програмной памятью а не озу или eeprom
.org 0; устанавливаем начальную позицию строки
rjmp START; Reset Handler
   .org 5
rjmp Comparator; Analog Comparator Handler
   .org 6
ObrobotkaTIM0_COMPA:
inc XXX;
reti;
//Оброботка прерывания от компаратора
Comparator:
;sbi PORTB,4; - Подкючаем подтягивающий резистор для включения лампы
sbi PINB,4; - Подкючаем подтягивающий резистор для включения лампы
reti; - Выход с под программы прерывания

//Определяем начальные параметры микроконтролера.

START:
 //инициализация стэка.(установка максимально размера ОЗУ);
;Initial Value10011111, т.е. для tiny13 две следующие команды не нужны
; ldi R17, RAMEND;
; out SPL, R17;
 ldi ZERO, 0x00; //Присваеваем значение 0 переменной zero;
 
//инициализация портов ввода вывод

//Устанавливаем работу портов на вход и выход.
//Устанавливаем выходы DDB1 и DDB0 работу на вход для компаратора
//Если порт DDB установлен в 1 то данный порт является выходам,
//а если в 0 то входам.
   SBI   DDRB,4
;   ldi R16,1<<DDB4
;   out DDRB, R16;
//Подключаем компаратор для сравнения сигналов
   LDI   R22,1<<   ACIS1|1<<ACIS0|1<<ACIE
   OUT   ACSR,R22
   LDI   R22,1<<   AIN1D|1<<AIN0D
   OUT   DIDR0,R22; отключение цифровых входов от аналоговой части

   SBI   ACSR,ACI; очистка флага AC
;Alternatively, ACI is cleared by writing a logic one to the flag

;   RCALL   TIMER
//Разрешаем глобальные прерывания
sei;
START1:
;nop;
rjmp START1;
.EXIT


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 7597 ]     ... , , , 313, , , ...  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 27


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y