Ассемблер (ASM) для AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

Спасибо, действительно LDS, STS, это просто я глюканул немного, видимо от жары :)))
Чем дальше, тем больше становлюсь занудой...
Изображение
Alspro
Родился
Сообщения: 3
Зарегистрирован: Пн июн 15, 2009 12:07:01

Сообщение Alspro »

УРА!!! Спасибо!!! Работает!!!!
Подскажите еще какую команду использовать в конструкции вместо SBIC.

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

uart_snt:   
   SBIC    UCSR1A,UDRE1      ; Пропуск если нет флага готовности
   RJMP   uart_snt       ; ждем готовности - флага UDRE1
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

Alspro писал(а):УРА!!! Спасибо!!! Работает!!!!
Подскажите еще какую команду использовать в конструкции вместо SBIC.

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

uart_snt:   
   SBIC    UCSR1A,UDRE1      ; Пропуск если нет флага готовности
   RJMP   uart_snt       ; ждем готовности - флага UDRE1
гм... используйте NOP :))) вы хоть сказали бы ДЛЯ ЧЕГО нужна другая инструкция?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Alspro
Родился
Сообщения: 3
Зарегистрирован: Пн июн 15, 2009 12:07:01

Сообщение Alspro »

Проблема - компилятор ругается что Operand 1 out of range: 0x9b
Хотя пример из даташита на эту атмегу64
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

Команды типа SBIC, SBIS и др. работают, если правильно помню, с адресами до 0x31, поэтому напрямую тестировать бит не получится.
Могу предложить грузить значение в какой нибудь регистр из старшей половины (обычно используют R16 в качестве temp) и анализировать бит в промежуточном регистре, но на мой взгляд правильнее было бы генерировать прерывание по флагу UDRE1.
Последний раз редактировалось GP1 Пн июн 15, 2009 22:51:38, всего редактировалось 1 раз.
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

Ребят, а эта тема с sts lds только для меги64? что то я не совсем понял почему так...
Ставим плюсы: )
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

Это справедливо для всех регистров с адресами выше 0x31, для всех проциков.
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

"справедливо" - хорошо, но почему обычный out не работает в этом случае?
и еще поправь, если не так:
$00=r0
...
$31=r31
Ставим плюсы: )
smac
Мучитель микросхем
Сообщения: 459
Зарегистрирован: Вс июн 01, 2008 12:16:38

Сообщение smac »

ibiza11 писал(а):"справедливо" - хорошо, но почему обычный out не работает в этом случае?
и еще поправь, если не так:
$00=r0
...
$31=r31

Потому что команда out работает с регистрами специальных функций имеющими абсолютные адреса с 0x20 до 0x5F включительно. Однако для команды out необходимо представление этих регистров со смещенными на 0x20 адресами, т. е. для команды out адрес регистра специальных функций 0x00 соответствует ячейке памяти с адресом 0x20, адрес 0x3F соответствует ячейке с адресом - 0x5F. Адрес 0x3F - ограничение для команды out, так заложено разработчиками, по какой причине - нужно спросить у них. Соотвественно все ячейки памяти с абсолютными адресами выше 0x5F для команды out неподвластны и с данными адресами работают обычные команды обращения к памяти, котоые оперируют уже не смещенными адресами. Подробнее про систему команд и адреса регистров можно узнать из даташита на контроллер и чудесного документа от атмел, называемого AVR Instruction Set.
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

спасибо, просто никогда не встречался с такой проблемой. на будущее буду иметь в виду ;)
Ставим плюсы: )
nppElM
Родился
Сообщения: 12
Зарегистрирован: Чт мар 05, 2009 10:32:23

Вопрос к теме UART

Сообщение 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 очищается при выполнении следующей команды кода.
Помогите пожалуйста!!!!
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

в чем "шагаете"? не забыли, что UDR для чтения совсем не то же самое, что UDR для записи? при пошаговой прогонке отладчик считывает и показывает содержимое UDR, а то, что туда было записано - обратно считать невозможно. кстати, симулятор AVR Studio вообще UDR не симулирует - об этом написано в справочном файле.

а передача длится довольно долго (не забыли про скорость USART и скорость работы ядра МК?), поэтому ушагать можно хрен знает куда, пока передача закончится и встанет флажок...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
nppElM
Родился
Сообщения: 12
Зарегистрирован: Чт мар 05, 2009 10:32:23

Сообщение nppElM »

Шагаю в AVR Studio, про разность скоростей понимаю, но передача то все равно не идет :cry: .
Я так понял, что в коде ошибок нет, я делаю все правельно?
Аватара пользователя
Negor
Вымогатель припоя
Сообщения: 586
Зарегистрирован: Ср мар 07, 2007 22:58:02
Откуда: Черкассы, Украина
Контактная информация:

Сообщение Negor »

к AvrStudio есть дополнение для эмуляции терминала, правда не помню как его зовут :roll:
There is only 10 kind of people: those who understands binary code and those who dont!!!
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Re: Вопрос к теме UART

Сообщение 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.
Возможно проблема в этом.
Чем дальше, тем больше становлюсь занудой...
Изображение
nik1601
Родился
Сообщения: 2
Зарегистрирован: Чт июн 25, 2009 02:49:56

89s52

Сообщение nik1601 »

нужен листинг на асме для АТ89s51. любой. изучаю. а то нет ничего типа AT89S52def.inc
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: 89s52

Сообщение ARV »

nik1601 писал(а):нужен листинг на асме для АТ89s51. любой. изучаю. а то нет ничего типа AT89S52def.inc
а какое отношение сей вопрос имеет к теме AVR?!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
nik1601
Родился
Сообщения: 2
Зарегистрирован: Чт июн 25, 2009 02:49:56

Сообщение nik1601 »

сори. а куда мне?????????????
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

nik1601 писал(а):сори. а куда мне?????????????
Google, ключевые слова исходник на ассемблере MCS51
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
AndreyE
Родился
Сообщения: 1
Зарегистрирован: Вт июл 28, 2009 00:20:53
Откуда: Москва

Сообщение 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
Лекарства кончились - решил учить ASM для AVR
Ответить

Вернуться в «AVR»