Страница 17 из 400
Добавлено: Пн июн 15, 2009 13:08:21
GP1
Спасибо, действительно LDS, STS, это просто я глюканул немного, видимо от жары

Добавлено: Пн июн 15, 2009 14:49:12
Alspro
УРА!!! Спасибо!!! Работает!!!!
Подскажите еще какую команду использовать в конструкции вместо SBIC.
Код: Выделить всё
uart_snt:
SBIC UCSR1A,UDRE1 ; Пропуск если нет флага готовности
RJMP uart_snt ; ждем готовности - флага UDRE1
Добавлено: Пн июн 15, 2009 15:07:31
ARV
Alspro писал(а):УРА!!! Спасибо!!! Работает!!!!
Подскажите еще какую команду использовать в конструкции вместо SBIC.
Код: Выделить всё
uart_snt:
SBIC UCSR1A,UDRE1 ; Пропуск если нет флага готовности
RJMP uart_snt ; ждем готовности - флага UDRE1
гм... используйте
NOP 
вы хоть сказали бы ДЛЯ ЧЕГО нужна другая инструкция?
Добавлено: Пн июн 15, 2009 16:03:12
Alspro
Проблема - компилятор ругается что Operand 1 out of range: 0x9b
Хотя пример из даташита на эту атмегу64
Добавлено: Пн июн 15, 2009 21:50:29
GP1
Команды типа SBIC, SBIS и др. работают, если правильно помню, с адресами до 0x31, поэтому напрямую тестировать бит не получится.
Могу предложить грузить значение в какой нибудь регистр из старшей половины (обычно используют R16 в качестве temp) и анализировать бит в промежуточном регистре, но на мой взгляд правильнее было бы генерировать прерывание по флагу UDRE1.
Добавлено: Пн июн 15, 2009 22:39:15
ibiza11
Ребят, а эта тема с sts lds только для меги64? что то я не совсем понял почему так...
Добавлено: Пн июн 15, 2009 22:50:19
GP1
Это справедливо для всех регистров с адресами выше 0x31, для всех проциков.
Добавлено: Вт июн 16, 2009 04:06:14
ibiza11
"справедливо" - хорошо, но почему обычный out не работает в этом случае?
и еще поправь, если не так:
$00=r0
...
$31=r31
Добавлено: Вт июн 16, 2009 08:47:54
smac
ibiza11 писал(а):"справедливо" - хорошо, но почему обычный out не работает в этом случае?
и еще поправь, если не так:
$00=r0
...
$31=r31
Потому что команда out работает с регистрами специальных функций имеющими абсолютные адреса с 0x20 до 0x5F включительно. Однако для команды out необходимо представление этих регистров со смещенными на 0x20 адресами, т. е. для команды out адрес регистра специальных функций 0x00 соответствует ячейке памяти с адресом 0x20, адрес 0x3F соответствует ячейке с адресом - 0x5F. Адрес 0x3F - ограничение для команды out, так заложено разработчиками, по какой причине - нужно спросить у них. Соотвественно все ячейки памяти с абсолютными адресами выше 0x5F для команды out неподвластны и с данными адресами работают обычные команды обращения к памяти, котоые оперируют уже не смещенными адресами. Подробнее про систему команд и адреса регистров можно узнать из даташита на контроллер и чудесного документа от атмел, называемого AVR Instruction Set.
Добавлено: Вт июн 16, 2009 11:20:38
ibiza11
спасибо, просто никогда не встречался с такой проблемой. на будущее буду иметь в виду

Вопрос к теме UART
Добавлено: Чт июн 18, 2009 08:00:20
nppElM
Добрый день!
Подскажите пожалуйста что не так делаю, суть такая UART должен работать по прерыванию при приеме данных, а передача по мере необходимости, но пока передача не работает
Код: Выделить всё
; скорость обмена 2400 бит/с
; при fclk=16,0000 МГц
ldi TMP_Y,0xA0 ; загружаем во временный регистр младший байт
sts UBRR1L, TMP_Y
ldi TMP_Y,0x01 ; загружаем во временный регистр старший байт
sts UBRR1H,TMP_Y
ldi TMP_Y,0x00
sts UCSR1A,TMP_Y
ldi TMP_Y,0x98 ;(1<<RXEN1)|(1<<RXCIE1)|(1<<TXEN1)|(0<<TXCIE1)
sts UCSR1B,TMP_Y
ldi TMP_Y,0x86 ;(1<<UMSEL11)|(1<<UCSZ11)|(1<<UCSZ10)
sts UCSR1C,TMP_Y
а дальше стандартная схема
Код: Выделить всё
UART_OUT:
lds TMP_1,UCSR1A
sbrs TMP_1,N_BIT5 ; UDRE1
rjmp UART_OUT
sts UDR1,TMP_2
Но передача не происходит, при чем при пошаговом разборе компилятор показывает, что UDR1 очищается при выполнении следующей команды кода.
Помогите пожалуйста!!!!
Добавлено: Чт июн 18, 2009 08:10:49
ARV
в чем "шагаете"? не забыли, что UDR для чтения совсем не то же самое, что UDR для записи? при пошаговой прогонке отладчик считывает и показывает содержимое UDR, а то, что туда было записано - обратно считать невозможно. кстати, симулятор AVR Studio вообще UDR не симулирует - об этом написано в справочном файле.
а передача длится довольно долго (не забыли про скорость USART и скорость работы ядра МК?), поэтому ушагать можно хрен знает куда, пока передача закончится и встанет флажок...
Добавлено: Чт июн 18, 2009 08:31:02
nppElM
Шагаю в AVR Studio, про разность скоростей понимаю, но передача то все равно не идет

.
Я так понял, что в коде ошибок нет, я делаю все правельно?
Добавлено: Чт июн 18, 2009 14:52:32
Negor
к AvrStudio есть дополнение для эмуляции терминала, правда не помню как его зовут

Re: Вопрос к теме UART
Добавлено: Чт июн 18, 2009 18:11:13
GP1
nppElM писал(а):Добрый день!
Код: Выделить всё
; скорость обмена 2400 бит/с
; при fclk=16,0000 МГц
ldi TMP_Y,0xA0 ; загружаем во временный регистр младший байт
sts UBRR1L, TMP_Y
ldi TMP_Y,0x01 ; загружаем во временный регистр старший байт
sts UBRR1H,TMP_Y
ldi TMP_Y,0x00
sts UCSR1A,TMP_Y
ldi TMP_Y,0x98 ;(1<<RXEN1)|(1<<RXCIE1)|(1<<TXEN1)|(0<<TXCIE1)
sts UCSR1B,TMP_Y
ldi TMP_Y,0x86 ;(1<<UMSEL11)|(1<<UCSZ11)|(1<<UCSZ10)
sts UCSR1C,TMP_Y
Для mcu mega8, mega16, mega32 и еще некоторых адрес UBRRnH совпадает с адресом UCSRnC для выбора используется старший разряд URSELn, при 0-пишется UBRRnH, при 1-UCSRnC.
Возможно проблема в этом.
89s52
Добавлено: Чт июн 25, 2009 21:13:44
nik1601
нужен листинг на асме для АТ89s51. любой. изучаю. а то нет ничего типа AT89S52def.inc
Re: 89s52
Добавлено: Чт июн 25, 2009 21:17:04
ARV
nik1601 писал(а):нужен листинг на асме для АТ89s51. любой. изучаю. а то нет ничего типа AT89S52def.inc
а какое отношение сей вопрос имеет к теме
AVR?!
Добавлено: Чт июн 25, 2009 21:30:24
nik1601
сори. а куда мне?????????????
Добавлено: Чт июн 25, 2009 21:36:05
ARV
nik1601 писал(а):сори. а куда мне?????????????
Google, ключевые слова
исходник на ассемблере MCS51
Добавлено: Вт июл 28, 2009 00:28:45
AndreyE
Бегущий огонек v1.0 из обучалки
Нельзя ли уточнить, зачем в Temp3 пишется 10? Я пока всё в голове прокручиваю, и не могу понять
1) как могут все 3 условия совпасть, если первые два регистра будут снова в нуле, ведь Temp3 никогда не будет одновременно с ними?
2) возможно это из-за непонимания этого пункта - почему при вычитании из 0 вдруг получается 255, а не -1?
ldi Temp1,0
ldi Temp2,0
ldi Temp3,10
Loop: dec Temp1
brne Loop
dec Temp2
brne Loop
dec Temp3
brne Loop