Обсуждаем контроллеры компании Atmel.
Ответить

Вт мар 04, 2008 12:13:05

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

это выглядит примерно так:
Код:
    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

вопрос
хочу написать прогу на асме для меги64
в начале программы подставляю файл с описанием регистров
m64def.inc при ассеблирование у меня вылетает ошибка
на строчку где в файле описания регистров написано ATmega64
типа иллегал девайс пользуюсь виндосовским асмом для авр
допустим беру другой файл с описанием регистров для другого проца на типа 8515def.inc всё ок может асемблер неподдерживает работу с мегой

Пт мар 07, 2008 10:29:18

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

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

Пт мар 07, 2008 10:59:35

ну где эта строка? что за компилятор? какая у него версия? и т.п. подробности где?![/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

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

Пт мар 07, 2008 19:34:40

Если ассемблер ругается на какую то строку из 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

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

Вс мар 09, 2008 12:30:32

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

А можно примерчик? Мне нужно чтоб другие выводы не использовались

Вс мар 09, 2008 15:08:03

А примерно вот так:
Код:
        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:30:00, всего редактировалось 1 раз.

Пн мар 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

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

хочу подружить мегу64 и ммс карту 32метра (меньше не нашёл хотя устроила бы и 8метровая)
может у кого есть пример на асме т.к си пока не знаю
задача стоит такая на карте будут храниться граф образа в bin т.е мне не нужна файловая система флэшка будет использоваться как обычная мс памяти и ещё где можно найти схемку прогера чтобы прошить карту именно как мс памяти не кардридер

Вт мар 11, 2008 20:40:02

Артур писал(а):Спасибо огромное 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

Артур писал(а):Скажите пожалуйста а что нельзя чтоли просто скопировать бит одного РОН в Другой? ну например нулевой бит или третий? Спасибо!
просто взять и скопировать одной командой - нельзя.
для 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

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

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