Страница 2 из 400
Добавлено: Вт мар 04, 2008 12:13:05
ARV
Артур писал(а):Люди, Будьте добры!
Расскажите пожалуйста про инициализацию стека?
это выглядит примерно так:
Код: Выделить всё
ldi Temp, low(RAMEND)
out SPL, Temp ; инициализируем указатель стэка
но будьте внимательны: если памяти в МК больше 256 байт - надо еще инициализировать и SPH! в обучалке, если я не ошибаюсь, об этом написано - прочтите.
Добавлено: Вт мар 04, 2008 13:50:16
Артур
Извиняюсь! Не внимательно читал обучалку!
Про стек тут:
http://www.radiokot.ru/start/mcu_fpga/avr/08/
Добавлено: Пт мар 07, 2008 10:22:13
ipkin
вопрос
хочу написать прогу на асме для меги64
в начале программы подставляю файл с описанием регистров
m64def.inc при ассеблирование у меня вылетает ошибка
на строчку где в файле описания регистров написано ATmega64
типа иллегал девайс пользуюсь виндосовским асмом для авр
допустим беру другой файл с описанием регистров для другого проца на типа 8515def.inc всё ок может асемблер неподдерживает работу с мегой
Добавлено: Пт мар 07, 2008 10:29:18
ARV
ipkin писал(а):у меня вылетает ошибка
на строчку где в файле описания регистров написано ATmega64
типа иллегал девайс
уж сколько раз твердили миру... да воз и ныне там...
ну где эта строка? что за компилятор? какая у него версия? и т.п. подробности где?!
Добавлено: Пт мар 07, 2008 10:59:35
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
Добавлено: Пт мар 07, 2008 13:52:49
ARV
ну так заремарьте эту строку нафиг! или перейдите на компилятор, которому про atmega64 известно
Добавлено: Пт мар 07, 2008 19:34:40
Brutaller
Если ассемблер ругается на какую то строку из inc файла, то просто закомментировать её и всё.
Например tavrasm ругается на строки:
.equ OR = 3
.equ Z = 1
в некоторых инклудах.
__________
tych, тема про ассемблер, не надо пожалуйста свой СИ здесь впаривать.
Добавлено: Вс мар 09, 2008 05:26:15
Артур
Всем привет!
И снова проблема! Хочу передать некое число по одному пину но получается огромный код! Скажите как его сделать компактней? И правильно ли я делаю?
Код: Выделить всё
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
;***********************************
Спасибо!
Добавлено: Вс мар 09, 2008 08:26:53
ARV
не правильно. правильно бедут использовать в цикле сдвиг числа через флаг переноса, анализ флага переноса и вывод 0 или 1 соответственно.
Добавлено: Вс мар 09, 2008 12:30:32
Артур
ARV писал(а):не правильно. правильно бедут использовать в цикле сдвиг числа через флаг переноса, анализ флага переноса и вывод 0 или 1 соответственно.
А можно примерчик? Мне нужно чтоб другие выводы не использовались
Добавлено: Вс мар 09, 2008 15:08:03
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
Добавлено: Вс мар 09, 2008 15:41:18
Артур
Спасибо огромное Brutaller РАБОТАЕТ!
Добавлено: Пн мар 10, 2008 05:28:10
Артур
Здравствуйте! А не могли бы Вы рассказать подробно про такие команды как ROR и BRCC в обучалке про них ничего не сказано

А у меня в книге написано так:
ROR - Rd(7)<C, Rd(n)<Rd(n+1),C<Rd(0)
BRCC - if(C=0)PC<PC+k+1
что совсем не понятно как оно устроено!
Спасибо!
Добавлено: Пн мар 10, 2008 11:16:59
Дон Амброзио
Артур писал(а):ROR - Rd(7)<C, Rd(n)<Rd(n+1),C<Rd(0)
Что же тут непонятного?
С --> B7 --> B6 --> B5 --> B4 --> B3 --> B2 --> B1 --> B0 -->
|________________|
Добавлено: Пн мар 10, 2008 17:36:03
ipkin
Попробую ещё в этом разделе
хочу подружить мегу64 и ммс карту 32метра (меньше не нашёл хотя устроила бы и 8метровая)
может у кого есть пример на асме т.к си пока не знаю
задача стоит такая на карте будут храниться граф образа в bin т.е мне не нужна файловая система флэшка будет использоваться как обычная мс памяти и ещё где можно найти схемку прогера чтобы прошить карту именно как мс памяти не кардридер
Добавлено: Вт мар 11, 2008 20:40:02
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 (Переход если флаг переноса очищен).
Добавлено: Сб мар 15, 2008 06:40:03
Артур
Скажите пожалуйста а что нельзя чтоли просто скопировать бит одного РОН в Другой? ну например нулевой бит или третий? Спасибо!
Добавлено: Сб мар 15, 2008 09:49:48
ARV
Артур писал(а):Скажите пожалуйста а что нельзя чтоли просто скопировать бит одного РОН в Другой? ну например нулевой бит или третий? Спасибо!
просто взять и скопировать одной командой - нельзя.
для AVR придется делать примерно так:
1. Запомнить во флаге Т бит из исходного регистра командой
BST
2. Сохранить состояние флага Т в нужном бите второго регистра командой
BLD
или
1. Выделить командой
ANDI значение бита в исходном регистре
2. Подавить командой
ANDI значение бита в приемном регистре
2. Командой
OR установить значение в приемном регистре
в первом случае "место" исходного бита и приемного может быть разным (т.е. берем 1-й бит и ставим его на место 5-го бита), во втором "место" будет одинаковым.
Добавлено: Вс мар 16, 2008 08:03:18
Артур
Спасибо!
Я так и думал что нельзя! Пробовал копировать в флаг Т, нокогда вынимаю из флага Т бит и вставляю в регистр PORTB0 компилятор VMLAB ругается я почему и спрашивал!
Добавлено: Вс мар 16, 2008 14:25:03
Brutaller
Артур писал(а):Пробовал копировать в флаг Т, нокогда вынимаю из флага Т бит и вставляю в регистр PORTB0 компилятор VMLAB ругается я почему и спрашивал!
Что за PORTB0 ??? Не знаю такого :))
И вообще то PORTB это вовсе не РОН, а I/O Port. К РОН относятся регистры r0-r31.