Страница 313 из 400
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пн сен 25, 2017 11:19:51
BOB51
смотря как выходить
можно и "комбинированным" способом через "подстановку вектора возврата"... изменение значения самого указателя стека...
там важнее вопрос - допускается или нет на том участке "вложенное" внешнее прерывание.

Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс окт 01, 2017 06:19:15
sibiryak69
Всем спасибо за подсказку с этим "ldi r16, (1<<USIWMO)|(1<<USICS1)|(1<<USICLK)|(1<<USITC)" разобрался, в СИ то же пользуются таким приемом
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт окт 17, 2017 13:49:46
dumbass
Добрый день! Программа на АSM для тини2313 работает не совсем красиво, как того хотелось бы. Сразу скажу, в качестве практического развития пытаюсь сделать освещения на, как бы, модель автомобиля. Есть 4 кнопки, 4 пары св-диодов. Нажимаем кн1-вкл поворот влево, кн2- передний свет и т.д. Далее будет идти речь только о левом повороте и переднем освещении (для простоты и понятности изложения).
Чего хочется: есть две кнопки( с фиксацией). Нажимаем одну - первая пара св-диодов должна моргать (частота 1Гц). Нажимаем вторую кнопку - другая пара св-диодов должна просто засветится.
Что не получается: программа работает правильно, НО! не красиво... допустим, я нажал на кн1 и через долю секунды на кн2. Первая пара св-диодов загорелась, вторая пара тоже уже должна загореться, НО! МК в это время выполняет задержку для свечения первой пары, затем выключит первую пару и вновь 0,5секунды будет выполнять задержку и лишь затем включит мне вторую пару... и эта небольшая задержка во вкл 2-рой пары создает в моей душе неприятный осадок

)))
У меня была идея

по коду программы по чаще растолкать команду опроса вкл 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
Спасибо за ответ!
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт окт 17, 2017 14:30:25
BOB51
4 кнопки (да еще и с фиксацией!) и 4 светика (группы светиков) это задача для релейно-контактной логики (не то чтоб для МК). Ну отсилы еще пару NE555...
а тут "МК не справляется"...

Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт окт 17, 2017 16:23:55
Dimon456
dumbass писал(а):Программа на АSM для тини2313...Чего хочется: есть две кнопки( с фиксацией). Нажимаем одну - первая пара св-диодов должна моргать (частота 1Гц). Нажимаем вторую кнопку - другая пара св-диодов должна просто засветится.
Я бы использовал таймер (частота 1Гц), в прерывании таймера изменял бы состояние первой пары св-диодов.
В основном цикле опрашивал бы кнопки без каких либо задержек, ну разве что на дребезг.
При опросе первой кнопки принимаем решение о запуске таймера или даем разрешение таймеру моргать первой парой св-диодов.
При опросе второй кнопки - зажигаем вторую пару св-диодов.
Где-то
так.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт окт 17, 2017 16:59:42
dumbass
Спасибо за ответы!!!
С помощью NE555 не хочется решать так проблему. Хочется решить программно, а не аппаратно ( для того ж и изучаю МК

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

Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср окт 18, 2017 06:08:23
WiseLord
Если с пониманием таймеров сложности, можно и без них. Просто не использовать полусекундные задержки, а дробить их на более короткие.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср окт 18, 2017 08:55:40
BOB51
[uquote="dumbass",url="/forum/viewtopic.php?p=3208923#p3208923"]... Хочется решить программно, а не аппаратно ( для того ж и изучаю МК

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

Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср окт 18, 2017 23:08:12
Alexeyslav
Надо просто правильно разбить программу на задачи. Сделайте так называемый суперцикл, который будет выполняться с заранее заданной задержкой - например 10мс. В этом цикле, смотрим на кнопки и выставляем в переменной "флажки". Задача простая как 5 копеек, не правда ли?
Вторая задача - на каждый флажок своя ветка в суперцикле, с немигающими фарами понятно - ничего дополнительно анализировать не надо, просто смотрим на КОНКРЕТНЫЙ флажок и включаем нужную пару светодиодов, или выключаем.
Немного сложнее с поворотами - для каждого из них заводишь дополнительную переменную счетчик - когда флажок поворота неактивен - принудительно гасим соответствующий светодиод и ОБНУЛЯЕМ его счетчик, если флажок активен - и счетчик равен нулю - меняем состояние светодиода на противоположное. Инкрементируем счетчик, и когда он достигает значения 100(или 50?) - сбрасываем. Всё.
В итоге имеем не одну монолитную программу которую сложно отлаживать, а отдельные блоки логика которых просматривается прозрачно(зависит исключительно от строго указанных входных данных и имеет конкретный легко проверяемый результат работы) и которые отлаживать можно отдельно от остальных.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт окт 26, 2017 08:43:22
strengerst
Всем привет, не могу справиться с банальной задачей - подключение компаратора и сделать так что бы он вошел в прерывание, из-за разности напряжения в 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;
Снимок в протеусе
Спойлер

Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт окт 26, 2017 10:48:51
akl
Код: Выделить всё
//Если порт 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
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт окт 26, 2017 10:59:57
strengerst
А вот и нет. В книги написано:

Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт окт 26, 2017 11:04:28
ARV
[uquote="strengerst",url="/forum/viewtopic.php?p=3216583#p3216583"]А вот и нет. В книги написано:

[/uquote]
читайте оригинальные даташиты. в этой книжке ошибка.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт окт 26, 2017 11:13:31
strengerst
Ой спасибо действительно ошибка. Изначально все пины МК это входы, переделал код, проверил и все ровно компаратор не входит в прерывания. Что еще не так?
Спойлер
Код: Выделить всё
// Команда для переименования регистров.
.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]
http://radiokot.ru/forum/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;
Жаль но прерывания все равно нет.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт окт 26, 2017 15:45:29
Dimon456
[uquote="strengerst",url="/forum/viewtopic.php?p=3216601#p3216601"]Жаль но прерывания все равно нет.[/uquote]У вас в схеме протеуса ошибка, состояние вывода PB0 не определено, поставьте на вывод PB0 резистор 10к на землю.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт окт 26, 2017 20:42:46
Alexeyslav
и в программе недопустимые ошибки....
На старте не обязательно запрещать прерывания - они и так запрещены. В обработчике прерывания разрешать/запрещать прерывания НЕ НУЖНО, они запрещаются и разрешаться сами при входе в прерывание и выполнении команды RETI соответственно.
А вот что делать в прерывании КРАЙНЕ НЕ РЕКОМЕНДУЕТСЯ так это менять регистр статуса.
Ваша команда INC в обработчике прерывания таймера его меняет. Поскольку прерывание возникает в самый неожиданный момент выполнения программы, внезапное изменение регистра статуса может оказаться большим нежданчиком для программы и получишь постоянные глюки "из ниоткуда и везде".
Если в обработчике выполняется хоть одна команда изменяющая регистр статуса, его надо при входе в обработчик сохранить а перед выходом - освободить. Обычно для этого отводят отдельный регистр который больше нигде не используется - только в прерывании и только для хранения регистра статуса. Или если все регистры в ходу то сначала делаем PUSH любого регистра в стек и может использовать его в тех же целях, не забыв потом и этот регистр восстановить перед выходом из прерывания.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пт окт 27, 2017 07:32:57
ARV
Alexeyslav писал(а):а перед выходом - освободить
восстановить
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пт окт 27, 2017 07:57:36
strengerst
И все равно нет прерывания по компаратору, спасибо всем за советы учту.
Переделанный код согласно замечанием: Может кто свой небольшой пример на асемблере скинет, что бы компаратор уходил в прерывания.
Спойлер
Код: Выделить всё
/ Команда для переименования регистров.
.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
Dimon456
strengerst писал(а):И все равно нет прерывания по компаратору, спасибо всем за советы учту.
Переделанный код согласно замечанием: Может кто свой небольшой пример на асемблере скинет, что бы компаратор уходил в прерывания.
Вот рабочий
пример в протеусе.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пт окт 27, 2017 08:16:49
akl
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