Страница 16 из 400

Добавлено: Вс май 17, 2009 20:39:57
edm2007
Ну да, если нужен регистр данных порта - то PORTB, а если регистр выводов - то PINB. Я же написал ...если необходимо считать состояние вывода порта... Там только через PINB.

Добавлено: Вс май 17, 2009 20:46:27
MeL$
ага - пасип )

Добавлено: Пн июн 01, 2009 18:24:57
Andrey3377

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

ldi r16,low(ramend)
out spl, r16
ldi r16, high(ramend)
out sph, r16
Инициализация стека.... Объясните пожалуйста конструкции low(ramend) и high(ramend). ramend прописан в соответсвующем .inc, это понятно. А вот где прописаны low и high и как из low(ramend) и high(ramend) получаются константы? В хелпе я чего-то не нашел.

Добавлено: Пн июн 01, 2009 18:35:30
ibiza11
low и high команды компилятора. при создании .hex файла он сам обсчитывает их и подставляет в код уже посчитанные константы.
Low(x) - возвращает младший байт числа Х
High(x) - возвращает старший байт числа Х

Добавлено: Пн июн 01, 2009 19:16:09
Andrey3377
ibiza11 писал(а):low и high команды компилятора. при создании .hex файла он сам обсчитывает их и подставляет в код уже посчитанные константы.
Low(x) - возвращает младший байт числа Х
High(x) - возвращает старший байт числа Х
Где о них(и о других) почитать можно? В списке директив я их не нашел.

Добавлено: Пн июн 01, 2009 23:44:13
ibiza11
думаю вотэто вам точно поможет

Добавлено: Вт июн 02, 2009 01:00:32
RUNA
Мяу всем!

Как на ассемблере осуществить деление 351 на 1579?

Добавлено: Вт июн 02, 2009 10:44:03
Виталик
Подскажите, что означают команды:

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

.DB 255,255,31,25,19,13,7,1
.org flashend-79
.dw VCR | (5 << 8)

Добавлено: Вт июн 02, 2009 10:55:39
Виталик
Как на ассемблере осуществить деление 351 на 1579?
Сдесь есть деление, правда, только 8-разрядных чисел.
http://atmel.ru/Articles/Atmel21.htm

Добавлено: Вт июн 02, 2009 11:41:50
akl
RUNA писал(а): ...Как на ассемблере осуществить деление 351 на 1579?
Умножьте 351 на 10'000'000 и, пользуясь подпрограммой "DIV" по ссылке ниже, разделите на 1579. Получите результат умноженный на 10'000'000.
Умножать не обязательно на 10'000'000, а на число, которое позволит получить результат с достаточной точностью.
http://radiokot.ru/forum/viewtopic.php?p=193610#193610

Добавлено: Вт июн 02, 2009 23:41:35
RUNA
Спасибо. Буду пробовать.

Добавлено: Вс июн 07, 2009 00:49:25
Andrey3377
Двигаюсь потихоньку... Прерывания.
Как по вашему опыту лучше все эти дела организовывать, стек инициализировать, разрешение, конфигурация внешних и других прерываний? Сразу после таблицы прерываний или внутри обработчика RESET?

Добавлено: Вс июн 07, 2009 07:24:39
ibiza11
Фраза "Сразу после таблицы прерываний" ничего не дает. главное какая метка стоит после нее.
Я обычно после РЕСЕТА произвожу инициализацию стека, портов, ну и всякую дребедень которая пригодиться, после этого завожу основной цикл программы и в нем уже пишу остальной код, т.к. в цикле нет смысла инициализировать несколько раз (исключения составляют те модули, которые отключаются/включаются в цикле, тогда их инициализацию ставлю не после РЕСЕТа а в цикл)

Добавлено: Вс июн 07, 2009 09:45:01
ARV
Andrey3377 писал(а):Двигаюсь потихоньку... Прерывания.
Как по вашему опыту лучше все эти дела организовывать, стек инициализировать, разрешение, конфигурация внешних и других прерываний? Сразу после таблицы прерываний или внутри обработчика RESET?
по-моему, вы являетесь очередной жертвой неудачного тезиса из обучалки :(
в подавляющем большинстве AVR RESET - это НЕ ВЕКТОР ПРЕРЫВАНИЯ, а сброс - НЕ ПРЕРЫВАНИЕ!!! это адрес начала исполнения программы, стартовый адрес. непосредственно со следующей ячейки памяти начинается таблица векторов прерываний.

так вот, обработчика RESET не существует - это есть основная программа. если вы используете прерывания, то таблица векторов будет использоваться по прямому назначению, следовательно, по адресу RESET должна быть команда безусловного перехода к телу основной программы - и ничего более!!! где это тело начнется - сразу после таблицы прерываний или глубже по памяти - абсолютно все равно. но иного места, кроме как в начале основной программы (реальном начале, а не по адресу RESET), для установки указателя стека и настройки периферии просто быть не может!!!

Добавлено: Вс июн 07, 2009 23:46:38
Andrey3377
ARV писал(а):
Andrey3377 писал(а):Двигаюсь потихоньку... Прерывания.
Как по вашему опыту лучше все эти дела организовывать, стек инициализировать, разрешение, конфигурация внешних и других прерываний? Сразу после таблицы прерываний или внутри обработчика RESET?
по-моему, вы являетесь очередной жертвой неудачного тезиса из обучалки :(
в подавляющем большинстве AVR RESET - это НЕ ВЕКТОР ПРЕРЫВАНИЯ, а сброс - НЕ ПРЕРЫВАНИЕ!!! это адрес начала исполнения программы, стартовый адрес. непосредственно со следующей ячейки памяти начинается таблица векторов прерываний.
Угу, вкурил. Тут виной не столько обучалка, сколько даташиты контроллеров с рыбой таблицы векторов прерываний. Где по нулевому адресу прописан Reset Handler.
:) Я тут пытался написать Reset Handler по правилам. Написал, в конце поставил reti. И думаю, а куда ж оно вернется?В стеке то нулевой адрес...
В принципе по нулевому адресу может быть написано даже не rjmp НАЧАЛО_ПРОГРАММЫ, а какие-то команды на месте неиспользуемых векторов и rjmp можно поставить прямо перед используемым в конкретной программе вектором. Я правильно понял?

Добавлено: Пн июн 08, 2009 00:25:09
ibiza11
теоретически вы правильно поняли, вы в праве использовать память контроллера по своему усмотрению, только нужно точно знать, что никакое прерывание не произойдет. иначе PC присвоится адрес по которому должен быть вектор прерывания, а там на самом деле будет другая команда.
ИМХО лучший вариант вместо неиспользуемых векторов прерываний написать reti. (всегда если что можно заменить на rjmp метка)

Добавлено: Пн июн 15, 2009 12:17:59
Alspro
Добрый день. Подскажите пожалуйста как решить мою проблему. Бьюсь головой в стену уже 2 дня

Нужно использовать USART1 в atmega64
Инициализация из даташита
  • USART_Init:
    ; Set baud rate

    out UBRRH, r17
    out UBRRL, r16

    итд...
    ret
Так как мне нужен USART1 то будет UBRR1H и UBRR1L
Но AVR sudio категорически не признает строки
out UBRR1H, r17 и out UBRR1L, r16 говоря
error: Operand 1 out of range: 0x9b
Что делать? заранее спасибо.

Добавлено: Пн июн 15, 2009 12:30:40
ikarab
Модет out не в масть тут ? help чтить надобно про инструкцию out или даташит.

Студия понапрасну говорить не станет наверно.

Добавлено: Пн июн 15, 2009 12:46:15
GP1
Alspro писал(а):Добрый день. Подскажите пожалуйста как решить мою проблему. Бьюсь головой в стену уже 2 дня

Нужно использовать USART1 в atmega64
Инициализация из даташита
  • USART_Init:
    ; Set baud rate

    out UBRRH, r17
    out UBRRL, r16

    итд...
    ret
Так как мне нужен USART1 то будет UBRR1H и UBRR1L
Но AVR sudio категорически не признает строки
out UBRR1H, r17 и out UBRR1L, r16 говоря
error: Operand 1 out of range: 0x9b
Что делать? заранее спасибо.
Для загрузки регистров в старших адресах необходимо использовать команду ST, а для чтения LD

Добавлено: Пн июн 15, 2009 13:04:38
smac
GP1 писал(а):Для загрузки регистров в старших адресах необходимо использовать команду ST, а для чтения LD
Чуть чуть подправлю, в случае с регистрами общего назначения нужно загружать их значения командой STS, т.е.

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

sts UBRR1H, r17
а читать командой LDS, т.е. если мы хотим прочитать в r17 значение UBRR1H, то нужно сделать так.

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

lds r17, UBRR1H