Ассемблер (ASM) для AVR в вопросах и ответах
у жирных мег (от 16к флеша) переходы на обработчики делаются по JMP, соответственно сами вектора 4 байтные. Если обработчик состоит из одной команды, например SBI, то можно схитрить и в сам вектор запихать SBI и RETI.
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
- Реклама
припустим я юхаем атмегу16 и обработчик лежит в пределах 4ксловEngineer_Keen писал(а):у жирных мег (от 16к флеша) переходы на обработчики делаются по JMP, соответственно сами вектора 4 байтные.
могу я в этом случае применить rjamp ?
Tell Me The Truth
Конечно.FreshMan писал(а):могу я в этом случае применить rjmp ?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Только не 4кслова, а +2кслова. Т.к. RJMP относительный переход и из начала флеша в 16кбайт на -2кслов перепрыгнуть без грязных хаков не даст компилятор, мы это обсуждали пару страниц назад... С хаками можно из векторов прерываний прыгнуть по RJMP в области 0-2к и "размер флеша"-2к.
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Подскажите пожалуйста.
Пытаюсь организовать вход в BOOTLOADER по принципу приема байта в течении определенного времени. Что-то не получается ничего
Пытаюсь организовать вход в BOOTLOADER по принципу приема байта в течении определенного времени. Что-то не получается ничего
Код: Выделить всё
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
- Реклама
Код: Выделить всё
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
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Спасибо! Извините, что не в ту тему влез!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 ?
Запускать таймерKill17 писал(а):а как сделать, чтобы время ожидания составляло секунд 8-10 ?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Мысль здравая, но я как-то не совсем понимаю, как это сделать. Не ругайтесь только, в данном вопросе разбираюсь недавно, много не понятного.Gudd-Head писал(а): Запускать таймер
Надо плясать от тактовой и от камня: смотреть какие есть таймеры, чем их можно тактировать и т.п.Kill17 писал(а):не совсем понимаю, как это сделать
Небольшой ликбез в теме про таймеры: http://radiokot.ru/forum/viewtopic.php? ... 3#p1779973
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Можно и без таймера обойтись. В коде между инициализацией и приемом байта у вас есть зачем-то 3 разные задержки. Можно вместо них сделать один счетчик, примерно так:
такой код будет в течении нужного времени ждать прием '?' и при его появлении сразу перейдет к загрузчику
Код: Выделить всё
инициализация
метка1:
счетчик=счетчик+1
если счетчик >= 8-10 секунд (подобрать константу исходя из скорости выполнения алгоритма), то переход куда надо
иначе прием байта
байт='?', переход на загрузчик
иначе переход на метку1
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
а если, даже в xmega, обработчики прерываний писать сразу после таблици векторов прерываний то jmp может и не пригодится ?Engineer_Keen писал(а):Только не 4кслова, а +2кслова. Т.к. RJMP относительный переход и из начала флеша в 16кбайт на -2кслов перепрыгнуть без грязных хаков не даст компилятор, мы это обсуждали пару страниц назад... С хаками можно из векторов прерываний прыгнуть по RJMP в области 0-2к и "размер флеша"-2к.
Tell Me The Truth
Если RJMP до обработчика достает, то конечно.
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
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
Она указывает на конец таблицы векторов. Без нее ничего страшного не случится. Просто метка RESET будет расположена не после таблицы прерываний, а после последнего задействованного вектора (RJMP UART_TX).FreshMan писал(а):зачем она, что будет если ее упустить ?Код: Выделить всё
.org INT_VECTORS_SIZE
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
тоесть, я могу и не прописывать все вектора прерываний, а прописать только те что использую
но эта строка .org INT_VECTORS_SIZE является гарантом того что код моей программы будет размещен сразу после последнего вектора таблици векторов
так ?
но эта строка .org INT_VECTORS_SIZE является гарантом того что код моей программы будет размещен сразу после последнего вектора таблици векторов
так ?
Tell Me The Truth
Да, именно так.FreshMan писал(а):.org INT_VECTORS_SIZE является гарантом
Вообще уже обсуждалось не раз.
Если ещё не видели, то вот эту темку посмотрите. Там всего пара страниц.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
подскажите пожалуйста, кто в чем пишет на асме в линуксе ?
wine не предлагать !
wine не предлагать !
Tell Me The Truth
Это же линукс, значит VIM на первом месте.
Если не wine, то virtualbox 
Есть avr-gcc в комплекте с avr-as (GNU ассемблер для AVR).
Я сам, вот, никак не доберусь с eclipse разобраться и подружить его с вышеуказанной парочкой.
Думаю, что можно и прочие IDE подружить. Не говоря уже о просто редакторах типа kate или quanta.
Вообще, IDE-шек под линукс довольно много. Вот только у меня нет опыта их использования.
А так, есть, например, anjuta, geany, kdevelop, qt-creator, eclipse.
Eclipse точно может под AVR - к нему есть плагины "заточенные" под AVR.
Добавил чуть позже:
К стати, уважаемый ARV вполне преуспел в освоении Eclipse.
тынц и тынц
Есть 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 г.)
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)


