Все написанное вами раскрывает следующее: вы натягиваете сову на авр. У вас какие-то свои представления об этих МК, притом сопоставляющие с теми, с какими работали до авр. Также ваше недопонимание родило неверные правила работы с регистрами авр. Поясняю: у авр есть младшие регистры, r0-r15; старшие r16-r31. Их разница только в том, что с младшими регистрами не все инструкции действуют. Порядок сохранения и восстановления может быть абсолютно произвольный. Вообще покуй. Главное - последовательность действий.
Особое внимание нужно уделить регистрам r0 и r1. Во-первых, в r0 могут считываются данные из памяти программ. Во-вторых, в этих регистрах загружается результат при операции умножения.
Код:
//======== push r2 // Если этот регистр участвует в программе. in r2, SREG push r2 //bla-bla pop r2 out SREG, r2 pop r2 reti // или ret, если не нужны прерывания. //========
//======== push r16 // Если этот регистр участвует в программе. in r16, SREG push r16 // bla-bla pop r16 out SREG, r16 pop r16 reti // или ret, если не нужны прерывания. //========
//======== // Можно вообще так: .def RSREG = r5 // И использовать этот регистр для сохранения восстановления SREG
in RSREG, SREG //bla-bla out SREG, RSREG reti // или ret, если не нужны прерывания. //========
//======== push r31 push r17 push r16 push r19 in r19, SREG push r19 // bla-bla pop r19 out SREG, r19 pop r19 pop r16 pop r17 pop r31 reti // или ret, если не нужны прерывания. //========
сначала никак не хотела работать, поскольку я пробовал регистры R16, R17, R18.
Регистр r16 и r17 у AVR используются как аккумулятор… для новичков их использование не рекомендуется. Тебе нужно взять в привычку при любом прерывании сохранять в стек значения регистров r16, r17 и SREG, а при выходе из прерывания возвращать из стека сохраненные значения этих регистров. Небольшой нюанс при сохранении заключается в следующем: всегда первым сохраняется регистр r16 все последующие не имеют упорядоченного значения. Извлекаются значения из стека строго в обратной последовательности (r16 последним). Таким же образом поступают и с теми регистрами, которые используются как в основном теле программы, так и задействованы в теле прерывания.
_________________ Я всё-всё узнAю и стану профессором.
Если не уловили суть сказанного, то можно было бы просто переспросить, а не надувать щёки… всё тобой изложенное не является секретной информацией… я выше уже объяснил, что дело не в самом регистре, а в компиляторе… впрочем не важно... я не настаиваю.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Пусть будет по твоему, раз тебе так легче… я не программист, потому амбиций никаких… могу быть и новичком – меня это не задевает.
ЗЫ. А суть заключалась в следующем… чтобы сохранить регистр SREG в стек, необходимо дополнительно использовать рабочий регистр… как «правило» большинство используют регистр r16… тем самым его же могу использовать и в теле основной программы или в подпрограммах… если программа большая то отслеживать это проблематично… я поступаю проще, при сохранении регистра SREG в стек использую всегда только r16… предварительно сохранив его же значения в стек. Мне это помогает не наступать на грабли…
SREG вы можете сохранять в любой регистр, также отвести специальный регистр только для этой задачи. Второй метод нельзя использовать, если в обработчике прерывании вы разрешаете прерывания. В этом случае только через стек, либо если позволяет, для одного обработчика один регистр, для другого обработчика другой. Сохранение SREG в регистр уменьшает размер программы и количество тактов на обработку прерывания. 2 такта против 6. Также нужно помнить, что в обработчике нужно сохранять только те регистры, которые используются в основном цикле. Есть еще такой способ. Для обработчика прерывания использовать только свои регистры. Это также экономит память программ и такты. Но тут зависит от задачи и кол-ва используемых регистров.
Последний раз редактировалось Demiurg Пт фев 09, 2018 11:48:55, всего редактировалось 1 раз.
Мяукните! Ассемблер AVR самодостаточен и не нуждается в сторонней поддержке.
Возможно.. Для крошечных программок. Но avrasm это заброшенный проект. И таких проектов много. Вопросов к нему то же много. Если вы напишете программу в десятки тысяч строк, то сойдёте с ума. Метки на русском недопустимы.
avrasm не понимает русские имена файлов. Не разрешает пробелы в именах. Думаю это далеко не все подводные камни... То же самое и в keil.
GCC ассемблер - это единая среда для многих ядер. Весьма развитая. И это здорово упрощает работу.
Как вариант компилятора GCC ассемблер заслуживает внимания... Но не в данной ветке. Поскольку анонсировано как "мультимикроконтроллерный" более рационально выделение в отдельную ветку с описанием приемов применения относительно разных МК, входящих в оговоренный для компилятора перечень. Вобщем аналогия моей "винной" (viewtopic.php?f=62&t=94201) с той разницей, что у меня рассматриваются примеры относительно "стандартных" компиляторов разработчиков/изготовителей МК, а в Вашем случае должен быть упор на применение в проектах именно компилятора GCC ассемблера.
Вопрос - как сделать возможным комментирование каждой строки, при объявлении данных (во флэш) по одному байту? Есть вариант объявлять через .db в каждой строке, но тогда добавляется padding zero byte
Да, но так в строке объявлено 2 байта, а нужно чтоб один) Проблема в том что это некоторый довольно длинный пакет (~50 байт) в который в любой момент потребуется вносить изменения. А если объявлять по два байта в строке то, если внести изменения (например один байт) где-то между этими двумя байтами то пакет "поползет" и придется заниматься перерасстановкой.
Добавлено after 11 minutes 7 seconds: Я кажется нашел способ
Всем привет. Подсоединил две atmega8 по UART в симуляторе Proteus Пытаюсь посмотреть когда срабатывает флаг PE- флаг ошибки контроля четности,но флаг все время стоит в 0. Подскажите в чем ошибаюсь в передатчике настройка UART:
Код:
;//вкл передатчик ldi R16,(1<<TXEN) out UCSRB,R16
;//зададим скорость 9600 бод ldi R16,0x00 out UBRRH,R16 ldi R16,0x34 out UBRRL,R16
;//выберем 8 битный режим и вкл проверку на четность ldi R16,(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0)|(1<<UPM1) out UCSRC,R16
в Приемнике :
Код:
;//вкл приемник выберем 9 битный режим ldi R16,(1<<RXEN)|(1<<UCSZ2) out UCSRB,R16
;//зададим скорость 9600 бод ldi R16,0x00 out UBRRH,R16 ldi R16,0x34 out UBRRL,R16 ;//выберем 9 битный режим и вкл проверку на четность ldi R16,(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0)|(1<<UPM1) out UCSRC,R16
Пробовал в приёмнике использовать как 8 битный так и 9 битный режим
в приемнике отслеживаю посылку так
Код:
MAIN: ;//ждем окончания приема sbis UCSRA,RXC rjmp MAIN in R16,UDR out PORTB,R16
пробовал смотреть за флагом выводя UCSRA в порт флаг PE все время в нуле делал по разному : 1) после проверки флага RXC
Код:
MAIN: sbis UCSRA,RXC rjmp MAIN in R16,UCSRA out PORTB,R16 wait: rjmp wait
2) после прочтения данных
Код:
MAIN: sbis UCSRA,RXC rjmp MAIN in R16,UDR
in R16,UCSRA out PORTB,R16 wait: rjmp wait
Обьясните почему флаг PE=0 всегда, отправлял числа 0x30,0x31 разницы не какой,смотрю на шине осциллографом, когда числа меняю меняется и бит четности перед стоп битом, а в приемнике флаг PE=0. Обьясните где нужно настраивать UPM1 и UPM0 и в передатчике и приемнике?,или достаточно токо в приемнике?,обязательно ли передавать в передатчике этот 9 бит или достаточно поставить контроль четности просто в приемнике,просто флаг PE на основе чего ставиться?,на основе принятого 9 байта передатчика?,или он рассчитывается по принятому байту?
если контроль четности включен, то при приеме подсчитывается контрольный бит и сравнивается с тем, что принят, при несовпадении устанавливается флаг ошибки.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 49
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения