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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Сообщение Gudd-Head »

Челюскин писал(а):что такое м.б.?

"может быть"
Челюскин писал(а):а в даташите есть абсоютный адрес?

в даташите ВСЁ есть.

Ебааать...

Код: Выделить всё

.equ   kdel = 200 ;
...
      out      OCR1AH, high(kdel)   ; Записать ст. байт коэфф.деления
      out      OCR1AL, low(kdel)   ; Записать мл. байт коэфф.деления

Что это??? :facepalm:
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Челюскин
Прорезались зубы
Сообщения: 209
Зарегистрирован: Ср ноя 03, 2010 14:46:17

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

Сообщение Челюскин »

Gudd-Head писал(а):

Код: Выделить всё

.equ   kdel = 200 ;
...
      out      OCR1AH, high(kdel)   ; Записать ст. байт коэфф.деления
      out      OCR1AL, low(kdel)   ; Записать мл. байт коэфф.деления

Что это??? :facepalm:


:oops: :oops: :oops: и.... как нужно?
(я пытался даже для самого себя их просто очистить "clr" вообще в исходной проге было косвенное чтение из таблицы типа:
Table: .dw 1000, 1100, 1200; ну и так далее с вычислением адреса......
э..э в них я так понял нельзя непосредственно писать значения?
Лень - двигатель прогресса!
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Нельзя в AVR командой OUT переслать константу. Ведь выше и ниже этих строк идет правильная установка

Код: Выделить всё

;##    генератор сигнала 20000кГц           ##

.equ   kdel = 200 ;
m3:      
      out      OCR1AH, high(kdel)   ; Записать ст. байт коэфф.деления ??????????????
      out      OCR1AL, low(kdel)   ; Записать мл. байт коэфф.деления ????????????

      ldi      temp, 0x40      ; Включить сигнал !!!!!!!!!!!!!!!!
      out      TCCR1A, temp;
      rjmp   main;
Челюскин
Прорезались зубы
Сообщения: 209
Зарегистрирован: Ср ноя 03, 2010 14:46:17

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

Сообщение Челюскин »

секунду, попробую....
Лень - двигатель прогресса!
Челюскин
Прорезались зубы
Сообщения: 209
Зарегистрирован: Ср ноя 03, 2010 14:46:17

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

Сообщение Челюскин »

Было: out OCR1AH, high(kdel) ; Записать ст. байт коэфф.деления
out OCR1AL, low(kdel) ; Записать мл. байт коэфф.деления
в итоге хрен а не компиляция!


Стало:
ldi temp, high(kdel);
out OCR1AH, temp ;
ldi temp, low(kdel)
out OCR1AL, temp ;

ldi temp, 0x40 ;
out TCCR1A, temp;
rjmp main;
Отсюда вывод - учить мне матчасть.!!!
Спаибо за помощь, господа. :beer: вроде понял в чем дело
Лень - двигатель прогресса!
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Сообщение Gudd-Head »

Если ещё не скачали, то обязательно скачайте себе книгу "Микроконтроллеры AVR семейства Tiny Mega фирмы Atmel" А.В.Евстифеев , там подробно описаны команды, в т.ч. ограничение их действия.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Челюскин
Прорезались зубы
Сообщения: 209
Зарегистрирован: Ср ноя 03, 2010 14:46:17

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

Сообщение Челюскин »

Gudd-Head, спасибо огромное за совет. Прямо сейчас и сделаю!
Лень - двигатель прогресса!
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

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

Сообщение Alexeyslav »

Там не из любого регистра можно вывести в порт, надо использовать регистры с 16 по 31.
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Неправильно. Можно ввести и вывести в любой/из любого РОН. Источник
СпойлерИзображение
IN_OUT_AVR.GIF
Последний раз редактировалось akl Вт авг 14, 2012 13:31:30, всего редактировалось 2 раза.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Сообщение Gudd-Head »

akl писал(а):Неправильно. Можно ввести и вывести в любой/из любого РОН.

Видимо, имелась в виду связка ldi - out.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

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

Сообщение ILYAUL »

Alexeyslav писал(а):надо использовать регистры с 16 по 31.
Не важно.
имелась в виду связка ldi - out.
Но можно и без нее.
Челюскин
Прорезались зубы
Сообщения: 209
Зарегистрирован: Ср ноя 03, 2010 14:46:17

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

Сообщение Челюскин »

Подскажите, пожалуйста как организовать такой обмен через USART (оба MK - tiny2313V).
1. ведущее ус-во посылает байт.
2. ждет ответа от ведомого, если он не приходит, то через (ну 1-2 сек) посылает опять..

Написал проги для ведомого и ведущего, вот никак не соображу как сделать эту задержку. Про прерывания по приёму и таймеру пока только мечтаю, уж извините. Можно ли тут организовать простую задержку путем декремента регистров? и еще - в даташите даны примеры для USART - прием байта и передача, они являются жестко связанными, или в них можно что-то изменить, ту же задержку добавить?
Лень - двигатель прогресса!
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

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

Сообщение ILYAUL »

1. ведущее ус-во посылает байт.

Задержку - можете сделать и вычитанием
Для мастера.
Спойлер

Код: Выделить всё

.include "tn2313def.inc"
;*************************************************
;*          ;;/Начальные установки ;;*          *
;*************************************************
   rjmp RESET      ; Reset Handler
   /*
   rjmp INT0      ; External Interrupt0 Handler
   rjmp INT1      ; External Interrupt1 Handler
   rjmp TIM1_CAPT   ; Timer1 Capture Handler
   rjmp TIM1_COMPA ; Timer1 CompareA Handler
   rjmp TIM1_OVF   ; Timer1 Overflow Handler
   rjmp TIM0_OVF   ; Timer0 Overflow Handler
   */
.org URXCaddr
   rjmp USART0_RXC ; USART0 RX Complete Handler
/*
   rjmp USART0_DRE ; USART0,UDR Empty Handler
   rjmp USART0_TXC ; USART0 TX Complete Handler
   rjmp ANA_COMP   ; Analog Comparator Handler
   rjmp PCINT0      ; PCINT0 Handler
   rjmp TIMER1_COMPB   ; Timer1 Compare B Handler
   rjmp TIMER0_COMPA ; Timer0 Compare A Handler
   rjmp TIMER0_COMPB ; Timer0 Compare B Handler
   rjmp USI_START ; USI Start Handler
   rjmp USI_OVERFLOW ; USI Overflow Handler
.org ERDYaddr
   rjmp EEPROM_WR ; EEPROM Write
   rjmp WDT_OVERFLOW ; Watchdog Overflow Handler
   rjmp PCINT1 ; PCINT1 Handler
   rjmp PCINT2 ; PCINT2 Handler
   */
RESET:
      cli
      outi   ACSR,0x80
;**************************************************
;*         ;;/Initialization USART0;;*           *
;**************************************************
      ldi      temp,HIGH((SYSCLK/(16*USARTSPEED))-1)   ; для 9600 - - 0x47
      outr   UBRRH,temp
      ldi      temp,LOW((SYSCLK/(16*USARTSPEED))-1)
      outr   UBRRL,temp
      outi   UCSRB,1<<RXCIE|1<<RXEN|1<<TXEN
      outi   UCSRC,1<<UCSZ1|1<<UCSZ0
;+Установки USART - 9600 8-N-1
                ldi temp,байт
MAIN:
                out     UDR,temp
                rcall   ЗАДЕРЖКА
                rjmp  main
;************************************************
;*                ;;+USART;;*              *
;************************************************
USART0_RXC:
      in      SaveSreg,SREG
      in      temp,UDR
      sbr      Flags,1<<fl_RdyRX
      out      UDR,temp
      out      SREG,SaveSreg
      А вот куда уйти из прерывания Вы не написали
Челюскин
Прорезались зубы
Сообщения: 209
Зарегистрирован: Ср ноя 03, 2010 14:46:17

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

Сообщение Челюскин »

Спасибо, я, правда, прерывания не очень пока понимаю. Стало быть можно вклинить задержку в процедуру опроса флага и приема байта USART?

Priem:
sbis UCSRA, RXC;
rjmp Priem;
in temp, UDR;
ret;

все по даташиту... куда можно вставит задержку?
Лень - двигатель прогресса!
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

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

Сообщение ILYAUL »

Челюскин писал(а):2. ждет ответа от ведомого, если он не приходит, то через (ну 1-2 сек) посылает опять..

Код: Выделить всё

Priem:
sbis    UCSRA,  RXC;
rjmp  Priem;
in  temp,  UDR;
ret;

все по даташиту... куда можно вставит задержку?

Этот кусок кода Вам надо вставить в подпрограмму задержки. Почему. У Вас процессор выполняет одновремено две задачи. Ждёт ответ slave и считает секунды. В Вашем случае , без прерываний, нужно чтобы проверку на прием и проверку на истечение времени процессор обрабатывал вместе.

Ну типа так

Код: Выделить всё

ldi теmp, 0xff ;Величина задержки для примера , сами напишите сколько Вам надо  и сколько регистров потребуется для задержки 1 сек Лень - двигатель прогресса! 
DELAY:
sbic    UCSRA,  RXC
rjmp  END
subi     temp,1   ;В отличие от dec команды sub и subi выставляют + ещё флаг С - привыкайте лучше к ним
brcc    DELAY
out     UDR,temp ;Согласно Вашему- то через (ну 1-2 сек) посылает опять..
rjmp   DELAY
END:   
To куда-то
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

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

Сообщение Alexeyslav »

Тут надо определится. Ведь подпрограмма у тебя одна, как при выходе из подпрограммы основная программа узнает что выход был по таймауту а не по считыванию данных? Надо заводить где-то признак или отводить под это целый регистр.

Ну а сама реализация... проще некуда - собственно прием данных осуществляется как? сначала проверяется приняты ли данные(один бит спецрегистра) если данные приняты - происходит считывание и выход, если нет - переход на проверку приняты ли данные. У тебя вместо этого перехода надо осуществить переход на подпрограмму формирования задержки скажем в 1мс и отсчет количества этих задержек - если этот алгоритм насчитал 2000 раз значит выставить признак таймаута и выйти с подпрограммы. Перед тем как зацикливаться конечно надо обнулить счетчик и сбросить признак таймаута.
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

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

Сообщение Jack_A »

Челюскин писал(а): Можно ли тут организовать простую задержку путем декремента регистров?


Можно, но не нужно. Тупо считать задержку вычитанием, при этом остальной процесс останавливается - это очень уж по школярски. Попробуй прерывания, это не так и сложно. Один раз сделаешь - пот`ом от них за уши не оттащишь :)
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

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

Сообщение zero648 »

На самом деле, прерывания это просто:

Вектор прерывания:

...
rjmp USART_Rx_Complete ; USART,RXC USART, прием завершен
...

Кусок кода в программе:

...
ori r16, (1<<RXCIE) ; включаем прерывания
out UCSRB,r16 ;
...

Обработчик прерывания:

USART_Rx_Complete:
in r18, UDR ; загружаем принятые данные из буфера
...
reti
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

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

Сообщение shads »

Сообразил тут декодер радиоканала на тиньке 13-й, в двух вариантах, на С и на асме, так вот мож кому интересно будет узнать, разница в весе кода - больше чем в 2 раза, на С - 870 байт, а на асме тоже самое - 420 байт.....
Помоему асма остается актуальной для таких мелкашек как tiny13

http://asis-kbr.ru/forum/viewtopic.php?f=9&t=122
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

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

Сообщение avreal »

Я даже больше скажу -- если написать на асме программу размером байт десять, то С-шный вариант проиграет раз в пять-восемь, так как С (по крайней мере WinAVR) и всю таблицу прерываний заполняет переходом на ловушку необработанных прерываний, и прочие «общеподготовительные» вещи могут место занять. Т.е. у С-шной программы даже без желания автора обычно несколько другой функционал.

И на малых программах асм позволяет почти все переменные в регистрах разместить.

На больших программах недостаток С в виде некоторых начальных затрат и преимущество асма по размещению части переменных в оптимальных для этого регистрах пропадают и разница уже не такая большая.

Никаких противоречий со сказанным ранее про асм и С :-)
Для tiny13, tiny26, tiny24 я и сам на асме пишу -- когда нужно вылизывать такты/потребление.
А когда не нужно — то лишь бы влезло.

Кстати, если оно на С под WinAVR или без особой привязке к компилятору, если можно — в личку оба проекта, я посмотрю, что можно сделать с С-шным вариантом.

Увидел всё по линку, гляну по свободе. На носу куча выходных :-)
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Ответить

Вернуться в «AVR»