То с таблицей в ПЗУ их еще больше будет - хотя бы по размещению данных в ячейках ПЗУ и поведению указателя Z (бит Z.0) при отработке команды LPM.
Ассемблер (ASM) для AVR в вопросах и ответах
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Ежли с обычной ОЗУ вопросы...
То с таблицей в ПЗУ их еще больше будет - хотя бы по размещению данных в ячейках ПЗУ и поведению указателя Z (бит Z.0) при отработке команды LPM.

То с таблицей в ПЗУ их еще больше будет - хотя бы по размещению данных в ячейках ПЗУ и поведению указателя Z (бит Z.0) при отработке команды LPM.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
ПТУ-шник писал(а):А как сделать цикл я не знаю пока. Проще тогда эти константы в FLASH сделать и всё.
Не только проще, а это единственно разумный вариант размещения констант. Но для извлечения их из флеши - все равно без цикла никак.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Для начала пущай с "ручным распихиванием" и циклами потренируется, а не то "первый облом" интерес к ассемблеру напрочь отобьёт.

Re: Ассемблер (ASM) для AVR в вопросах и ответах
Конечно, так и нужно. По мне, ничего страшногоПТУ-шник писал(а): Проще тогда эти константы в FLASH сделать и всё.
Спойлер
Код: Выделить всё
;МК attiny2313.
.equ Numb0 = 0b00111111 // Запоминаем цифры
.equ Numb1 = 0b00000110
.equ Numb2 = 0b01011011
.equ Numb3 = 0b01001111
.equ Numb4 = 0b01100110
.equ Numb5 = 0b01101101
.equ Numb6 = 0b01111101
.equ Numb7 = 0b00000111
.equ Numb8 = 0b01111111
.equ Numb9 = 0b01101111
.include "tn2313def.inc"
; ***************** Константы/переменные ***********
.def temp = R16
;// ОЗУ ===================
;.dseg
;.org 0x60
;ArrayNumb: // Массив в ОЗУ
;.db Numb0,Numb1,Numb2,Numb3,Numb4,Numb5,Numb6,Numb7,Numb8,Numb9
//Начало =================
.cseg
.org 0
;****************** Таблицы векторов *******************
rjmp RESET ; Reset Handler
reti ;INT0 ; External Interrupt0 Handler
reti ;INT1 ; External Interrupt1 Handler
reti ;TIM1_CAPT ; Timer1 Capture Handler
reti ;TIM1_COMPA ; Timer1 CompareA Handler
rjmp TIM1_OVF ; Timer1 Overflow Handler
reti ;TIM0_OVF ; Timer0 Overflow Handler
reti ;USART0_RXC ; USART0 RX Complete Handler
reti ;USART0_DRE ; USART0,UDR Empty Handler
reti ;USART0_TXC ; USART0 TX Complete Handler
reti ;ANA_COMP ; Analog Comparator Handler
reti ;PCINT ; Pin Change Interrupt
reti ;TIMER1_COMPB ; Timer1 Compare B Handler
reti ;TIMER0_COMPA ; Timer0 Compare A Handler
reti ;TIMER0_COMPB ; Timer0 Compare B Handler
reti ;USI_START ; USI Start Handler
reti ;USI_OVERFLOW ; USI Overflow Handler
reti ;EE_READY ; EEPROM Ready Handler
reti ;WDT_OVERFLOW ; Watchdog Overflow Handle
ArrayNumb: // Массив в FLASH
.db Numb0,Numb1,Numb2,Numb3,Numb4,Numb5,Numb6,Numb7,Numb8,Numb9
ArrayNumb_END:
;************ Предварительная настройка**********
Reset:
;************ Инициализация стека **********
ldi r16, low(RAMEND)
out SPL,r16
;************ Настройка I/O и переферии**********
ldi temp, 0b11111111
out DDRB, temp
ldi temp, 0b00111100
out DDRD, temp
LDI R16,1<<SE
OUT MCUCR,R16
ldi temp, (1<<CS11) | (1<<CS10); Делитель на 64
out TCCR1B, temp
ldi temp, (1<<TOIE1)
out TIMSK, temp
sbi PORTD,2 // УСТАНОВИМ 2
ldi ZL, LOW(ArrayNumb*2) // считаем адрес FLASH
ldi ZH, HIGH(ArrayNumb*2) // в озу
;ldi ZL, LOW(ArrayNumb) // считаем адресс
;ldi ZH, HIGH(ArrayNumb) // в озу
sei
; rjmp Main
;************ Главная программа *************
Main:
SLEEP
rjmp MAIN
;************ Прерывание таймер *************
TIM1_OVF:
LPM R16,Z+
OUT PORTB,R16
CPI ZL,ArrayNumb_END*2
BRLO TIM1_OUT
ldi ZL, LOW(ArrayNumb*2) // считаем адрес FLASH
TIM1_OUT:
RETI
;ld temp, Z+ //Считываем что находится по адресу ригстровой пары Z и потом прибавляем +1
;out PORTB, temp
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Приветствую.
В даташитах на тини контроллеры, в разделе "Self-Programming the Flash" присутствуют строчки:
"The CPU is halted during the Page Erase operation."
"The CPU is halted during the Page Write operation."
Означает ли это, что периферия (в частности USART) тоже остановится на время прожига?
Задача разряда "for fun". Хочу реализовать бутлоадер для ATtiny2313, который бы сам принимал по UART файл прошивки .hex, декодировал его и прошивался. Таким образом планирую избавиться от зависимости от ОС-зависимого софта. Проблема в том, что контроллеру нужно 4.5 мс на прошивку страницы, во время которых он не сможет принимать данные. Следовательно, нужно организовать управление потоком. Хотелось бы обойтись без RTS/CTS, попробую заюзать XOn/XOff. Прощупываю, насколько это реально. Конечно, есть еще вариант заставить комп отсылать файл с паузами.
В даташитах на тини контроллеры, в разделе "Self-Programming the Flash" присутствуют строчки:
"The CPU is halted during the Page Erase operation."
"The CPU is halted during the Page Write operation."
Означает ли это, что периферия (в частности USART) тоже остановится на время прожига?
Задача разряда "for fun". Хочу реализовать бутлоадер для ATtiny2313, который бы сам принимал по UART файл прошивки .hex, декодировал его и прошивался. Таким образом планирую избавиться от зависимости от ОС-зависимого софта. Проблема в том, что контроллеру нужно 4.5 мс на прошивку страницы, во время которых он не сможет принимать данные. Следовательно, нужно организовать управление потоком. Хотелось бы обойтись без RTS/CTS, попробую заюзать XOn/XOff. Прощупываю, насколько это реально. Конечно, есть еще вариант заставить комп отсылать файл с паузами.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
kolpakchi, написано, что CPU останавливается. Больше ничего. Читаем как написано, для начала.
Можно ещё передавать на скорости 2400 бод с чётностью - время передачи одного байта будет 4,58мс (если ничего не напутал). А с учетом буферизации в USART можно и на 4800.
Можно ещё передавать на скорости 2400 бод с чётностью - время передачи одного байта будет 4,58мс (если ничего не напутал). А с учетом буферизации в USART можно и на 4800.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Тогда уж лучше "загрузочную ЕЕПРОМку" из 24-й серии...

- COKPOWEHEU
- Говорящий с текстолитом
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Я делал так: при старте ПК запрашивает размер страницы и потом пересылает по одной странице с LRC-кодом контроля (LRC - метод, используемый для контроля HEX-файлов, просто сумма переданных байтов), потом контроллер посылает отчет об успехе.Проблема в том, что контроллеру нужно 4.5 мс на прошивку страницы, во время которых он не сможет принимать данные. Следовательно, нужно организовать управление потоком. Хотелось бы обойтись без RTS/CTS, попробую заюзать XOn/XOff. Прощупываю, насколько это реально. Конечно, есть еще вариант заставить комп отсылать файл с паузами.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Внесу свои 5 копеек. В Атмелевском файле AVR202.asm представлена идиома "Negate a 16-bit Register Variable":
на самом деле можно сделать короче:
Код: Выделить всё
com ng1l
com ng1h
subi ng1l,low(-1)
sbci ng1h,high(-1)
на самом деле можно сделать короче:
Код: Выделить всё
neg ng1h
neg ng1l
sbci ng1h,0
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Привет всем. )
Вопрос. Как всегда тупой.
Не нашел у себя в списке команд. Видимо программист из меня хреновый.
Как поменять (инвертировать) один бит в регистре. Причем довольно быстро.
Т.е. пришел в прерывание, а до этого в порту уже стояло какое-то значение, и в прерывании просто перевернул его на обратное и вышел. А при очередном входе в прерывание тоже самое, т.е. просто постоянно меняет значение бита на обратное.
Вопрос. Как всегда тупой.
Не нашел у себя в списке команд. Видимо программист из меня хреновый.
Как поменять (инвертировать) один бит в регистре. Причем довольно быстро.
Т.е. пришел в прерывание, а до этого в порту уже стояло какое-то значение, и в прерывании просто перевернул его на обратное и вышел. А при очередном входе в прерывание тоже самое, т.е. просто постоянно меняет значение бита на обратное.
Станислав
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Вот. Я ищу XOR, как инете написали, а у меня его в списке нет, но есть EOR. )))
Станислав
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Ассемблер (ASM) для AVR в вопросах и ответах
При записи 1 в PINX, инвертируется PORTX. Наверное это самое быстрое. Не у всех МК есть такая фича.СКАЗОЧНИК писал(а):а до этого в порту уже стояло какое-то значение, и в прерывании просто перевернул его на обратное и вышел.
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Спасибо. Уже сделал. ) В три команды вышло. У меня ТИНИ2313.
Код: Выделить всё
in R16, PINB
eor R16, R20
out PORTB, R16
Станислав
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Сразу все биты?

может усе же только "один из" нужен...

может усе же только "один из" нужен...
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Нужно два, вообще-то. Но пока мне не важно было, что с остальными выводами порта происходит, ибо на них пока ничего не подключено.
А потом, конечно думать надо.
А потом, конечно думать надо.
Станислав
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Ассемблер (ASM) для AVR в вопросах и ответах
tiny2313a есть такая фича.
Выделяете один РОН, под маску для инвертирования. Тогда в прерывании понадобится одна однотактовая команда, OUT PINX, РОН.
Если Ваше прерывание ничего больше не делает, кроме как инвертирует порт, то не надо ничего скидывать на стек и забирать оттуда. Думаю быстрее некуда.
Выделяете один РОН, под маску для инвертирования. Тогда в прерывании понадобится одна однотактовая команда, OUT PINX, РОН.
Если Ваше прерывание ничего больше не делает, кроме как инвертирует порт, то не надо ничего скидывать на стек и забирать оттуда. Думаю быстрее некуда.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Ладныть... гляну...
АВР конечно не mcs51 с CPL bit но усе же чегось нашкарябать можно.
Кстати... у 2313 "троглобит" поддерэивается, так что можно с портом отак схимичить:
ldi tmp,(1<<bit_a | 1<<bit_b)
out pin_х,tmp
где bit_a и bit_b требуемые позиции, а pin_х регистр выводов соответствующего порта.

Z_h_e
держать маску в регистрвом файле по ресурсам накладно (ежли только не в r2-r15).
скорее или непосредственная загрузка или получение из ОЗУ...
интересно...
а будет ли равноценно при (1<<bit_a | 1<<bit_b) предварительно загруженном в ячейку mask ОЗУ воть такой конструктив:
lds tmp,mask
sts (pin_х+0x20),tmp
??
Еще одна версия "троглодитства" с учетом особенностей 2313 и порта би... (для диапазона портов УВВ 0x00-0x1f)
банальное
sbi pin_х,(1<<bit_a | 1<<bit_b)

АВР конечно не mcs51 с CPL bit но усе же чегось нашкарябать можно.
Кстати... у 2313 "троглобит" поддерэивается, так что можно с портом отак схимичить:
ldi tmp,(1<<bit_a | 1<<bit_b)
out pin_х,tmp
где bit_a и bit_b требуемые позиции, а pin_х регистр выводов соответствующего порта.
Z_h_e
держать маску в регистрвом файле по ресурсам накладно (ежли только не в r2-r15).
скорее или непосредственная загрузка или получение из ОЗУ...
интересно...
а будет ли равноценно при (1<<bit_a | 1<<bit_b) предварительно загруженном в ячейку mask ОЗУ воть такой конструктив:
lds tmp,mask
sts (pin_х+0x20),tmp
??
Еще одна версия "троглодитства" с учетом особенностей 2313 и порта би... (для диапазона портов УВВ 0x00-0x1f)
банальное
sbi pin_х,(1<<bit_a | 1<<bit_b)

Последний раз редактировалось BOB51 Вт окт 04, 2016 20:30:32, всего редактировалось 3 раза.
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Благодарность всем. Забрал все для использования. Но не гарантирую, что я это буду помнить через пол года. Все равно забуду....

Станислав
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Я конечно задачу СКАЗОЧНИКа не знаю. Но почти наверняка, не будет никакого накладства, особенно, если стоит задача максимально быстро инвертировать порт. Некоторые процы вобще одним РОН обходятся - аккумулятором, а тут аж 32 штуки, даже скорее всего можно пожертвовать из блатных РОН, а не только r2-r15, но смысла конечно нет в этом.BOB51 писал(а):держать маску в регистрвом файле по ресурсам накладно (ежли только не в r2-r15).
Эти команды двухтактовые, плюс придется сохранять на стек tmp.BOB51 писал(а):lds tmp,mask
sts (pin_х+0x20),tmp
Команда двухтактовая и работает только с одним битом.sbi pin_х,(1<<bit_a | 1<<bit_b)

