Страница 1 из 1
UART регистр UDR и AT команда
Добавлено: Ср окт 22, 2008 11:42:29
Артур
Здравствуйте!
Скажите пожалуйста как правильно передать (занести) АТ команду в регистр UDR на ассемблере? Например команду ATD+79243333332
Спасибо!
Re: UART регистр UDR и AT команда
Добавлено: Ср окт 22, 2008 11:53:04
tych
Артур писал(а):Здравствуйте!
Скажите пожалуйста как правильно передать (занести) АТ команду в регистр UDR на ассемблере? Например команду ATD+79243333332
Спасибо!
В регистр UDR можно записать ОДИН байт, у вас их несколько - значит нужно нескольок раз
1) убедится что передача окончена (как ? в задаче 4 у меня в дом. страничке).
2) записать следующий символ из вашей строки.
Можете взять пример вывода такой строки на Си в задаче 5 и посмотреть листинг на АСМе - файл
.lst
Пример работы с UART на АСМ есть и в даташите. ДШ на русском у меня на стр. 2 есть.
А на Си будет наверно вот так
Добавлено: Чт окт 23, 2008 08:29:51
Артур
Написал прогу но не знаю будет ли это работать! Может ктонить проверит?
Код: Выделить всё
.include "C:\Program Files\Atmel\AVR Tools\AvrStudio4\include\2313def.inc"
.def temp=r16 ;присваиваем свои имена регистрам общего назначения
.def temp2=r17
.def temp3=r18
.cseg
.org 0
rjmp reset ;Reset handler vector
;rjmp INT0addr ;External Interrupt0 Vector Address
;rjmp INT1addr ;External Interrupt1 Vector Address
;rjmp ICP1addr ;Input Capture1 Interrupt Vector Address
;rjmp OC1addr ;Output Compare1 Interrupt Vector Address
;rjmp OVF1addr ;Overflow1 Interrupt Vector Address
;rjmp OVF0addr ;Overflow0 Interrupt Vector Address
;rjmp URXCaddr ;UART Receive Complete Interrupt Vector Address
;rjmp UDREaddr ;UART Data Register Empty Interrupt Vector Address
;rjmp UTXCaddr ;UART Transmit Complete Interrupt Vector Address
;rjmp ACIaddr ;Analog Comparator Interrupt Vector Address
reset:
;установка стека
ldi temp, low(ramend)
out spl,temp
clr temp
;ставим скорость обмена uart 9600 baud for 4Mhz
ldi temp,25
out ubrr,temp
clr temp
;разрешаем передачу и активируем 9-ти битный режим передачи
ldi temp,48
out ucr,temp
clr temp
;Отправляем команду ATD+79243210914 в регистр UDR используя массив
ldi temp,0x0f ;заносим число равное количеству символов АТ команды
;для запрета чтения пустых ячеек памяти при чтении массива
Send_udr:
ldi ZH,High(Massive*2);загрузка адреса 0-го
ldi ZL,Low(Massive*2) ;элемента в рег. пару Z
ldi Temp3,0
add ZL,Temp2 ;прибавление
adc ZH,Temp3 ;внутр. адреса
lpm ;загрузка из ПЗУ
mov Temp3,R0 ;копирование
out udr,Temp3 ;вывод в udr
inc Temp2 ;увелич. внутр. адреса
dec temp ;уменьшаем значение на 1
brne Send_udr ;если temp не равен 0, переходим на Send_udr
rjmp reset ;перезагрузка контроллера
Massive: ;имя массива
.db "ATD+79243210914" ;массив содержащий АТ команду в ASCII кодировке для GSM модема
Добавлено: Чт окт 23, 2008 08:47:26
tych
Артур писал(а):Написал прогу но не знаю будет ли это работать! Может ктонить проверит?
Скачайте VMLAB -
4 Мб всего - да проверьте. Пример проверки в задаче 5, где - указано выше.
Добавлено: Чт окт 23, 2008 10:14:03
smac
Артур писал(а):Написал прогу но не знаю будет ли это работать! Может ктонить проверит?
Без симулятора скажу - работать не будет.
Основная ошибка:
Нет ожидания конца передачи после загрузки в регистр udr, в результате поскольку передача идет относительно медленно, первый байт еще не успеет передаться а в udr уже будет грузиться второй, естестевенно второй байт проигнорируется, и передастятолько тот байт, который запишется в udr когда передача первого будет завершена.
Замечания:
а) Не знаю нужен ли вам девятибитный режим, и что вы понимаете под девятибитным режимом
б) Не понятно какой именно у вас контроллер (по-моему файл описания регистров включен для AT90S2313)
г) Ужасный стиль программирования. Что мешает вместо строк (здесь напишу пример для tiny2313 т. к. на AT90S2313 нет даташита)
написать строки
Код: Выделить всё
ldi temp, (1<<RXEN)|(1<<TXEN)
out UCSRB, temp
так на много понятнее и человеку, который хочет вам помочь не придется сначала переводить десятичное число в двоичное, а затем по номерам битов смотреть за что они отвечают. Ваш стиль сразу отбивает желание вам помогать.
д) Советую почитать про режимы адресации. Например команда lpm Temp3,Z+ позволит вам сделать вашу программу короче, эффективнее и понятнее
в частности она позволит избавиться от строк
Код: Выделить всё
ldi Temp3,0
add ZL,Temp2 ;прибавление
adc ZH,Temp3 ;внутр. адреса
...
mov Temp3,R0 ;копирование
...
inc Temp2 ;увелич. внутр. адреса
Добавлено: Чт окт 23, 2008 10:55:04
Артур
Спасибо! Обращу внимание на стиль програмирования (я пока в этом новичек)
smac писал(а):
Нет ожидания конца передачи после загрузки в регистр udr, в результате поскольку передача идет относительно медленно, первый байт еще не успеет передаться а в udr уже будет грузиться второй, естестевенно второй байт проигнорируется, и передастятолько тот байт, который запишется в udr когда передача первого будет завершена
Скажите как это исправить?
smac писал(а):
Например команда lpm Temp3,Z+ позволит вам сделать вашу программу короче, эффективнее и понятнее
в частности она позволит избавиться от строк
Код: Выделить всё
ldi Temp3,0
add ZL,Temp2 ;прибавление
adc ZH,Temp3 ;внутр. адреса
...
mov Temp3,R0 ;копирование
...
inc Temp2 ;увелич. внутр. адреса
а это я взял из обучалки про массивы

Добавлено: Чт окт 23, 2008 20:56:50
smac
Артур писал(а):
Скажите как это исправить?
К сожалению не могу написать однозначный код, поскольку вы не указали ясно, какой у вас контроллер. Поэтому расскажу на словах:
Перед тем как загружать в UDR число нужно проверить флаг окончания передачи - посмотрите в даташите на контролеер, скорее всего там и пример использования есть.
А по поводу обучалки скажу - чтобы чему-то научиться нужно не только копировать чужое но и придумывать свое. Конкретно про режимы адресации можно почитать в документе AVR Instruction Set (Набор команд АВР), доступный на сайте атмел, вообще рекомендую этот документ изучить основательно.
Добавлено: Чт окт 23, 2008 21:00:56
tych
Артур писал(а): Скажите как это исправить?
Скопировать пример из даташита. И разобраться как он работает.
Добавлено: Сб окт 25, 2008 09:05:20
Артур
У меня микроконтроллер AT90S2313 и в даташите нет примера кода усарт

Вобще какие условия надо создать усарту, чтобы просто передать символ?
Настроить регистры USR, UCR, UBRR это ясно, но что должна выполнять программа дальше и на что она должна влиять?(на какие флаги) как активировать прерывания по окончании передачи символа и пустому регистру данных?
Спасибо!
Добавлено: Сб окт 25, 2008 12:06:02
tych
Артур писал(а): какие условия надо создать усарту, чтобы просто передать символ?
Если передача UART включена и скорость настроена, то прога должна просто класть в регистр данных UDR данные для передачи убедившись перед этим что он свободен.
Подробно - смотрите в задаче 5 у меня в домашней страничке.
Правильно настройть UART удобно помошью мастера компилятора CVAVR.
Добавлено: Сб окт 25, 2008 15:03:17
Артур
данные в UDR поступают, но флаг того что UDR пуст в регистре USR не устанавливается! Или я должен сам написать чтоб при пустом UDR он устанавливался? Спасибо!
P.S. я учу ассемблер для того чтобы прочувствовать все тонкости контроллера а компилятор си у меня есть но пока не изучаю си
Добавлено: Сб окт 25, 2008 15:53:36
tych
Артур писал(а): P.S. я учу ассемблер для того чтобы прочувствовать все тонкости контроллера а компилятор си у меня есть но пока не изучаю си
Попробуйте наоборот -
программируйте без напряга на Си и при желании узнавайте тонкости контроллера и пописывайие на АСМе.
Добавлено: Вс окт 26, 2008 09:55:31
Артур
И еще вопрос как сделать так, чтобы не использовать массив при передаче команды? Но при этом не писать километр кода?
В Си это выглядит так: printf("ATD222222")
А есть ли чтонить подобное в ассемблере?
СПАСИБО!
Добавлено: Вс окт 26, 2008 10:50:22
tych
Артур писал(а):В Си это выглядит так: printf("ATD222222")
А есть ли чтонить подобное в ассемблере ?
off Извини, но вспоминается: "
Вам шашечки или ехать ?"