можно и "комбинированным" способом через "подстановку вектора возврата"... изменение значения самого указателя стека... там важнее вопрос - допускается или нет на том участке "вложенное" внешнее прерывание.
Заголовок сообщения: 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-рой пары создает в моей душе неприятный осадок ))) У меня была идея по коду программы по чаще растолкать команду опроса вкл 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
4 кнопки (да еще и с фиксацией!) и 4 светика (группы светиков) это задача для релейно-контактной логики (не то чтоб для МК). Ну отсилы еще пару NE555...
Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.
Программа на АSM для тини2313...Чего хочется: есть две кнопки( с фиксацией). Нажимаем одну - первая пара св-диодов должна моргать (частота 1Гц). Нажимаем вторую кнопку - другая пара св-диодов должна просто засветится.
Я бы использовал таймер (частота 1Гц), в прерывании таймера изменял бы состояние первой пары св-диодов. В основном цикле опрашивал бы кнопки без каких либо задержек, ну разве что на дребезг. При опросе первой кнопки принимаем решение о запуске таймера или даем разрешение таймеру моргать первой парой св-диодов. При опросе второй кнопки - зажигаем вторую пару св-диодов. Где-то так.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт окт 17, 2017 16:59:42
Встал на лапы
Зарегистрирован: Вт мар 31, 2015 01:12:46 Сообщений: 89
Рейтинг сообщения:0
Спасибо за ответы!!! С помощью NE555 не хочется решать так проблему. Хочется решить программно, а не аппаратно ( для того ж и изучаю МК ) Буду пытаться на таймерах... нужно только до них добраться их изучить как следует. Спасибо за понятный алгоритм и видео, очень доходчиво и понятно. Если получится, то обязательно поделюсь результатами
... Хочется решить программно, а не аппаратно ( для того ж и изучаю МК )...
Ну ежли только для учебы... Есть буфер ввода (одновременно ВСЕ ВОЗМОЖНЫЕ комбинации кнопок) и есть буфер вывода (одновременно ВСЕ ВОЗМОЖНЫЕ комбинации включения светиков) есть таймер опроса и таймер инвертора... (независимо - программные или аппаратные). Можно еще флажок добавить - разрешение работы инвертора. Итогом - согласно статуса считанного состояния входных линий активируем соответствующие позиции выходных сигналов и флаг разрешения работы инвертора. Порционно выпихиваем содержимое буфера вывода в порт вывода. А инвертор в ведомы ему моменты меняет статус нужных ему бит в буфере (пока ессно его работа разрешена флажком).
Надо просто правильно разбить программу на задачи. Сделайте так называемый суперцикл, который будет выполняться с заранее заданной задержкой - например 10мс. В этом цикле, смотрим на кнопки и выставляем в переменной "флажки". Задача простая как 5 копеек, не правда ли? Вторая задача - на каждый флажок своя ветка в суперцикле, с немигающими фарами понятно - ничего дополнительно анализировать не надо, просто смотрим на КОНКРЕТНЫЙ флажок и включаем нужную пару светодиодов, или выключаем. Немного сложнее с поворотами - для каждого из них заводишь дополнительную переменную счетчик - когда флажок поворота неактивен - принудительно гасим соответствующий светодиод и ОБНУЛЯЕМ его счетчик, если флажок активен - и счетчик равен нулю - меняем состояние светодиода на противоположное. Инкрементируем счетчик, и когда он достигает значения 100(или 50?) - сбрасываем. Всё.
В итоге имеем не одну монолитную программу которую сложно отлаживать, а отдельные блоки логика которых просматривается прозрачно(зависит исключительно от строго указанных входных данных и имеет конкретный легко проверяемый результат работы) и которые отлаживать можно отдельно от остальных.
Всем привет, не могу справиться с банальной задачей - подключение компаратора и сделать так что бы он вошел в прерывание, из-за разности напряжения в 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;
//Если порт 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 раз.
Ой спасибо действительно ошибка. Изначально все пины МК это входы, переделал код, проверил и все ровно компаратор не входит в прерывания. Что еще не так?
Спойлер
Код:
// Команда для переименования регистров. .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;
// Команда для переименования регистров. .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;
и в программе недопустимые ошибки.... На старте не обязательно запрещать прерывания - они и так запрещены. В обработчике прерывания разрешать/запрещать прерывания НЕ НУЖНО, они запрещаются и разрешаться сами при входе в прерывание и выполнении команды RETI соответственно.
А вот что делать в прерывании КРАЙНЕ НЕ РЕКОМЕНДУЕТСЯ так это менять регистр статуса. Ваша команда INC в обработчике прерывания таймера его меняет. Поскольку прерывание возникает в самый неожиданный момент выполнения программы, внезапное изменение регистра статуса может оказаться большим нежданчиком для программы и получишь постоянные глюки "из ниоткуда и везде". Если в обработчике выполняется хоть одна команда изменяющая регистр статуса, его надо при входе в обработчик сохранить а перед выходом - освободить. Обычно для этого отводят отдельный регистр который больше нигде не используется - только в прерывании и только для хранения регистра статуса. Или если все регистры в ходу то сначала делаем PUSH любого регистра в стек и может использовать его в тех же целях, не забыв потом и этот регистр восстановить перед выходом из прерывания.
И все равно нет прерывания по компаратору, спасибо всем за советы учту. Переделанный код согласно замечанием: Может кто свой небольшой пример на асемблере скинет, что бы компаратор уходил в прерывания. Спойлер
Код:
/ Команда для переименования регистров. .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;
И все равно нет прерывания по компаратору, спасибо всем за советы учту. Переделанный код согласно замечанием: Может кто свой небольшой пример на асемблере скинет, что бы компаратор уходил в прерывания.
Адаптировал программу и проверил в железе на 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
// Команда для переименования регистров. .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
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения