UART регистр UDR и AT команда

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 157
Зарегистрирован: Пн дек 04, 2006 09:50:08
Откуда: Vladivostok

Сообщение Артур »

Здравствуйте!
Скажите пожалуйста как правильно передать (занести) АТ команду в регистр UDR на ассемблере? Например команду ATD+79243333332
Спасибо!
Век живи! - Век учись!
ICQ-15B87330h
Реклама
Э...
Аватара пользователя
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва

Сообщение tych »

Артур писал(а):Здравствуйте!
Скажите пожалуйста как правильно передать (занести) АТ команду в регистр UDR на ассемблере? Например команду ATD+79243333332
Спасибо!
В регистр UDR можно записать ОДИН байт, у вас их несколько - значит нужно нескольок раз
1) убедится что передача окончена (как ? в задаче 4 у меня в дом. страничке).
2) записать следующий символ из вашей строки.

Можете взять пример вывода такой строки на Си в задаче 5 и посмотреть листинг на АСМе - файл .lst

Пример работы с UART на АСМ есть и в даташите. ДШ на русском у меня на стр. 2 есть.

А на Си будет наверно вот так

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

printf("ATD+79243333332");
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Контактная информация:
Реклама
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 157
Зарегистрирован: Пн дек 04, 2006 09:50:08
Откуда: Vladivostok

Сообщение Артур »

Написал прогу но не знаю будет ли это работать! Может ктонить проверит?

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

.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 модема
Век живи! - Век учись!
ICQ-15B87330h
Э...
Аватара пользователя
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва

Сообщение tych »

Артур писал(а):Написал прогу но не знаю будет ли это работать! Может ктонить проверит?
Скачайте VMLAB - 4 Мб всего - да проверьте. Пример проверки в задаче 5, где - указано выше.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Мучитель микросхем
Сообщения: 459
Зарегистрирован: Вс июн 01, 2008 12:16:38

Сообщение smac »

Артур писал(а):Написал прогу но не знаю будет ли это работать! Может ктонить проверит?
Без симулятора скажу - работать не будет.
Основная ошибка:
Нет ожидания конца передачи после загрузки в регистр udr, в результате поскольку передача идет относительно медленно, первый байт еще не успеет передаться а в udr уже будет грузиться второй, естестевенно второй байт проигнорируется, и передастятолько тот байт, который запишется в udr когда передача первого будет завершена.

Замечания:
а) Не знаю нужен ли вам девятибитный режим, и что вы понимаете под девятибитным режимом
б) Не понятно какой именно у вас контроллер (по-моему файл описания регистров включен для AT90S2313)
г) Ужасный стиль программирования. Что мешает вместо строк (здесь напишу пример для tiny2313 т. к. на AT90S2313 нет даташита)

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

ldi temp, 24
out UCSRB, temp
написать строки

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

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             ;увелич. внутр. адреса
Реклама
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 157
Зарегистрирован: Пн дек 04, 2006 09:50:08
Откуда: Vladivostok

Сообщение Артур »

Спасибо! Обращу внимание на стиль програмирования (я пока в этом новичек)
smac писал(а): Нет ожидания конца передачи после загрузки в регистр udr, в результате поскольку передача идет относительно медленно, первый байт еще не успеет передаться а в udr уже будет грузиться второй, естестевенно второй байт проигнорируется, и передастятолько тот байт, который запишется в udr когда передача первого будет завершена
Скажите как это исправить?
smac писал(а): Например команда lpm Temp3,Z+ позволит вам сделать вашу программу короче, эффективнее и понятнее
в частности она позволит избавиться от строк

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

ldi Temp3,0            
add ZL,Temp2          ;прибавление 
adc ZH,Temp3          ;внутр. адреса 
... 
mov Temp3,R0          ;копирование 
... 
inc Temp2             ;увелич. внутр. адреса

а это я взял из обучалки про массивы :(
Век живи! - Век учись!
ICQ-15B87330h
Реклама
Мучитель микросхем
Сообщения: 459
Зарегистрирован: Вс июн 01, 2008 12:16:38

Сообщение smac »

Артур писал(а): Скажите как это исправить?
К сожалению не могу написать однозначный код, поскольку вы не указали ясно, какой у вас контроллер. Поэтому расскажу на словах:
Перед тем как загружать в UDR число нужно проверить флаг окончания передачи - посмотрите в даташите на контролеер, скорее всего там и пример использования есть.
А по поводу обучалки скажу - чтобы чему-то научиться нужно не только копировать чужое но и придумывать свое. Конкретно про режимы адресации можно почитать в документе AVR Instruction Set (Набор команд АВР), доступный на сайте атмел, вообще рекомендую этот документ изучить основательно.
Э...
Аватара пользователя
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва

Сообщение tych »

Артур писал(а): Скажите как это исправить?
Скопировать пример из даташита. И разобраться как он работает.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Контактная информация:
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 157
Зарегистрирован: Пн дек 04, 2006 09:50:08
Откуда: Vladivostok

Сообщение Артур »

У меня микроконтроллер AT90S2313 и в даташите нет примера кода усарт :(
Вобще какие условия надо создать усарту, чтобы просто передать символ?
Настроить регистры USR, UCR, UBRR это ясно, но что должна выполнять программа дальше и на что она должна влиять?(на какие флаги) как активировать прерывания по окончании передачи символа и пустому регистру данных?
Спасибо!
Век живи! - Век учись!
ICQ-15B87330h
Э...
Аватара пользователя
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва

Сообщение tych »

Артур писал(а): какие условия надо создать усарту, чтобы просто передать символ?
Если передача UART включена и скорость настроена, то прога должна просто класть в регистр данных UDR данные для передачи убедившись перед этим что он свободен.

Подробно - смотрите в задаче 5 у меня в домашней страничке.

Правильно настройть UART удобно помошью мастера компилятора CVAVR.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Контактная информация:
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 157
Зарегистрирован: Пн дек 04, 2006 09:50:08
Откуда: Vladivostok

Сообщение Артур »

данные в UDR поступают, но флаг того что UDR пуст в регистре USR не устанавливается! Или я должен сам написать чтоб при пустом UDR он устанавливался? Спасибо!
P.S. я учу ассемблер для того чтобы прочувствовать все тонкости контроллера а компилятор си у меня есть но пока не изучаю си
Век живи! - Век учись!
ICQ-15B87330h
Э...
Аватара пользователя
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва

Сообщение tych »

Артур писал(а): P.S. я учу ассемблер для того чтобы прочувствовать все тонкости контроллера а компилятор си у меня есть но пока не изучаю си
Попробуйте наоборот - программируйте без напряга на Си и при желании узнавайте тонкости контроллера и пописывайие на АСМе.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Контактная информация:
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 157
Зарегистрирован: Пн дек 04, 2006 09:50:08
Откуда: Vladivostok

Сообщение Артур »

И еще вопрос как сделать так, чтобы не использовать массив при передаче команды? Но при этом не писать километр кода?

В Си это выглядит так: printf("ATD222222")
А есть ли чтонить подобное в ассемблере?
СПАСИБО!
Век живи! - Век учись!
ICQ-15B87330h
Э...
Аватара пользователя
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва

Сообщение tych »

Артур писал(а):В Си это выглядит так: printf("ATD222222")
А есть ли чтонить подобное в ассемблере ?
off Извини, но вспоминается: "Вам шашечки или ехать ?"
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Контактная информация:
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»