Скажите пожалуйста как правильно передать (занести) АТ команду в регистр UDR на ассемблере? Например команду ATD+79243333332
Спасибо!
ICQ-15B87330h
В регистр UDR можно записать ОДИН байт, у вас их несколько - значит нужно нескольок разАртур писал(а):Здравствуйте!
Скажите пожалуйста как правильно передать (занести) АТ команду в регистр UDR на ассемблере? Например команду ATD+79243333332
Спасибо!
Код: Выделить всё
printf("ATD+79243333332");Код: Выделить всё
.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 модема
Скачайте VMLAB - 4 Мб всего - да проверьте. Пример проверки в задаче 5, где - указано выше.Артур писал(а):Написал прогу но не знаю будет ли это работать! Может ктонить проверит?
Без симулятора скажу - работать не будет.Артур писал(а):Написал прогу но не знаю будет ли это работать! Может ктонить проверит?
Код: Выделить всё
ldi temp, 24
out UCSRB, tempКод: Выделить всё
ldi temp, (1<<RXEN)|(1<<TXEN)
out UCSRB, temp Код: Выделить всё
ldi Temp3,0
add ZL,Temp2 ;прибавление
adc ZH,Temp3 ;внутр. адреса
...
mov Temp3,R0 ;копирование
...
inc Temp2 ;увелич. внутр. адреса
Скажите как это исправить?smac писал(а): Нет ожидания конца передачи после загрузки в регистр udr, в результате поскольку передача идет относительно медленно, первый байт еще не успеет передаться а в udr уже будет грузиться второй, естестевенно второй байт проигнорируется, и передастятолько тот байт, который запишется в udr когда передача первого будет завершена
smac писал(а): Например команда lpm Temp3,Z+ позволит вам сделать вашу программу короче, эффективнее и понятнее
в частности она позволит избавиться от строкКод: Выделить всё
ldi Temp3,0 add ZL,Temp2 ;прибавление adc ZH,Temp3 ;внутр. адреса ... mov Temp3,R0 ;копирование ... inc Temp2 ;увелич. внутр. адреса
К сожалению не могу написать однозначный код, поскольку вы не указали ясно, какой у вас контроллер. Поэтому расскажу на словах:Артур писал(а): Скажите как это исправить?
Скопировать пример из даташита. И разобраться как он работает.Артур писал(а): Скажите как это исправить?
Если передача UART включена и скорость настроена, то прога должна просто класть в регистр данных UDR данные для передачи убедившись перед этим что он свободен.Артур писал(а): какие условия надо создать усарту, чтобы просто передать символ?
Попробуйте наоборот - программируйте без напряга на Си и при желании узнавайте тонкости контроллера и пописывайие на АСМе.Артур писал(а): P.S. я учу ассемблер для того чтобы прочувствовать все тонкости контроллера а компилятор си у меня есть но пока не изучаю си
off Извини, но вспоминается: "Вам шашечки или ехать ?"Артур писал(а):В Си это выглядит так: printf("ATD222222")
А есть ли чтонить подобное в ассемблере ?