Ассемблер (ASM) для AVR в вопросах и ответах
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
1. каким образом у тебя выводится дв. счетную последовательность...
если изменяется temp (он же R16), а в порт выдается R17 (temp1), т.е. на выходе порта всегда будет 0х01.
2. нажатие кнопки сопровождается дребезгом, поэтому подключи кондер 0.1 мкф и подтяни вн.резистором на +5В, ну желательно программную обработку дребезга ввести.
если изменяется temp (он же R16), а в порт выдается R17 (temp1), т.е. на выходе порта всегда будет 0х01.
2. нажатие кнопки сопровождается дребезгом, поэтому подключи кондер 0.1 мкф и подтяни вн.резистором на +5В, ну желательно программную обработку дребезга ввести.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Да, точно, косяк в регистре R16 и R17.
Попутал.
А вот только как программно подключить вн. подтягивающий резистор?
У меня как кнопки подключены, - +5В---резистор 10к----- пин порта...
Попутал.
А вот только как программно подключить вн. подтягивающий резистор?
У меня как кнопки подключены, - +5В---резистор 10к----- пин порта...
Не умеешь - не берись, но не взявшись не научишься...
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
если у тебя стоит 10к на +5в - то это и есть подтяжка.
а как подключить внутр.резисторы написано в ДШ, ну или у Евстифеева.
Попутал ты потому что в одном месте пишешь имя ристра, а вдругом имя заданное директивой .def, ту уж если задаешь имя так и используй его, и имена надо давать осмысленные.
И еще, если ты обзываешь п/п Delay так и делай в ней только задержку, иначе потом еще где-нибудь захочешь использовать и будешь сидеть гадать почему работает не так как надо.
На сайте у ARV есть асм-код оформленный очень красиво, к этому надо привыкать с молодых ногтей, ну на крайняк у меня в спидометре посмотри, там конечно не так красиво, но я старался
а как подключить внутр.резисторы написано в ДШ, ну или у Евстифеева.
Попутал ты потому что в одном месте пишешь имя ристра, а вдругом имя заданное директивой .def, ту уж если задаешь имя так и используй его, и имена надо давать осмысленные.
И еще, если ты обзываешь п/п Delay так и делай в ней только задержку, иначе потом еще где-нибудь захочешь использовать и будешь сидеть гадать почему работает не так как надо.
На сайте у ARV есть асм-код оформленный очень красиво, к этому надо привыкать с молодых ногтей, ну на крайняк у меня в спидометре посмотри, там конечно не так красиво, но я старался
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Вообщем, мне надо организовать задержку в 255нс.
Так вот, как я это делаю.
Если МК изначально тактируется от внутреннего генератора на 1Мгц, то, высчитав период сигнала, получим, 1период тактового генератора равен 1/1000000с или равен 1нс.
Мне надо таких периодов 255, получается.
Поэтому ввел цикл задержки:
написано не аккуратно (мне сейчас пока не об этом...
Но все же.
ни где я не обсчелся, верно ли, что при таком коде я получу задержку в 255нс?
Так вот, как я это делаю.
Если МК изначально тактируется от внутреннего генератора на 1Мгц, то, высчитав период сигнала, получим, 1период тактового генератора равен 1/1000000с или равен 1нс.
Мне надо таких периодов 255, получается.
Поэтому ввел цикл задержки:
Код: Выделить всё
ldi Temp,RamEnd
out SPL,Temp
rcall delay
ldi temp, 0b00000000
delay:
ldi temp, 0b00111110
test: dec temp
cpi temp, 0
brne test
ret
написано не аккуратно (мне сейчас пока не об этом...
Но все же.
ни где я не обсчелся, верно ли, что при таком коде я получу задержку в 255нс?
Не умеешь - не берись, но не взявшись не научишься...
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Жень, вот опять ты пишешь не подумавши, при 1МГц один такт мк будет составлять 1 мкс, а никак не 1 нс,
и команда
совершенно лишняя, т.к. команда dec при обнулении переменной выставит флаг Z
и команда
Код: Выделить всё
cpi temp,0совершенно лишняя, т.к. команда dec при обнулении переменной выставит флаг Z
Re: Ассемблер (ASM) для AVR в вопросах и ответах
все разобрался, по своей глупости забыл про приставку милли
А так микро это 10 в -6.
А как мне тогда организовать задержку такую в 255нс?
Еще бы поделить на 1000.
Но в Аттини 2313 предделитель только на 256 (максимально) разделить может.
А так микро это 10 в -6.
А как мне тогда организовать задержку такую в 255нс?
Еще бы поделить на 1000.
Но в Аттини 2313 предделитель только на 256 (максимально) разделить может.
Последний раз редактировалось Arlleex Сб май 29, 2010 20:06:40, всего редактировалось 1 раз.
Не умеешь - не берись, но не взявшись не научишься...
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
не прав
1мс=0.001с (10-3 мили)
1 мкс= 0.000001с (10-6 микро)
1 нс = 0.000000001с (10-9 нано) -> 1/1нс=1000000000Гц=1ГГц
1мс=0.001с (10-3 мили)
1 мкс= 0.000001с (10-6 микро)
1 нс = 0.000000001с (10-9 нано) -> 1/1нс=1000000000Гц=1ГГц
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
чтобы получить задержку в 255нс тактовая должна быть кратна 3921568,62Гц при такой тактовой 1 такт мк как раз раз равен 255 нс.
к примеру 1такт для разных частот будет такой
1МГц - 1 мкс
2МГц - 0.5 мкс
4МГц - 0.25 мкс
8МГц - 0.125 мкс и т.д.
к примеру 1такт для разных частот будет такой
1МГц - 1 мкс
2МГц - 0.5 мкс
4МГц - 0.25 мкс
8МГц - 0.125 мкс и т.д.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
так. ВСе понял.
теперь. Подключаю HD44780 к Аттини2313.
тактовая - 1МГц.
Для того чтобы что то вывести в дисплей, надо соблюдать между вот этими операциями
время, не меньшее 250нс.
Значит можно вообще выставить тактовую в 1мгц (по умолчанию) и вообще никаких задержек не вводить? (ведь 1мкс это больше чем 250нс?)
теперь. Подключаю HD44780 к Аттини2313.
тактовая - 1МГц.
Для того чтобы что то вывести в дисплей, надо соблюдать между вот этими операциями
Код: Выделить всё
1. Установить значение линии RS
2. Вывести данные на шину данных Db0...Db7
3. Установить линию Е в 1
4. Установить R/W в 0
5. Установить линии шины данных в состояние Hi-zвремя, не меньшее 250нс.
Значит можно вообще выставить тактовую в 1мгц (по умолчанию) и вообще никаких задержек не вводить? (ведь 1мкс это больше чем 250нс?)
Не умеешь - не берись, но не взявшись не научишься...
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
если иппульс на выводе Е будет больше минимально допустимого, то да.
Смотри в ДШ на индикатор минимальную длительность стробирования, при тактовой 1 МГц вкл-выкл линии порта будет равен 1 мкс.
Смотри в ДШ на индикатор минимальную длительность стробирования, при тактовой 1 МГц вкл-выкл линии порта будет равен 1 мкс.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Точно спрашиваю элементарную вещь - но никак не могу найти ответ 
на Си писал конфигурирование портов вот так:
PORTF=0x00;
DDRF=0x00;
PORTG=0x1F;
DDRG=0x00;
А в AVR Studio 4.17 на код
ldi r16, 0x00
out PORTF, r16
out DDRF, r16
ldi r16, 0x1f
out PORTG, r16
ldi r16, 0x00
out DDRG, r16
получаю ошибку что для команды out номер порта превышен...
Где то читал что так оно и есть и для этих портов используются другие команды ввода-вывода.. но вот чтото в 2:45 найти быстро не могу..
Подскажите как правильно ?
p.s. не пинайте сильно, учусь только...
p.p.s. а в куче примерах (которые есть во многих книжках) редко доходят до портов F и G обычно останавливаются на D... с ними и у меня проблем нет
на Си писал конфигурирование портов вот так:
PORTF=0x00;
DDRF=0x00;
PORTG=0x1F;
DDRG=0x00;
А в AVR Studio 4.17 на код
ldi r16, 0x00
out PORTF, r16
out DDRF, r16
ldi r16, 0x1f
out PORTG, r16
ldi r16, 0x00
out DDRG, r16
получаю ошибку что для команды out номер порта превышен...
Где то читал что так оно и есть и для этих портов используются другие команды ввода-вывода.. но вот чтото в 2:45 найти быстро не могу..
Подскажите как правильно ?
p.s. не пинайте сильно, учусь только...
p.p.s. а в куче примерах (которые есть во многих книжках) редко доходят до портов F и G обычно останавливаются на D... с ними и у меня проблем нет
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Посмотри файл контроллера который добавляется в проект. Там есть имена присвоенные всем регистрам и портам ввода/вывода.
А что за зверь такой большой (PORTF, PORTG) ?
А что за зверь такой большой (PORTF, PORTG) ?
[img]http://i053.radikal.ru/1102/71/0a0346d3a067.gif[/img]
[size=85]Ты думаешь ты думал как ты думаешь? (с)[/size]
[size=85]Ты думаешь ты думал как ты думаешь? (с)[/size]
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Modest писал(а):Посмотри файл контроллера который добавляется в проект. Там есть имена присвоенные всем регистрам и портам ввода/вывода.
А что за зверь такой большой (PORTF, PORTG) ?
Имя регистров точно правильное.. Студия ведь определила их номера
А зверь мега64...
Народ, я тут Хартова читаю - я правильно понимаю что порты ввода вывода отражаются в первых адресах RAM ?
STS X, r16 - правильно будет ?
гм.. осталось узнать как загрузить нужное значение в Х
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Служебные регистры с адресами >$31 (кажется
) адресуются через команды
STS <имя регистра/значение>,<регистр> - запись
LDS <имя регистра/значение>,<регистр> - чтение
до адресов $31 - OUT/IN
STS <имя регистра/значение>,<регистр> - запись
LDS <имя регистра/значение>,<регистр> - чтение
до адресов $31 - OUT/IN
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Еще один вопрос:
каким образом оформляются библиотеки подпрограмм ?
например у меня есть файл основной программы и отдельный файл (тоже .asm) работы с LCD
мне можно включать его include "LCD.asm" ? и где это можно делать ? в любом месте файла или там где примерно код должен разместиться ?
может быть есть какой то другой механизм включения файлов исходников в проект ?
каким образом оформляются библиотеки подпрограмм ?
например у меня есть файл основной программы и отдельный файл (тоже .asm) работы с LCD
мне можно включать его include "LCD.asm" ? и где это можно делать ? в любом месте файла или там где примерно код должен разместиться ?
может быть есть какой то другой механизм включения файлов исходников в проект ?
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
по размещению дополнительных файлов (библиотек) ты правильно сказал
обычно такие библиотеки это набор п/п для работы с различными устройствами и размещают их, как правило, после тела основной программы.
там где примерно код должен разместиться
обычно такие библиотеки это набор п/п для работы с различными устройствами и размещают их, как правило, после тела основной программы.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Как сделать задержку на заданное количество микросекунд ?
контроллер мега64
тактовая частота 16 МГц
АВР выполняет одну команду за такт ? (ну большинство по крайней мере)
получается 1\16 000 000 = 0.0625 мкс на одну команду
ldi r16, 0x08 ; задержка в 2 мкс
L1: dec r16
brne L1
то есть в цикле 2 команды - общее время 0.0625 * 2 = 0.125 мкс за один проход цикла
таким образом для задержки скажем в 2 мкс = значение счетчика должно быть 2 \ 0.125= 8
Правильно ?
контроллер мега64
тактовая частота 16 МГц
АВР выполняет одну команду за такт ? (ну большинство по крайней мере)
получается 1\16 000 000 = 0.0625 мкс на одну команду
ldi r16, 0x08 ; задержка в 2 мкс
L1: dec r16
brne L1
то есть в цикле 2 команды - общее время 0.0625 * 2 = 0.125 мкс за один проход цикла
таким образом для задержки скажем в 2 мкс = значение счетчика должно быть 2 \ 0.125= 8
Правильно ?
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Надо считать за сколько тактов выполняется 1 проход, если надо точно - то придется подбирать значение счетчика с учетом загрузки начального значения и выхода из цикла, в принципе 3-5 прогонов в симуляторе обычно достаточно.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
делаю типа секундомера кторый пока считает до 9, и столкнулся с такой проблемой задержка происходит не на 1 сек а на 10 из-за 3 строк кода, код ниже строки отмечены, если эти строки убрать всё в порядке задержка = 1 сек. в чём проблема?
Код: Выделить всё
.nolist
.include "c:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\tn2313def.inc"
.def temp = R16
.def raz1 = R17
.def raz2 = R18
.def count = R19
.list
.cseg
.org 0
rjmp Reset
rjmp INT_0
rjmp INT_1
rjmp Timer1_capt1
rjmp Timer1_comp1
rjmp Timer1_OVF1
rjmp Timer0_OVF0
rjmp UART_RX
rjmp UART_UDRE
rjmp UART_TX
rjmp ANA_COMP
;Reset:
INT_1:
INT_0:
Timer1_capt1:
;Timer1_comp1:
Timer1_OVF1:
Timer0_OVF0:
UART_RX:
UART_UDRE:
UART_TX:
ANA_COMP:
reti
Reset:
ldi temp, 0b11111111
out DDRB, temp
ldi temp, 0b11111111
out DDRB, temp
ldi Temp,0b01000000
out TIMSK,Temp
ldi temp,0b00000100
out TCCR1B, temp
ldi temp, 0x7A
out OCR1AH, temp
ldi temp, 0x12
out OCR1AL, temp
ldi temp, RamEnd
out SPL, temp
ldi count, 0
ldi Raz1, 0b11000000
ldi Raz2, 0b11000000
ldi temp,0
out TCNT1H,temp
out TCNT1L,temp
sei
Pr:
ldi temp, 0b00000001
out PortD,temp
out PortB,Raz1
ldi temp, 0b00000010;вот
out PortD,temp; эти три
out portB, Raz2; строчки
rjmp Pr
Timer1_comp1:
ldi temp,0
out TCNT1H,temp
out TCNT1L,temp
inc count
cpi count,1
brne n1
ldi Raz1,0b11111001
rjmp ex
n1:
cpi count,2
brne n2
ldi Raz1,0b10100100
rjmp ex
n2:
cpi count,3
brne n3
ldi Raz1,0b10110000
rjmp ex
n3:
cpi count,4
brne n4
ldi Raz1,0b10011001
rjmp ex
n4:
cpi count,5
brne n5
ldi Raz1,0b11001100
rjmp ex
n5:
cpi count,6
brne n6
ldi Raz1,0b10100000
rjmp ex
n6:
cpi count,7
brne n7
ldi Raz1,0b11111000
rjmp ex
n7:
cpi count,8
brne n8
ldi Raz1,0b10000000
rjmp ex
n8:
cpi count,9
brne ex
ldi Raz1,0b10010000
rjmp ex
ex:
reti
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Ну что ж, начнем критиковать код, или не надо?
Если интересно - читай дальше, если нет
1. для установки всех разрядов регистра в 1/0 существуют 2-е спец. команды SER/CLR выполняются за один такт, в отличии от LDI, в твоем примере это совершенно не критично, но настанет день...
2. пусть меня закидаю камнями - но считал и считаю что чем короче прерывание тем лучше, а по сему: в прерывании только увеличивай счетчик, а всю обработку в основном цикле.
по коду - освобожусь посмотрю.
Если интересно - читай дальше, если нет
1. для установки всех разрядов регистра в 1/0 существуют 2-е спец. команды SER/CLR выполняются за один такт, в отличии от LDI, в твоем примере это совершенно не критично, но настанет день...
2. пусть меня закидаю камнями - но считал и считаю что чем короче прерывание тем лучше, а по сему: в прерывании только увеличивай счетчик, а всю обработку в основном цикле.
по коду - освобожусь посмотрю.
