Перейти к содержанию

Uart / Usart На Ассемблере


Юстас

Рекомендуемые сообщения

Все верно. Загрузить в РОН и обработать. Только in "не дотянется" (как и out) до адреса 0хC0. Тут надо применить lds r16, UCSR0A. И не забыть push r16 и pop r16, т.к. его значение будет меняться.

Изменено пользователем Геннадий
Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

  • Ответов 218
  • Создана
  • Последний ответ

Топ авторов темы

Топ авторов темы

Изображения в теме

shads, видел ваши коменты на радиокоте. Ну нет у меня пока желания переходить на СИ :) . С ассемблером разберусь, а там видно будет.

Ды эт я так... к слову... :)...

Я и сам пока с асмом не разобрался, никаких Си не признавал...

Кстати вот тут простенькл описано про асмовые команды:

http://www.nikolaew.org/avr_old/u3.htm

http://www.nikolaew.org/avr_old/u4.htm

Изменено пользователем shads
Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Наверное так

/* ATMega48_USART_TX.asm
* Created: 31.03.2014 9:48:21
* Author: Admin*/
;============================================
;***************ПЕРЕМЕННЫЕ*******************
;============================================
.def temp = r16
.def byte = r17
.def flag = r19
;=============================================
;****************ПРЕРЫВАНИЯ*******************
;=============================================
.org $000
rjmp RESET ; Reset Handler
.org $00B
rjmp TIM1_COMPA
.org $012
reti ; USART RX Complete Handler
.org $013
reti ; UDR Empty Handler
.org $014
reti ; USART TX Complete Handle
;==============================================
;***********ОБРАБОТЧИКИ ПРЕРЫВАНИЙ*************
;==============================================
TIM1_COMPA:
ldi flag, 1 ;прошло 65мС, выставим флаг
reti
;==============================================
;***************ИНИЦИАЛИЗАЦИЯ*****************
;==============================================
RESET:
;<<******СТЕК******>>
ldi r16, low(RAMEND)
out SPL, r16
ldi r16, high(RAMEND)
out SPH, r16
;<<***КОМПОРАТОР***>>
ldi temp, 1<<ACD
out ACSR, temp ;выключаем его нафиг
;<<******ПОРТЫ*****>>
ldi temp, 0b00000001
out DDRD, temp
ldi temp, 0b11111110
out PORTD, temp
clr temp
out DDRB, temp
out DDRC, temp
ser temp
out PORTB, temp
out PORTC, temp
;<<*****ТАЙМЕР1****>>
ldi temp, 128 ;период меньше 65мС
sts OCR1AH, temp
clr temp ;
sts OCR1AL, temp
lds temp, 0b00001011 ;предделитель 64 сброс по совпадению
sts TCCR1B, temp
lds temp, 0b00010000 ;разрешим прерывание Т1 по совпадению OCR1
sts TIMSK1, temp

;============СКОРОСТЬ ПЕРЕДАЧИ===========
lds temp, 103 ; настраиваем скорость на 9600 при 16МГц
sts UBRR0L, temp
;==============САМ USART================
;разрешаем приём/передачу
ldi temp, 1<<TXEN0
sts UCSR0B, temp
ldi temp, (1<<UMSEL01)|(1<<USBS0)|(3<<UCSZ00) ; 8 бит данных, 2стоп-бита
sts UCSR0C, temp
clr flag
sei
;============основной цикл==============
CIKLE:
rcall BUTTON ;переходим в подпрограмму опроса кнопок
rjmp CIKLE
;=============ОПРОС КНОПОК==============
BUTTON:
in temp, PINB
cpi temp, 0b11111110 ; PINA_0
breq KOM1
cpi temp, 0b11111101 ; PINA_1
breq KOM2
cpi temp, 0b11111011 ; PINA_2
breq MOTOR_LEFT
cpi temp, 0b11110111 ; PINA_3
breq MOTOR_RIHT
ret
;=======ПОДПРОГРАММЫ КОМАНД ДЛЯ ПЕРЕДАЧИ=========
KOM1:
ldi byte, 0b01000010
rcall UART_TX
ret
KOM2:
ldi byte, 0b01111110
rcall UART_TX
ret
MOTOR_LEFT:
ldi byte, 0b00000110
rcall UART_TX
ret
MOTOR_RIHT:
ldi byte, 0b00001110
rcall UART_TX
ret
;======передача байта по UART================
UART_TX:
push r16
lds r16, UCSR0A
sbrs r16, 5 ; проверяем флаг завершения передачи
rjmp UART_TX ; крутимся в цикле пока флаг не поднимится иначе-
sts UDR0,byte ; -скармливаем сдвиговому регистру наш байт для передачи
clr flag ; сбрасываем флаг
rcall XXX ; уходим в подпрограмму ожидания
pop r16
ret ; возвращаемся к месту перехода в подпрограмму
;=========подпрограмма ожидания==========
XXX:
tst flag ; проверяем флаг
breq XXX ; если не поднят, крутимся в цикле и ждём
ret

А мне нравится ковыряться с Ассмом, находя оригинальные схемные и программные решения, увеличивая производительность и работоспособность МК, которые Си-шники "списывают" в хлам, когда их hex-ы не влезают в память контроллера. И главное - никакой зависимости от сторонних библиотек. Полная свобода действий.

Изменено пользователем Геннадий
Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Геннадий, вот теперь без ошибок. А то я уже психую :D . Целую кучи инфы в интернете поднял, так и не нашёл ничего дельного. Я тоже ассемблер полюбил за его понятность, скорость и относительную волю в действиях :D

Да, я уже прочитал, просто пока пост писал вы уже ответили :D

shads, вот спасибо за ссылки! Хорооошие ссылочки :spiteful:

Ссылка на комментарий
Поделиться на другие сайты

Геннадий, ваш вариант, надо поправить вот так: (ато программа может вылетать из-за неконтролируемых пушей :)... )

;======передача байта по UART================
UART_TX:
push r16
UART_TX1:
lds r16, UCSR0A
sbrs r16, 5 ; проверяем флаг завершения передачи
rjmp UART_TX1 ; крутимся в цикле пока флаг не поднимится иначе-
sts UDR0,byte ; -скармливаем сдвиговому регистру наш байт для передачи
clr flag ; сбрасываем флаг
rcall XXX ; уходим в подпрограмму ожидания
pop r16
ret ; возвращаемся к месту перехода в подпрограмму

Изменено пользователем shads
Ссылка на комментарий
Поделиться на другие сайты

shads,

все верно, мой косяк.

...можно не заморачиваться, свободных регистров ещё много, можно и отдельный регистр за дефайнить...

Это пока много. А заморачиваться с этим, надо взять за правило. Будут ситуации, когда регистров станет в обрез.

Изменено пользователем Геннадий
Ссылка на комментарий
Поделиться на другие сайты

А мне нравится ковыряться с Ассмом, находя оригинальные схемные и программные решения, увеличивая производительность и работоспособность МК, которые Си-шники "списывают" в хлам, когда их hex-ы не влезают в память контроллера.
Геннадий, точно так же можно ковырятся и с Си... при определенных знаниях и опыте (в принципе в асме без них - тоже никуда...), Си-шный код не на много больше получается...

Да и тупо "списывают" код - только лентяи...

И главное - никакой зависимости от сторонних библиотек. Полная свобода действий.
Геннадий, хотите верьте, хотите нет... но я до сих пор НИ ОДНОЙ СТОРОННЕЙ ЛИБЫ не использовал :)..... Все своими ручками пишу :).....

Хотя на Си, библиотеки - это одно из огромных преимуществ перед асмом... Но я тоже привык чтобы все было под контролем :)...

Ссылка на комментарий
Поделиться на другие сайты

Будет время, поизучаю Си (остались некоторые навыки в памяти, еще с IBM). Надо же развиваться дальше. Тем более под новые МК Ассм трудно найти, а хотелось и их освоить в полной мере.

Си-шный код не на много больше получается...

Пока удавалось, после вскрытия (дизассемблирования) кода, укоротить его в 5 раз (при той же функциональности программы и даже с некоторой доработкой).

Ссылка на комментарий
Поделиться на другие сайты

А это зависит от компилятора. Допустим CVAVR начинает размещение с РОНов, когда тот-же GCC и IAR сразу пихают все переменные в ОЗУ, оставляя право на использование РОНов за собой. И потому, есть тормоз только во времени записи в ОЗУ и из ее извлечения.

Ссылка на комментарий
Поделиться на другие сайты

Пока удавалось, после вскрытия (дизассемблирования) кода, укоротить его в 5 раз (при той же функциональности программы и даже с некоторой доработкой).

Это яркий пример неумелого использования написания на Си...

Для этого могут быть много причин...

те же сторонние библиотеки, которые неизвестно как устроены...

использование арифметики с плавающей точкой (вот примерчик http://forum.easyele...поменял#p231951 ),

те же неэффективные алгоритмы...

те же... в общем еще много чего :).....

Я когда взялся за Си, сделал первое сове творение... ну и конечно же сразу сравнил размер вариантов на асме и на Си, разница оказалась в два раза: http://asis-kbr.ru/f....php?f=11&t=122

Но гуру на коте тут же обратили внимание на то, что это ненормально..... http://radiokot.ru/f...олтора#p1381049

Да и то, маленький размер на асме обусловлен тем, что я все переменные уместил в РОН-ах... но так можно делать только в небольших программах... а как только программа становится более менее серьезной, то и на асме переменные придется размещать в памяти... и тут разница между асмом и Си - станет совсем незначительной....

Правда есть одно НО... - на асме нас ждет несоизмеримо больше геморроя :).....

Изменено пользователем shads
Ссылка на комментарий
Поделиться на другие сайты

А мне нравится ковыряться с Ассмом, находя оригинальные схемные и программные решения, увеличивая производительность и работоспособность МК
У меня кстати тоже иногда ностальгия разигрывается :)... Хотя на асме уже почти не пишу, но иогда все таки заносит где то приложится :)...

Вот например чел (тоже ассматик... :) ) говорит что ооптимизировал... http://radiokot.ru/forum/viewtopic.php?p=1888519#p1888519

Ну мне интересно стало... в итоге у меня еще на 44 байта получилось ужать... http://radiokot.ru/forum/viewtopic.php?p=1926959#p1926959

Так что я в душе пока что тоже ассматик :).....

Ссылка на комментарий
Поделиться на другие сайты

Приятно видеть единомышленников. :)

Могу подсказать еще кусочек оптимизации. Конструкции типа:

CicleBig:  
  lpm							 ;читаем бит типа упаковки и количество упакованных байтов
  mov	 RepeatCounter, r0	   ;Счетчик повторов/неповторов.
  ldi	 Temp,  1
  add	 ZL,    Temp			 ;Следущий байт - байт данных
  adc	 ZH,    MIN

и

CicleRead:
  lpm							 ;читаем байт данных
  ldi	 Temp,	 1
  add	 ZL,	   Temp			
  adc	 ZH,	   MIN

можно заменить на:

CicleBig: 
  lpm	 RepeatCounter, Z+   ;читаем бит типа упаковки и количество упакованных байтов c постинкрементом
; тогда отпадает необходимость приращивать счетчик адреса вручную

и

CicleRead:
  lpm   data, Z+	 ;читаем байт данных
;загрузка данных в конкретный регистр с постинкрементом, не требует последующих MOV Rd, R0 и ADIW Z, 1

Либо:

  ldi	 Temp,  1
  add	 ZL,    Temp			 ;Следущий байт - байт данных
  adc	 ZH,    MIN

меняется на:

adiw   r30, 1

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

  • Сообщения

    • у меня длина пакетов туда и обратно составляет фиксированные 12 байт: 8 данные, 1 команда или флаги операций, остальные контрольная сумма и кодеры пакета (шифрование). И тройной перезапрос со стороны ПС в случае отсутствия ответа от МК. При сборе статистики обмена, в среднем на 70 транзакций приходится один перезапрос, но не более 2 раз. После трех безуспешных перезапросов, программа выдает ошибку соединения.
    • ваше видение имеет крайне общий характер и может быть трактовано неоднозначно. Если вы готовы перематывать и изучать схемы коммутации обмоток, то это не так просто как вам кажется, и вступает в противоречие с вашим же ТЗ: Ни мотору, ни вам хорошо не будет. Поэтому, не ломайте мотор а подключайте как есть. Вращаться будет, медленно. Не понравится - сформируете более конкретные хотелки и начнете перекоммутировать. Никаких ухмылок. Вот программа для намотки. https://www.bavaria-direct.co.za/scheme/calculator/ Разбирайтесь.
    • По поводу времени ожидания последовательного порта. В случае обмена пакетами разной длинны, времени ожидания последовательного порта изменяется в соответствии с длинной пакета. Ну и подразумевается, что байты в пакете передаются без пауз (обусловлено тем, передача ведется через контроллер прямого доступа к памяти [ПДП]). А учитывая, что бутлодер только тем и занят, что принимает данные с последовательного порта, а затем записывает во флеш или еепром (время записи не более 5 мс),  ответ МК на пакет данных от ПС не должен составлять большого времени (<10мс). мне кажется здесь кроется какое-то логическое несоответствие.  
    • А как его проверить с помощью мультиметром если робочий например? Я по схеме собрал не зароботал УВЧ на КП 103 пробитый наверное ещё не проверял мультиметром нужно проверить,и подойдёт ли сюда полевой транзистор MMBF5459 в подобную схему УВЧ,если уж получиться что кп103 мерт 
    • И небыстрая. Срок поставки в ЧиДе небыстрый. (а где ещё нормальные брать).   
    • А я считал, что ВЫ появитесь не раньше 23 апреля. Выяснил, почему последний купленный чип (ATmega88), такой дешевый. При записи в ЕЕПРОМ по СРИАЙ постранично (4 байта на страницу) в некоторых страницах не записываются некоторые байты.   Хотя при записи по одному байту все пишется без ошибок.
    • и выпячивать глазки, глядя на показания... ужс такие индикаторы, неужто стандартных нынче мало ? Как пример p.s. теребонькать epprom пика конечно такое себе. внешнюю память бы конечно лучше бы использовали.  Я вот на основе девайса ra4nal собирал. Правда формирователь не запустился вовсе штатный, дурацкие кп313.
×
×
  • Создать...