Обсуждаем контроллеры компании Atmel.
Ответить

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Пн сен 25, 2017 11:19:51

смотря как выходить
:roll:
можно и "комбинированным" способом через "подстановку вектора возврата"... изменение значения самого указателя стека...
там важнее вопрос - допускается или нет на том участке "вложенное" внешнее прерывание.
:roll:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Вс окт 01, 2017 06:19:15

Всем спасибо за подсказку с этим "ldi r16, (1<<USIWMO)|(1<<USICS1)|(1<<USICLK)|(1<<USITC)" разобрался, в СИ то же пользуются таким приемом

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Вт окт 17, 2017 13:49:46

Добрый день! Программа на А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

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

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Вт окт 17, 2017 14:30:25

4 кнопки (да еще и с фиксацией!) и 4 светика (группы светиков) это задача для релейно-контактной логики (не то чтоб для МК). Ну отсилы еще пару NE555...
8)
а тут "МК не справляется"...
:facepalm:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Вт окт 17, 2017 16:23:55

dumbass писал(а):Программа на АSM для тини2313...Чего хочется: есть две кнопки( с фиксацией). Нажимаем одну - первая пара св-диодов должна моргать (частота 1Гц). Нажимаем вторую кнопку - другая пара св-диодов должна просто засветится.
Я бы использовал таймер (частота 1Гц), в прерывании таймера изменял бы состояние первой пары св-диодов.
В основном цикле опрашивал бы кнопки без каких либо задержек, ну разве что на дребезг.
При опросе первой кнопки принимаем решение о запуске таймера или даем разрешение таймеру моргать первой парой св-диодов.
При опросе второй кнопки - зажигаем вторую пару св-диодов.
Где-то так.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Вт окт 17, 2017 16:59:42

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

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Ср окт 18, 2017 06:08:23

Если с пониманием таймеров сложности, можно и без них. Просто не использовать полусекундные задержки, а дробить их на более короткие.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Ср окт 18, 2017 08:55:40

... Хочется решить программно, а не аппаратно ( для того ж и изучаю МК :) )...

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

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Ср окт 18, 2017 23:08:12

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

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

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Чт окт 26, 2017 08:43:22

Всем привет, не могу справиться с банальной задачей - подключение компаратора и сделать так что бы он вошел в прерывание, из-за разности напряжения в 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

Код:
//Если порт 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

А вот и нет. В книги написано:

Изображение
Вложения
Коту2.png
(56.18 KiB) Скачиваний: 739

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Чт окт 26, 2017 11:04:28

А вот и нет. В книги написано:
Изображение

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

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Чт окт 26, 2017 11:13:31

Ой спасибо действительно ошибка. Изначально все пины МК это входы, переделал код, проверил и все ровно компаратор не входит в прерывания. Что еще не так?

Спойлер
Код:

// Команда для переименования регистров.
.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

Жаль но прерывания все равно нет.
У вас в схеме протеуса ошибка, состояние вывода PB0 не определено, поставьте на вывод PB0 резистор 10к на землю.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Чт окт 26, 2017 20:42:46

и в программе недопустимые ошибки....
На старте не обязательно запрещать прерывания - они и так запрещены. В обработчике прерывания разрешать/запрещать прерывания НЕ НУЖНО, они запрещаются и разрешаться сами при входе в прерывание и выполнении команды RETI соответственно.

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

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Пт окт 27, 2017 07:32:57

Alexeyslav писал(а):а перед выходом - освободить
восстановить

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Пт окт 27, 2017 07:57:36

И все равно нет прерывания по компаратору, спасибо всем за советы учту.
Переделанный код согласно замечанием: Может кто свой небольшой пример на асемблере скинет, что бы компаратор уходил в прерывания.
Спойлер
Код:
/ Команда для переименования регистров.
.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

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

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Пт окт 27, 2017 08:16:49

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
Ответить