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

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

Сообщение ARV »

Артур писал(а):Люди, Будьте добры!
Расскажите пожалуйста про инициализацию стека?

это выглядит примерно так:

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

    ldi Temp, low(RAMEND) 
    out SPL, Temp ; инициализируем указатель стэка

но будьте внимательны: если памяти в МК больше 256 байт - надо еще инициализировать и SPH! в обучалке, если я не ошибаюсь, об этом написано - прочтите.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Артур
Нашел транзистор. Понюхал.
Сообщения: 157
Зарегистрирован: Пн дек 04, 2006 09:50:08
Откуда: Vladivostok

Сообщение Артур »

Извиняюсь! Не внимательно читал обучалку!
Про стек тут:
http://www.radiokot.ru/start/mcu_fpga/avr/08/
Век живи! - Век учись!
ICQ-15B87330h
ipkin
Нашел транзистор. Понюхал.
Сообщения: 167
Зарегистрирован: Вт июл 10, 2007 23:15:17
Откуда: Магнитогорск

Сообщение ipkin »

вопрос
хочу написать прогу на асме для меги64
в начале программы подставляю файл с описанием регистров
m64def.inc при ассеблирование у меня вылетает ошибка
на строчку где в файле описания регистров написано ATmega64
типа иллегал девайс пользуюсь виндосовским асмом для авр
допустим беру другой файл с описанием регистров для другого проца на типа 8515def.inc всё ок может асемблер неподдерживает работу с мегой
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

ipkin писал(а):у меня вылетает ошибка
на строчку где в файле описания регистров написано ATmega64
типа иллегал девайс
уж сколько раз твердили миру... да воз и ныне там... :(

ну где эта строка? что за компилятор? какая у него версия? и т.п. подробности где?!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
ipkin
Нашел транзистор. Понюхал.
Сообщения: 167
Зарегистрирован: Вт июл 10, 2007 23:15:17
Откуда: Магнитогорск

Сообщение ipkin »

ну где эта строка? что за компилятор? какая у него версия? и т.п. подробности где?![/quote]
вот фрагмент файла m64def.inc

;*
;* in r16,PORTB ;read PORTB latch
;* sbr r16,(1<<PB6)+(1<<PB5) ;set PB6 and PB5 (use masks, not bit#)
;* out PORTB,r16 ;output to PORTB
;*
;* in r16,TIFR ;read the Timer Interrupt Flag Register
;* sbrc r16,TOV0 ;test the overflow flag (use bit#)
;* rjmp TOV0_is_set ;jump if set
;* ... ;otherwise do something else
;***************************************************************************

;**** Specify Device ****
.device ATmega64 РУГАЕТСЯ НА ЭТУ СТРОКУ

;*****************************************************************************
; I/O Register Definitions
;*****************************************************************************

;**** Memory Mapped I/O Register Definitions ($FF-$60) ****
.equ UCSR1C = $9D
.equ UDR1 = $9C
.equ UCSR1A = $9B
.equ UCSR1B = $9A
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

ну так заремарьте эту строку нафиг! или перейдите на компилятор, которому про atmega64 известно
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Brutaller
Встал на лапы
Сообщения: 87
Зарегистрирован: Пн ноя 05, 2007 12:44:43
Откуда: C:\Russia\SPb
Контактная информация:

Сообщение Brutaller »

Если ассемблер ругается на какую то строку из inc файла, то просто закомментировать её и всё.

Например tavrasm ругается на строки:
.equ OR = 3
.equ Z = 1
в некоторых инклудах.

_____

tych, тема про ассемблер, не надо пожалуйста свой СИ здесь впаривать.
Аватара пользователя
Артур
Нашел транзистор. Понюхал.
Сообщения: 157
Зарегистрирован: Пн дек 04, 2006 09:50:08
Откуда: Vladivostok

Сообщение Артур »

Всем привет!
И снова проблема! Хочу передать некое число по одному пину но получается огромный код! Скажите как его сделать компактней? И правильно ли я делаю?

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

ldi temp,0b00111010; передаем число 58 а принимаем 92 (перевёрнутое)
;***********************
;передача по одному биту на pin0 порта В
ldi temp1,0
out portb,temp1
rcall delay
ldi temp1,1
out portb,temp1
rcall delay
ldi temp1,0
out portb,temp1
rcall delay
ldi temp1,1
out portb,temp1
rcall delay
ldi temp1,1
out portb,temp1
rcall delay
ldi temp1,1
out portb,temp1
rcall delay
ldi temp1,0
out portb,temp1
rcall delay
ldi temp1,0
out portb,temp1
rcall delay
;************************
;задержка
delay:
          ldi temp2,0
    loop: dec temp2
           brne loop

              ldi temp3,0     
       loop1:
              dec temp3
              brne loop1
ret
;***********************************

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

Сообщение ARV »

не правильно. правильно бедут использовать в цикле сдвиг числа через флаг переноса, анализ флага переноса и вывод 0 или 1 соответственно.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Артур
Нашел транзистор. Понюхал.
Сообщения: 157
Зарегистрирован: Пн дек 04, 2006 09:50:08
Откуда: Vladivostok

Сообщение Артур »

ARV писал(а):не правильно. правильно бедут использовать в цикле сдвиг числа через флаг переноса, анализ флага переноса и вывод 0 или 1 соответственно.

А можно примерчик? Мне нужно чтоб другие выводы не использовались
Век живи! - Век учись!
ICQ-15B87330h
Аватара пользователя
Brutaller
Встал на лапы
Сообщения: 87
Зарегистрирован: Пн ноя 05, 2007 12:44:43
Откуда: C:\Russia\SPb
Контактная информация:

Сообщение Brutaller »

А примерно вот так:

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

        ldi Temp, 0b00111010 ; число которое хотим передать
        ldi Temp1, 8 ; счетчик битов
_01:    ror Temp   
        brcc _02
        sbi PORTB, 0 ; установить нулевой бит
        rjmp _03
_02:    cbi PORTB, 0 ; сбросить нулевой бит
_03:    dec Temp1 ; уменьшить счетчик
        brne _01


В зависимости с какого бита надо начинать, младшего или старшего, то сответственно выбираем команду ror или rol
Аватара пользователя
Артур
Нашел транзистор. Понюхал.
Сообщения: 157
Зарегистрирован: Пн дек 04, 2006 09:50:08
Откуда: Vladivostok

Сообщение Артур »

Спасибо огромное Brutaller РАБОТАЕТ!
Последний раз редактировалось Артур Пн мар 10, 2008 05:30:00, всего редактировалось 1 раз.
Век живи! - Век учись!
ICQ-15B87330h
Аватара пользователя
Артур
Нашел транзистор. Понюхал.
Сообщения: 157
Зарегистрирован: Пн дек 04, 2006 09:50:08
Откуда: Vladivostok

Сообщение Артур »

Здравствуйте! А не могли бы Вы рассказать подробно про такие команды как ROR и BRCC в обучалке про них ничего не сказано :(
А у меня в книге написано так:

ROR - Rd(7)<C, Rd(n)<Rd(n+1),C<Rd(0)

BRCC - if(C=0)PC<PC+k+1

что совсем не понятно как оно устроено!
Спасибо!
Век живи! - Век учись!
ICQ-15B87330h
Дон Амброзио

Сообщение Дон Амброзио »

Артур писал(а):ROR - Rd(7)<C, Rd(n)<Rd(n+1),C<Rd(0)

Что же тут непонятного?


С --> B7 --> B6 --> B5 --> B4 --> B3 --> B2 --> B1 --> B0 -->
|_____|
ipkin
Нашел транзистор. Понюхал.
Сообщения: 167
Зарегистрирован: Вт июл 10, 2007 23:15:17
Откуда: Магнитогорск

Сообщение ipkin »

Попробую ещё в этом разделе

хочу подружить мегу64 и ммс карту 32метра (меньше не нашёл хотя устроила бы и 8метровая)
может у кого есть пример на асме т.к си пока не знаю
задача стоит такая на карте будут храниться граф образа в bin т.е мне не нужна файловая система флэшка будет использоваться как обычная мс памяти и ещё где можно найти схемку прогера чтобы прошить карту именно как мс памяти не кардридер
Аватара пользователя
Brutaller
Встал на лапы
Сообщения: 87
Зарегистрирован: Пн ноя 05, 2007 12:44:43
Откуда: C:\Russia\SPb
Контактная информация:

Сообщение Brutaller »

Артур писал(а):Спасибо огромное Brutaller РАБОТАЕТ!

Это хорошо что работает ;)
Правда сказать, не совсем понял, что и куда вы передаете таким образом. Ну да ладно, не это главное.

Артур писал(а):Здравствуйте! А не могли бы Вы рассказать подробно про такие команды как ROR и BRCC в обучалке про них ничего не сказано
А у меня в книге написано так:

ROR - Rd(7)<C, Rd(n)<Rd(n+1),C<Rd(0)

BRCC - if(C=0)PC<PC+k+1

что совсем не понятно как оно устроено!
Спасибо!

ROL / ROR побитное вращение регистра через флаг переноса, соответственно влево/вправо.
Т.е. получается что мы выдвигаем один бит командой ROR во флаг переноса и взависимости от того, что окажется во флаге, делаем переход в нужное место. И так восемь раз.
BRCC - Branch if Carry Cleared (Переход если флаг переноса очищен).
Аватара пользователя
Артур
Нашел транзистор. Понюхал.
Сообщения: 157
Зарегистрирован: Пн дек 04, 2006 09:50:08
Откуда: Vladivostok

Сообщение Артур »

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

Сообщение ARV »

Артур писал(а):Скажите пожалуйста а что нельзя чтоли просто скопировать бит одного РОН в Другой? ну например нулевой бит или третий? Спасибо!
просто взять и скопировать одной командой - нельзя.
для AVR придется делать примерно так:
1. Запомнить во флаге Т бит из исходного регистра командой BST
2. Сохранить состояние флага Т в нужном бите второго регистра командой BLD

или

1. Выделить командой ANDI значение бита в исходном регистре
2. Подавить командой ANDI значение бита в приемном регистре
2. Командой OR установить значение в приемном регистре

в первом случае "место" исходного бита и приемного может быть разным (т.е. берем 1-й бит и ставим его на место 5-го бита), во втором "место" будет одинаковым.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Артур
Нашел транзистор. Понюхал.
Сообщения: 157
Зарегистрирован: Пн дек 04, 2006 09:50:08
Откуда: Vladivostok

Сообщение Артур »

Спасибо!
Я так и думал что нельзя! Пробовал копировать в флаг Т, нокогда вынимаю из флага Т бит и вставляю в регистр PORTB0 компилятор VMLAB ругается я почему и спрашивал!
Век живи! - Век учись!
ICQ-15B87330h
Аватара пользователя
Brutaller
Встал на лапы
Сообщения: 87
Зарегистрирован: Пн ноя 05, 2007 12:44:43
Откуда: C:\Russia\SPb
Контактная информация:

Сообщение Brutaller »

Артур писал(а):Пробовал копировать в флаг Т, нокогда вынимаю из флага Т бит и вставляю в регистр PORTB0 компилятор VMLAB ругается я почему и спрашивал!

Что за PORTB0 ??? Не знаю такого :))
И вообще то PORTB это вовсе не РОН, а I/O Port. К РОН относятся регистры r0-r31.
Ответить

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