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

Обсуждаем контроллеры компании Atmel.
Ответить
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

у жирных мег (от 16к флеша) переходы на обработчики делаются по JMP, соответственно сами вектора 4 байтные. Если обработчик состоит из одной команды, например SBI, то можно схитрить и в сам вектор запихать SBI и RETI.
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Реклама
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

Engineer_Keen писал(а):у жирных мег (от 16к флеша) переходы на обработчики делаются по JMP, соответственно сами вектора 4 байтные.
припустим я юхаем атмегу16 и обработчик лежит в пределах 4кслов
могу я в этом случае применить rjamp ?
Tell Me The Truth
Реклама
Друг Кота
Аватара пользователя
Сообщения: 20117
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

FreshMan писал(а):могу я в этом случае применить rjmp ?
Конечно.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Только не 4кслова, а +2кслова. Т.к. RJMP относительный переход и из начала флеша в 16кбайт на -2кслов перепрыгнуть без грязных хаков не даст компилятор, мы это обсуждали пару страниц назад... С хаками можно из векторов прерываний прыгнуть по RJMP в области 0-2к и "размер флеша"-2к.
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Реклама
Эиком - электронные компоненты и радиодетали
Открыл глаза
Аватара пользователя
Сообщения: 63
Зарегистрирован: Вс май 30, 2010 20:27:33
Откуда: Санкт-Петербург

Сообщение Kill17 »

Подскажите пожалуйста.

Пытаюсь организовать вход в BOOTLOADER по принципу приема байта в течении определенного времени. Что-то не получается ничего :cry:

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


   LDI   r16,high(ramend) 
   OUT   SPH,r16      
   LDI   r16,low(ramend)
   OUT   SPL,r16     

      clr   temp        ; USART: 115200, 8-N-1 
      STS   UBRR0H,temp
      ldi   temp,NB   
      STS   UBRR0L,temp
      ldi   temp,(1<<RXEN0)|(1<<TXEN0)   
      STS   UCSR0B,temp
      ldi   temp,(1<<UCSZ00)|(1<<UCSZ01)
      STS   UCSR0C,temp
  
      LDs	R16, UCSR0A
	 
	  
; =========== 
;    delay loop generator 
;     88472000 cycles:
; ----------------------------- 
; delaying 49939965 cycles:
          ldi  R22, $FF
WGLOOP0:  ldi  R23, $FF
WGLOOP1:  ldi  R24, $FF
WGLOOP2:  dec  R24
          brne WGLOOP2
          dec  R23
          brne WGLOOP1
          dec  R22
          brne WGLOOP0
; ----------------------------- 
; delaying 38531763 cycles:
          ldi  R22, $FB
WGLOOP3:  ldi  R23, $D7
WGLOOP4:  ldi  R24, $ED
WGLOOP5:  dec  R24
          brne WGLOOP5
          dec  R23
          brne WGLOOP4
          dec  R22
          brne WGLOOP3
; ----------------------------- 
; delaying 270 cycles:
          ldi  R22, $5A
WGLOOP6:  dec  R22
          brne WGLOOP6
; ----------------------------- 
; delaying 2 cycles:
          nop
          nop
; =========== 



 sbrs	R16, RXC0
 LDS   R16,UDR0   
 cpi   r16,'?'      
 jmp  $0
 rjmp  $1f10

Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

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

 LDs   R16, UCSR0A ;ок, нормально
 sbrs	R16, RXC0 ;тоже верно
 LDS   R16,UDR0   ;а вот задержку ожидания приема делают не так, есть же пример в даташите! перед этой строкой должен быть переход на повторное чтение флага
 cpi   r16,'?'     ;ок, приняли, сравнили, 
 jmp  $0 ;почему безусловный переход в 0? сравнивали мы для чего? тут либо BRNE либо BREQ, либо любая другая подходящая BRxx
 rjmp  $1f10 ;эта строка никогда не выполнится из-за предидущей
надо так

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

WAIT_RX: 
LDS R16, UCSR0A
SBRS R16, RXC0
RJMP WAIT_RX
LDS R16,UDR0
CPI r16,'?'
BRNE WAIT_RX ;ну или где вам там ждать надо...
RJMP  $1f10
PS: тема не та, это скорее Ассемблер (ASM) для AVR в вопросах и ответах
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Реклама
Открыл глаза
Аватара пользователя
Сообщения: 63
Зарегистрирован: Вс май 30, 2010 20:27:33
Откуда: Санкт-Петербург

Сообщение Kill17 »

Engineer_Keen писал(а):

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

WAIT_RX: 
LDS R16, UCSR0A
SBRS R16, RXC0
RJMP WAIT_RX
LDS R16,UDR0
CPI r16,'?'
BRNE WAIT_RX ;ну или где вам там ждать надо...
RJMP  $1f10
Спасибо! Извините, что не в ту тему влез!
Работает! Но он ожидает байт до посинения, а потом его сравнивает, а как сделать, чтобы время ожидания составляло секунд 8-10 ?
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 20117
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Kill17 писал(а):а как сделать, чтобы время ожидания составляло секунд 8-10 ?
Запускать таймер :idea:
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Открыл глаза
Аватара пользователя
Сообщения: 63
Зарегистрирован: Вс май 30, 2010 20:27:33
Откуда: Санкт-Петербург

Сообщение Kill17 »

Gudd-Head писал(а): Запускать таймер :idea:
Мысль здравая, но я как-то не совсем понимаю, как это сделать. Не ругайтесь только, в данном вопросе разбираюсь недавно, много не понятного.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 20117
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Kill17 писал(а):не совсем понимаю, как это сделать
Надо плясать от тактовой и от камня: смотреть какие есть таймеры, чем их можно тактировать и т.п.
Небольшой ликбез в теме про таймеры: http://radiokot.ru/forum/viewtopic.php? ... 3#p1779973
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Можно и без таймера обойтись. В коде между инициализацией и приемом байта у вас есть зачем-то 3 разные задержки. Можно вместо них сделать один счетчик, примерно так:

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

инициализация
метка1:
счетчик=счетчик+1
если счетчик >= 8-10 секунд (подобрать константу исходя из скорости выполнения алгоритма), то переход куда надо
иначе прием байта
байт='?', переход на загрузчик
иначе переход на метку1
такой код будет в течении нужного времени ждать прием '?' и при его появлении сразу перейдет к загрузчику
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

Engineer_Keen писал(а):Только не 4кслова, а +2кслова. Т.к. RJMP относительный переход и из начала флеша в 16кбайт на -2кслов перепрыгнуть без грязных хаков не даст компилятор, мы это обсуждали пару страниц назад... С хаками можно из векторов прерываний прыгнуть по RJMP в области 0-2к и "размер флеша"-2к.
а если, даже в xmega, обработчики прерываний писать сразу после таблици векторов прерываний то jmp может и не пригодится ?
Tell Me The Truth
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Если RJMP до обработчика достает, то конечно.
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

Engineer_Keen, в вашем примере

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

.include   "m8def.inc"
   .cseg
   .org   0
   RJMP   RESET

   .org   OC2addr
   RJMP   DO_PWM

   .org   OC1Aaddr
   RJMP   FIFTY_MS
   
   .org   URXCaddr
   RJMP   UART_RX

   .org   UTXCaddr
   RJMP   UART_TX   

   .org   INT_VECTORS_SIZE
RESET:   
   CLI
   CLR   ZERO
   OUTI   SPL,Low(RAMEND)
   OUTI   SPH,High(RAMEND)
[...]
мне непонятен смысл этой строчки

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

.org   INT_VECTORS_SIZE
зачем она, что будет если ее упустить ?
Tell Me The Truth
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

FreshMan писал(а):

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

.org   INT_VECTORS_SIZE
зачем она, что будет если ее упустить ?
Она указывает на конец таблицы векторов. Без нее ничего страшного не случится. Просто метка RESET будет расположена не после таблицы прерываний, а после последнего задействованного вектора (RJMP UART_TX).
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

тоесть, я могу и не прописывать все вектора прерываний, а прописать только те что использую
но эта строка .org INT_VECTORS_SIZE является гарантом того что код моей программы будет размещен сразу после последнего вектора таблици векторов
так ?
Tell Me The Truth
Мудрый кот
Аватара пользователя
Сообщения: 1812
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

FreshMan писал(а):.org INT_VECTORS_SIZE является гарантом
Да, именно так.

Вообще уже обсуждалось не раз.
Если ещё не видели, то вот эту темку посмотрите. Там всего пара страниц.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

подскажите пожалуйста, кто в чем пишет на асме в линуксе ?
wine не предлагать ! :))
Tell Me The Truth
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Это же линукс, значит VIM на первом месте.
Контактная информация:
Мудрый кот
Аватара пользователя
Сообщения: 1812
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

Если не wine, то virtualbox :))
Есть avr-gcc в комплекте с avr-as (GNU ассемблер для AVR).
Я сам, вот, никак не доберусь с eclipse разобраться и подружить его с вышеуказанной парочкой.
Думаю, что можно и прочие IDE подружить. Не говоря уже о просто редакторах типа kate или quanta.

Вообще, IDE-шек под линукс довольно много. Вот только у меня нет опыта их использования.
А так, есть, например, anjuta, geany, kdevelop, qt-creator, eclipse.
Eclipse точно может под AVR - к нему есть плагины "заточенные" под AVR.

Добавил чуть позже:
К стати, уважаемый ARV вполне преуспел в освоении Eclipse.
тынц и тынц
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Ответить

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