Здравия желаю, уважаемые. Вот тут я нашел почти то, что хотел. Единственное - хотелось бы чтобы состояние порта возвращалось в исходное через 5 секунд после переключения из браузера. Обратился к автору - он не ответил Пробовал сам - не понимаю. Ассемблер мне не дается от слова совсем Был бы очень признателен уважаемым котам, если бы смогли поправить проект. И ещё больше был бы признателен, если бы рассказали как
Использование модульных источников питания открытого типа широко распространено в современных устройствах. Присущие им компактность, гибкость в интеграции и высокая эффективность делают их отличным решением для систем промышленной автоматизации, телекоммуникационного оборудования, медицинской техники, устройств «умного дома» и прочих приложений. Рассмотрим подробнее характеристики и особенности трех самых популярных вариантов AC/DC-преобразователей MW открытого типа, подходящих для применения в промышленных устройствах - серий EPS, EPP и RPS представленных на Meanwell.market.
Pnjom-Penb Я вас понял. Сложно помочь - так и скажите. Если бы сумел уложиться в 2кб, то не обращался бы за помощью к таким проектам, а сделал бы все сам. Но увы не все являются супер программистами. Снимаю свой вопрос.
_________________ Демократии нет и не будет! Государство - это я!
Именно помочь я и пытаюсь, однако, Вы же ищете не помощи, а того, чтобы кто-то сделал все вместо вас. Этого мне делать некогда. Поместите свое предложение в раздел "Есть работа" - туда заглядывают как раз те, кто может потратить свое время на решение ваших задач вместо вас - и все разрешится к вашему удовольствию.
Привет всем!. Столкнулся я с непонятной мне вещью. Может кто разъяснит? Есть обработчик прерывания по переполнению Timer0. Назвал его "Taimer". Он для того, чтобы если за определённое время не придёт некое событие не ждать тупо, а прыгать на метку . А вопрос в том, что при выходе из обработчика по RETI всё нормально, а вот если не дождались события выкидываю из стека адрес возврата и выхожу по RJMP, на метку . Но стек почему-то переполняется, после каждого перехода на метку SPL уменьшается на 2 (выводил в УАРТ SPL). Пришлось добавить ещё 2 POP, тогда всё нормально работает. Получилось 4 POP. Почему так? Да, камень AT2313, Avr Studio4
Код:
Taimer: in r0,SREG inc interrupt cpi interrupt,80 breq rst2 out SREG,r0 reti rst2: clr interrupt pop temp pop temp pop temp pop temp rjmp taimer_overflow
_________________ Я всё-всё узнAю и стану профессором.
А, понял, там, где ждём события дополнительно проверяем Т и если он взведён то уже оттуда прыгаем на метку? Или опять я не приехал?. Только по адресу $0006 будет RJMP, т.к. планирую завести собаку и она покусается с обработчиком по переполнению. И всё же, почему мне пришлось ставить 4 POP а не 2? Просто интересно.
_________________ Я всё-всё узнAю и стану профессором.
Не всё так безоблачно. Студия считает, что при выходе на метку указатель стека изменяется.
Да я тоже симулял свой код и следил за стеком. Всё ОК и с 2 ПОП ( в interrupt ставил 1, чтоб не гонять одно и то же 80 раз). Так ведь в железяке тинька перезагружалась, я потому и стал копаться. А за науку спасибо.
_________________ Я всё-всё узнAю и стану профессором.
Доброго времени суток, уважаемые форумчане! Прошу о помощи в таком вопросе - как настроить прерывания???
Контроллер - мега 16а схема - на макетке распаяны через сопротивление светодиоды на порт А, на выводы INT0, INT1, int2 и ресет - кнопки на землю тактовые
дополнительно - светодиод на одной из лап порта С, как индикатор включения - при инициализации вывожу тудой 1, и он горит, или если чего-то не так - переставляю эти строчки в другую часть кода и смотрю, дошел ли процесс до них
задача - продвинуть хелловорд так, чтобы по нажатию клавиши на INT0 значения на светодиодах порта А "замерзали", по нажатию INT1 - выводили значение счетчика нажатий (регистра 21), ну 3 кнопка на INT 2 вырубала камень до лучших времен.
ПРОБЛЕМА: не работают кнопки. Тоесть цикл А выполняется, светики мигают и больше ничего не происходит((( ПОМОГИТЕ
(пишу в атмел студио 4 и программатор аврисп мк2 клон)
/код прилагаю/ //си не предлагать//
.include "D:\all\AVR-projects\m16adef.inc" .cseg .org 0 jmp RESET .org INT0addr ; External Interrupt Request 0 ;reti rjmp ext_int0 .org INT1addr ; External Interrupt Request 1 ;reti rjmp ext_int1 .org OC2addr ; Timer/Counter2 Compare Match reti .org OVF2addr ; Timer/Counter2 Overflow reti .org ICP1addr ; Timer/Counter1 Capture Event reti .org OC1Aaddr ; Timer/Counter1 Compare Match A reti .org OC1Baddr ; Timer/Counter1 Compare Match B reti .org OVF1addr ; Timer/Counter1 Overflow reti .org OVF0addr ; Timer/Counter0 Overflow reti .org SPIaddr ; Serial Transfer Complete reti .org URXCaddr ; USART, Rx Complete reti .org UDREaddr ; USART Data Register Empty reti .org UTXCaddr ; USART, Tx Complete reti .org ADCCaddr ; ADC Conversion Complete reti .org ERDYaddr ; EEPROM Ready reti .org ACIaddr ; Analog Comparator reti .org TWIaddr ; 2-wire Serial Interface reti .org INT2addr ; External Interrupt Request 2 reti rjmp ext_int2 .org OC0addr ; Timer/Counter0 Compare Match reti .org SPMRaddr reti RESET: ldi r16, 0x04 out SPL,r16 ldi r16, 0x5f out SPH,r16 ldi r16,0xff out DDRC,r16 ldi r16,0x00 out DDRD,r16 ldi r16,0x00 out DDRB,r16 ldi r16,0xff out PortD,r16 ldi r16,0xff out DDRa,r16 in r16,MCUCR sbr r16,(1<<ISC01)|(0<<ISC00)|(0<<ISC10)|(1<<ISC11) out MCUCR,r16 in r16, gifr sbr r16, (0<<INTF0)|(0<<INTF1)|(0<<INTF1) out gifr, r16 ldi r16, 0x33 OUT GICR, r16 in r16,MCUCR sbr r16,(1<<sm2)|(1<<sm1)|(1<<sm0) out MCUCR,r16 ldi r16,0xff out portc,r16 ldi r17, 0x02 ldi r18, 0xff ldi r21, 0x00 sei
a: inc r21 inc r18 out porta, r18 ldi r20, 0x00 ldi r21, 0x00 ldi r22, 0x0f ba: dec r20 brne ba dec r21 brne ba dec r22 brne ba rjmp a
EXT_INT0: r: jmp r reti
EXT_INT1: out portc, r21 ra: jmp ra reti
EXT_INT2: sleep in r16,MCUCR sbr r16,(0<<se) out MCUCR,r16 reti
Спасибо за подсказки, я все учёл, но не все понял. Я переписал этот код и теперь дела поправились, но не полностью - поэтому все по пунктам: 1. А в чем разница - ведь значение адреса памяти статическое значение, и его надо просто вывести? Я просто посмотрел адрес и так и написал, конечно, это не так культурно, но ведь программа вроде и так и так работает одинаково??? 2. блин, забыл))) 3. ладно буду теперь внимательнее читать даташит... 4. хорошо, получается сигналы на портах могут вызвать сбои в работе из-за доп. интерфейсов включенных? а если в будущем нужно будет сразу несколько функций на одно ноге использовать???
5....... я так боялся таймера... и теперь он работает!!! _____ а шо цэ такэ?? счетчик? а зачем он?? .equ Fo=1000000 LDI XH,BYTE4(1*Fo) LDI XL,BYTE3(1*Fo ____________ LDI XH,HIGH(1*Fo/65536) LDI XL,LOW(1*Fo/65536)
и я так и не понял как работает SLEEP
и кнопка на INT2 ничего не делает, а надо чтоб контроллер "впадал в спячку", и после нажатия чего-то другого опять оживал, и продолжал работать оттуда где закончил
на кнопках вполне ощутим дребезг, как его уничтожить?
и вот еще - а чего обработчик прерывания по переполнению таймера у вас находится перед инициализацией???
П.С. Походу что-то не так с выводом INT2, переписал код - та кнопка не работает в любых случаях
1. Указатель стека устанавливается в допустимой области RAM контроллера. Вы же установили SP=0x5F04 вместо SP=0x045F 5. Да, это грубый таймер 1 секунды привязанный к тактовой контроллера. Грубый, потому что не учитывает состояние TCNTx. Допустим, время дребезга контакта кнопок ~10мс. Заносим в OCR1B значение (TCNT1+10*Fo/1000) Включаем прерывание OC1B, чистим флаг OCF1B. Таймер отсчитывает заданное время, вызывается прерывание OC1B, в котором чистится флаг INTx. Примерно тоже самое делается при отпускании кнопки, которое так же может вызывать дребезг. Работу команды SLEEP можно увидеть, подав питание на контроллер через миллиамперметр.
Вопрос. Есть у меня датчик температуры DS18B20, он выдает температуру как есть и отрицательную температуру в дополнительном коде, т.е. в старшем бите байта появляется единица. Итого у меня есть некая переменная temp1, в которую отправляется температура с датчика в вышеуказанном виде, т.е. старший бит - знак температуры, а остальные 7 бит - сама температура в прямом либо дополнительном коде (от знака зависит).
Есть у меня переменная другая - ZUUM, в ней содержится число для сравнения из диапазона +125 до -55.
А вот код, который не пашет, т.к. я делаю что-то не так.
Код:
;---------- Обработка выхода ---------- cp ZUUM, temp1 brlt ENN cbi KEYPORT,KEYPIN rjmp EN ENN: sbi KEYPORT,KEYPIN ;----------
Как правильно сделать сравнение переменных, чтобы при понижении температуры как в положительной так и в отрицательной срабатывала нагрузка? У меня в положительной срабатывает, когда падает ниже, например 23 градусов. Но если будет установлен придел до -2, то фигню всякую гонит...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения