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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

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

Сообщение GP1 »

1. каким образом у тебя выводится дв. счетную последовательность...
если изменяется temp (он же R16), а в порт выдается R17 (temp1), т.е. на выходе порта всегда будет 0х01.
2. нажатие кнопки сопровождается дребезгом, поэтому подключи кондер 0.1 мкф и подтяни вн.резистором на +5В, ну желательно программную обработку дребезга ввести.
Чем дальше, тем больше становлюсь занудой...
Изображение
Arlleex
Друг Кота
Сообщения: 4435
Зарегистрирован: Сб мар 07, 2009 20:44:36

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

Сообщение Arlleex »

Да, точно, косяк в регистре R16 и R17.
Попутал.
А вот только как программно подключить вн. подтягивающий резистор?

У меня как кнопки подключены, - +5В---резистор 10к----- пин порта...
Не умеешь - не берись, но не взявшись не научишься...
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

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

Сообщение GP1 »

если у тебя стоит 10к на +5в - то это и есть подтяжка.
а как подключить внутр.резисторы написано в ДШ, ну или у Евстифеева.
Попутал ты потому что в одном месте пишешь имя ристра, а вдругом имя заданное директивой .def, ту уж если задаешь имя так и используй его, и имена надо давать осмысленные.
И еще, если ты обзываешь п/п Delay так и делай в ней только задержку, иначе потом еще где-нибудь захочешь использовать и будешь сидеть гадать почему работает не так как надо.
На сайте у ARV есть асм-код оформленный очень красиво, к этому надо привыкать с молодых ногтей, ну на крайняк у меня в спидометре посмотри, там конечно не так красиво, но я старался :wink:
Чем дальше, тем больше становлюсь занудой...
Изображение
Arlleex
Друг Кота
Сообщения: 4435
Зарегистрирован: Сб мар 07, 2009 20:44:36

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

Сообщение Arlleex »

Вообщем, мне надо организовать задержку в 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 в вопросах и ответах

Сообщение GP1 »

Жень, вот опять ты пишешь не подумавши, при 1МГц один такт мк будет составлять 1 мкс, а никак не 1 нс,
и команда

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

cpi temp,0

совершенно лишняя, т.к. команда dec при обнулении переменной выставит флаг Z
Чем дальше, тем больше становлюсь занудой...
Изображение
Arlleex
Друг Кота
Сообщения: 4435
Зарегистрирован: Сб мар 07, 2009 20:44:36

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

Сообщение Arlleex »

все разобрался, по своей глупости забыл про приставку милли
А так микро это 10 в -6.
А как мне тогда организовать задержку такую в 255нс?
Еще бы поделить на 1000.
Но в Аттини 2313 предделитель только на 256 (максимально) разделить может.
Последний раз редактировалось Arlleex Сб май 29, 2010 20:06:40, всего редактировалось 1 раз.
Не умеешь - не берись, но не взявшись не научишься...
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

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

Сообщение GP1 »

не прав :evil:
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 в вопросах и ответах

Сообщение GP1 »

чтобы получить задержку в 255нс тактовая должна быть кратна 3921568,62Гц при такой тактовой 1 такт мк как раз раз равен 255 нс.
к примеру 1такт для разных частот будет такой
1МГц - 1 мкс
2МГц - 0.5 мкс
4МГц - 0.25 мкс
8МГц - 0.125 мкс и т.д.
Чем дальше, тем больше становлюсь занудой...
Изображение
Arlleex
Друг Кота
Сообщения: 4435
Зарегистрирован: Сб мар 07, 2009 20:44:36

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

Сообщение Arlleex »

так. ВСе понял.
теперь. Подключаю 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 в вопросах и ответах

Сообщение GP1 »

если иппульс на выводе Е будет больше минимально допустимого, то да.
Смотри в ДШ на индикатор минимальную длительность стробирования, при тактовой 1 МГц вкл-выкл линии порта будет равен 1 мкс.
Чем дальше, тем больше становлюсь занудой...
Изображение
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

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... с ними и у меня проблем нет
Аватара пользователя
Modest
Сверлит текстолит когтями
Сообщения: 1138
Зарегистрирован: Сб апр 03, 2010 08:57:35

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

Сообщение Modest »

Посмотри файл контроллера который добавляется в проект. Там есть имена присвоенные всем регистрам и портам ввода/вывода.
А что за зверь такой большой (PORTF, PORTG) ?
[img]http://i053.radikal.ru/1102/71/0a0346d3a067.gif[/img]
[size=85]Ты думаешь ты думал как ты думаешь? (с)[/size]
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

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

Сообщение ВитГо »

Modest писал(а):Посмотри файл контроллера который добавляется в проект. Там есть имена присвоенные всем регистрам и портам ввода/вывода.
А что за зверь такой большой (PORTF, PORTG) ?


Имя регистров точно правильное.. Студия ведь определила их номера :-)
А зверь мега64...

Народ, я тут Хартова читаю - я правильно понимаю что порты ввода вывода отражаются в первых адресах RAM ?

STS X, r16 - правильно будет ?

гм.. осталось узнать как загрузить нужное значение в Х :-)
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

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

Сообщение GP1 »

Служебные регистры с адресами >$31 (кажется :roll: ) адресуются через команды
STS <имя регистра/значение>,<регистр> - запись
LDS <имя регистра/значение>,<регистр> - чтение
до адресов $31 - OUT/IN
Чем дальше, тем больше становлюсь занудой...
Изображение
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

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

Сообщение ВитГо »

Еще один вопрос:

каким образом оформляются библиотеки подпрограмм ?

например у меня есть файл основной программы и отдельный файл (тоже .asm) работы с LCD

мне можно включать его include "LCD.asm" ? и где это можно делать ? в любом месте файла или там где примерно код должен разместиться ?

может быть есть какой то другой механизм включения файлов исходников в проект ?
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

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

Сообщение GP1 »

по размещению дополнительных файлов (библиотек) ты правильно сказал
там где примерно код должен разместиться

обычно такие библиотеки это набор п/п для работы с различными устройствами и размещают их, как правило, после тела основной программы.
Чем дальше, тем больше становлюсь занудой...
Изображение
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

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

Правильно ?
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

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

Сообщение GP1 »

Надо считать за сколько тактов выполняется 1 проход, если надо точно - то придется подбирать значение счетчика с учетом загрузки начального значения и выхода из цикла, в принципе 3-5 прогонов в симуляторе обычно достаточно.
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
day0l
Открыл глаза
Сообщения: 44
Зарегистрирован: Пт май 14, 2010 15:48:35

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

Сообщение day0l »

делаю типа секундомера кторый пока считает до 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 в вопросах и ответах

Сообщение GP1 »

Ну что ж, начнем критиковать код, или не надо?
Если интересно - читай дальше, если нет :dont_know:

1. для установки всех разрядов регистра в 1/0 существуют 2-е спец. команды SER/CLR выполняются за один такт, в отличии от LDI, в твоем примере это совершенно не критично, но настанет день... :tea:
2. пусть меня закидаю камнями - но считал и считаю что чем короче прерывание тем лучше, а по сему: в прерывании только увеличивай счетчик, а всю обработку в основном цикле.

по коду - освобожусь посмотрю.
Чем дальше, тем больше становлюсь занудой...
Изображение
Ответить

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