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

Добавлено: Чт мар 20, 2008 02:58:47
knyaz*
Возникла непонятка с косвенной адресацией...
это так понимаю нухно только для парных регистров X,Y,Z?
т.к. в них нельзя загрузить число непосредственно через ldi?
вобще как в них загружается 16 битное число...? сам процесс интересует...

Добавлено: Чт мар 20, 2008 15:19:51
ARV
загрузка адреса ADDR в регистровую пару Y:

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

   ldi    YL, low(ADDR)
   ldi    YH, high(ADDR)

Добавлено: Чт мар 20, 2008 15:54:55
knyaz*
так а косвенная адресачия что это такое?

Добавлено: Чт мар 20, 2008 21:22:03
ARV
knyaz* писал(а):так а косвенная адресачия что это такое?

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

    
    ; прямая адресация
    sts   MEM, r12
    ; косвенная адресация
    ldi   XL. low(MEM)
    ldi   XH, high(MEM)
    st    X, r12   
сохранение содержимого r12 в ячейке памяти, адрес которой хранится в паре X - это и есть косвенная адресация.

Добавлено: Чт мар 20, 2008 23:29:48
knyaz*
чето не пойму зачем это... уже штук пять кник прочитал не как не могу понять что за сурьезнаячтука косвенная адресация и для чего она нужна...

Добавлено: Пт мар 21, 2008 08:13:30
ARV
knyaz* писал(а):чето не пойму зачем это... уже штук пять кник прочитал не как не могу понять что за сурьезнаячтука косвенная адресация и для чего она нужна...
странный вы чел... что ж тут непонятного? косвенная адресация позволяет отделить код подпрограммы от привязки к конкретному адресу памяти. попробуйте сделать без косвенной адресации вывод строк (разных) по USART, например. будет у вас не программа, а монстр! а с косвенной адресацией все элементарно: пишите подпрограмму, которая выводит строку, адрес начала которой в X (или Y или Z), потом сколько угодно раз заносите в выбранную регистровую пару адрес начала строки и вызываете подпрограмму. а как красиво обращаться к массивам в ОЗУ без косвенной адресации - я даже и не могу придумать...

P.S. Вообще-то вопрос об адресации относится не к ассемблеру, а к программированию вообще. Косвенная адресация применяется и в Си, например: любой указатель - это как раз способ косвенного обращения к данным...

Добавлено: Вт мар 25, 2008 22:39:19
ipkin
подскажите почему ассемблер ругается на эту строку
ldi r16,2
out XMCRA,r16 <------------------ вот на эту
error : Undefined variable referenced
использую ассемблер для windows 1.30
в начале текста программы подставляю файл m64def.inc с описанием всех кишок данного камня в файле m64def.inc строка .equ XMCRA = $6D присутствует где засада

Добавлено: Вт мар 25, 2008 22:54:30
biDE
ipkin писал(а):подскажите почему ассемблер ругается на эту строку
ldi r16,2
out XMCRA,r16 <------------------ вот на эту
error : Undefined variable referenced
Для портов и регистров ввода-вывода с адресами выше 5F нужно применять команды ST/STS/STD и LD/LDS/LDD

Добавлено: Вт мар 25, 2008 23:35:53
ipkin
biDE писал(а):
ipkin писал(а):подскажите почему ассемблер ругается на эту строку
ldi r16,2
out XMCRA,r16 <------------------ вот на эту
error : Undefined variable referenced
Для портов и регистров ввода-вывода с адресами выше 5F нужно применять команды ST/STS/STD и LD/LDS/LDD
sts -прошла

Добавлено: Пн апр 07, 2008 10:05:30
ipkin
Здравствуйте все.
пытаюсь работать с AT45DB161 (SO8) MEG-ой 64-ой
подключил флэшку на штатный SPI контроллера
написал вот такую программулину и ничего не робит (нет импульсов ни такта ни передачи во флэш)
посмотрите пожалуйста подскажите что не так

Добавлено: Пн апр 07, 2008 10:25:57
tych
ipkin писал(а):Здравствуйте все.
пытаюсь работать с AT45DB161 (SO8) MEG-ой 64-ой
Если не получится то посмотрите пример на стр. 6 Изображение в упражнении 7.

Добавлено: Пн апр 07, 2008 10:50:02
ipkin
это я видел там на Си а я на ассеблере пишу

Добавлено: Пн апр 07, 2008 11:28:05
tych
ipkin писал(а):это я видел там на Си а я на ассеблере пишу
Вы можете посмотреть листинг компилятора - файл .lst - там код на АСМ будет привязан к коду на Си с комментариями.

И еще можно в симуляторе посмотреть сигналы чтоб понять что не так.

Добавлено: Пн апр 07, 2008 11:36:52
biDE
ipkin писал(а):написал вот такую программулину и ничего не робит
Неправильная конфигурация порта В в районе выводов SPI.
Внимательно курите даташит (Table 69. SPI Pin Overrides).

Добавлено: Пн апр 07, 2008 18:49:20
Brutaller
Какая интересная инициализация указателя стека для ATmega64 :shock:

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

      ldi count,RamEnd
      out SPL,count
Интересно, а куда будет возвращаться процессор после вызова wait_spi ? :)

Даже в даташите в разделе "Interrupts" после таблицы с векторами есть конкретный пример правильной инициализации на асме.

Вот:

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

ldi r16, high(RAMEND)
out SPH,r16
ldi r16, low(RAMEND)
out SPL,r16
У всех кристаллов, у которых размер SRAM более 128 байт, регистр-указатель стэка состоит из младшей и старшей части, SPL и SPH. А у всех ATmega SRAM от 512, так что SPH есть по любому. Один единственный SPL только на некоторых ATtiny. Так что сначала первым делом на это обратите внимание. Остальное не смотрел. Да и не приходилось с SPI работать.
А то тут сразу все в дебри ударились. А проблема то прямо на поверхности :)

И еще вопрос, а разве ассемблер не выдавал предупреждения "out of range". Т.к. RamEnd для ATmega64 0x10FF, а это явно больше чем 0xFF

Добавлено: Вт апр 08, 2008 21:39:48
ipkin
всё сделал стек действительно не правильно был выставлен
всё заработало но возникла ещё одна проблема допустим в примере мне надо с дата флэш прочитать 65535байт а прога зациклилась и гонит по кругу все 2 метра потом заново
подскажите где ошибка

Добавлено: Чт апр 10, 2008 23:19:56
Томатный
может ли кто поделиться драйвером на ЖКИ (на базе контроллера HD44780)
переделывал из Сишного кода(есть написаный в WinAVR драйвер) - не работает :shock:
пример мне очень поможет
асм не юзал раньше, первая прога)

Добавлено: Пт апр 11, 2008 14:42:02
Томатный
Proteus пишет ошибку SP is not initialized

Добавлено: Сб апр 12, 2008 23:18:27
Томатный
простите за мою тупость и невнимательность.
подпрограмму задержки надо переписать так:

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

;пауза r16 милисек для 4мГц
pause:
ldi r17,10
ldi r18,133
dec r18
brne PC-1
dec r17
brne PC-4
dec r16
brne PC-7
ret

Добавлено: Вс апр 13, 2008 00:40:12
biDE
А что делает эта последовательность в lcd ?
in r16,PORTB ;PORTB &= 0x03;
ori r16,$03
out PORTB,r16