Ассемблер (ASM) для AVR в вопросах и ответах
УРА!!! Спасибо!!! Работает!!!!
Подскажите еще какую команду использовать в конструкции вместо SBIC.
Подскажите еще какую команду использовать в конструкции вместо SBIC.
Код: Выделить всё
uart_snt:
SBIC UCSR1A,UDRE1 ; Пропуск если нет флага готовности
RJMP uart_snt ; ждем готовности - флага UDRE1
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
гм... используйте NOP :))) вы хоть сказали бы ДЛЯ ЧЕГО нужна другая инструкция?Alspro писал(а):УРА!!! Спасибо!!! Работает!!!!
Подскажите еще какую команду использовать в конструкции вместо SBIC.Код: Выделить всё
uart_snt:
SBIC UCSR1A,UDRE1 ; Пропуск если нет флага готовности
RJMP uart_snt ; ждем готовности - флага UDRE1
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
Команды типа SBIC, SBIS и др. работают, если правильно помню, с адресами до 0x31, поэтому напрямую тестировать бит не получится.
Могу предложить грузить значение в какой нибудь регистр из старшей половины (обычно используют R16 в качестве temp) и анализировать бит в промежуточном регистре, но на мой взгляд правильнее было бы генерировать прерывание по флагу UDRE1.
Могу предложить грузить значение в какой нибудь регистр из старшей половины (обычно используют R16 в качестве temp) и анализировать бит в промежуточном регистре, но на мой взгляд правильнее было бы генерировать прерывание по флагу UDRE1.
Последний раз редактировалось GP1 Пн июн 15, 2009 22:51:38, всего редактировалось 1 раз.
ibiza11 писал(а):"справедливо" - хорошо, но почему обычный out не работает в этом случае?
и еще поправь, если не так:
$00=r0
...
$31=r31
Потому что команда out работает с регистрами специальных функций имеющими абсолютные адреса с 0x20 до 0x5F включительно. Однако для команды out необходимо представление этих регистров со смещенными на 0x20 адресами, т. е. для команды out адрес регистра специальных функций 0x00 соответствует ячейке памяти с адресом 0x20, адрес 0x3F соответствует ячейке с адресом - 0x5F. Адрес 0x3F - ограничение для команды out, так заложено разработчиками, по какой причине - нужно спросить у них. Соотвественно все ячейки памяти с абсолютными адресами выше 0x5F для команды out неподвластны и с данными адресами работают обычные команды обращения к памяти, котоые оперируют уже не смещенными адресами. Подробнее про систему команд и адреса регистров можно узнать из даташита на контроллер и чудесного документа от атмел, называемого AVR Instruction Set.
Вопрос к теме UART
Добрый день!
Подскажите пожалуйста что не так делаю, суть такая UART должен работать по прерыванию при приеме данных, а передача по мере необходимости, но пока передача не работает
а дальше стандартная схема
Но передача не происходит, при чем при пошаговом разборе компилятор показывает, что UDR1 очищается при выполнении следующей команды кода.
Помогите пожалуйста!!!!
Подскажите пожалуйста что не так делаю, суть такая 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 очищается при выполнении следующей команды кода.
Помогите пожалуйста!!!!
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
в чем "шагаете"? не забыли, что UDR для чтения совсем не то же самое, что UDR для записи? при пошаговой прогонке отладчик считывает и показывает содержимое UDR, а то, что туда было записано - обратно считать невозможно. кстати, симулятор AVR Studio вообще UDR не симулирует - об этом написано в справочном файле.
а передача длится довольно долго (не забыли про скорость USART и скорость работы ядра МК?), поэтому ушагать можно хрен знает куда, пока передача закончится и встанет флажок...
а передача длится довольно долго (не забыли про скорость USART и скорость работы ядра МК?), поэтому ушагать можно хрен знает куда, пока передача закончится и встанет флажок...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
Re: Вопрос к теме UART
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
нужен листинг на асме для АТ89s51. любой. изучаю. а то нет ничего типа AT89S52def.inc
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: 89s52
а какое отношение сей вопрос имеет к теме AVR?!nik1601 писал(а):нужен листинг на асме для АТ89s51. любой. изучаю. а то нет ничего типа AT89S52def.inc
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Google, ключевые слова исходник на ассемблере MCS51nik1601 писал(а):сори. а куда мне?????????????
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Бегущий огонек 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
Нельзя ли уточнить, зачем в 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
Лекарства кончились - решил учить ASM для AVR
