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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

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

Сообщение СКАЗОЧНИК »

:) Может, только я это уже видел в какой-то статье и не могу понять как оно работает... :facepalm:
Поэтому сделал по тупому, просто по очереди переменные друг другу присваиваются... Не красиво, длинно, быдлокод, но работает.
Спойлер

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

                lds temp1, Capture1
      lds temp2, Capture2
      sts Capture1, temp2

      lds temp2, Capture3
      sts Capture2, temp2

      lds temp2, Capture4
      sts Capture3, temp2

      lds temp2, Capture5
      sts Capture4, temp2

      lds temp2, Capture6
      sts Capture5, temp2

      lds temp2, Capture7
      sts Capture6, temp2

      sts Capture7, temp1


Однако, все равно быстро получается. Теперь надо срастить две вещи. ШИМ программный, он работает даже очень хорошо. Переменные я меняю в главном цикле, но не постоянно, а когда произойдет 255*255 прерываний для ШИМа.

Спойлер

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

Start:

   cpi NEXT, 255    ; Эта переменная в прерывании инкрементируется.
   brne Start
   inc NEXT2
   cpi NEXT2, 255
   brne Start
        rcall NEW2      ; А это вызов подпрограммы, которая по кольцу меняет переменные (см. выше)

rjmp Start   ; Конец программы, переход на начало



Тоже быдлокодски, но работает, однако, стоит добавить еще хоть одну ступень, как все начинает жутко меделно пахать...

З.Ы. Ладно, с этим всем я разобрался.
Зато появился другой вопрос: с помощью команды rjmp могу я отправится прямо из главного цикла на метку RESET, с которой начинается инициализация МК ?

З.З.Ы. Все вопросы себя исчерпали. ))) Всем благодарю, со всем разобрался. :))) :)))
Станислав
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

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

Сообщение ILYAUL »

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

Start:

   cpi NEXT, 255    ; Эта переменная в прерывании инкрементируется.
   brne Start
   inc NEXT2
   cpse NEXT2, NEXT
   brne Start
   rcall NEW2      ; А это вызов подпрограммы, которая по кольцу меняет переменные (см. выше)

rjmp Start   ; Конец программы, переход на начало
Denkot
Встал на лапы
Сообщения: 82
Зарегистрирован: Вт дек 14, 2010 16:07:50

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

Сообщение Denkot »

напомните, пожалуйста, в двух словах
почему rjmp имеет ограниченный радиус действия, а rcall дотягивается с одного конца программы до другого...

обе команды же относительные?

но, когда я леплю rjmp - вылетает out of reach, а с rcall'ом этого не было... пока не было :)
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Значит подпрограммы по RCALL находятся внутри интервала -2K ≤ PC < 2K (K-килослово).
Последний раз редактировалось akl Вс мар 13, 2016 02:10:15, всего редактировалось 2 раза.
Denkot
Встал на лапы
Сообщения: 82
Зарегистрирован: Вт дек 14, 2010 16:07:50

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

Сообщение Denkot »

akl писал(а):Значит подпрограммы по RCALL находятся внутри интервала -2K ≤ PC < 2K (K-килослово).

вся прога ~700 байт

то есть получается, что у rcall радиус действия -2K ≤ PC < 2K
а у rjmp - много меньше?
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

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

Сообщение СКАЗОЧНИК »

Картинку смотрите... Они одинаковы, кроме стека (адреса возврата)... Это команды ветвления типа BRxx не могут улетать далеко, если память не изменяет, то -63....64 (строчек кода) диапазон.
Станислав
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

Ну только не строчек кода :)
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

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

Сообщение СКАЗОЧНИК »

:) Ну, я же говорю, что подзабыл, а лезть лениво. :oops: :beer:
Станислав
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15552
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

Denkot писал(а):вся прога ~700 байт

то есть получается, что у rcall радиус действия -2K ≤ PC < 2K
а у rjmp - много меньше?


Следовательно где-то ошибка.
По диапазону доступности адресного пространства rjmp=rcall (+\-2килослов).
На большинстве малых МК с ПЗУ до 4 килслов(8килобайт) этого вполне достаточно.
Вопрос в заявленной области ПЗУ и настройках компилятора.
Возможнр неверно заявлен *def.inc файл, или погрешность в разделе:
Спойлер; ***** DATA MEMORY DECLARATIONS *****************************************
.equ FLASHEND = 0x01ff ; Note: Word address
.equ IOEND = 0x003f
.equ SRAM_START = 0x0060
.equ SRAM_SIZE = 64
.equ RAMEND = 0x009f
.equ XRAMEND = 0x0000
.equ E2END = 0x003f
.equ EEPROMEND = 0x003f
.equ EEADRBITS = 6
#pragma AVRPART MEMORY PROG_FLASH 1024
#pragma AVRPART MEMORY EEPROM 64
#pragma AVRPART MEMORY INT_SRAM SIZE 64
#pragma AVRPART MEMORY INT_SRAM START_ADDR 0x60

(приведен из tn13def.inc)
Как вариант метки/точки входа/ у Ваших rcall в диапазоне заявленных адресов, а у rjmp за их пределами. Или метка назначения не выровнена по границам (указывает на нечетный адрес - ошибка при составлении таблиц).
8)
Denkot
Встал на лапы
Сообщения: 82
Зарегистрирован: Вт дек 14, 2010 16:07:50

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

Сообщение Denkot »

СКАЗОЧНИК писал(а):Картинку смотрите... Они одинаковы, кроме стека (адреса возврата)... Это команды ветвления типа BRxx не могут улетать далеко, если память не изменяет, то -63....64 (строчек кода) диапазон.


Точно. Разобрался - так и было.
Причина была не в rcall и не в rjmp.
Где-то между ними затесалась breq, нашел ее и все понял.
12val12
Потрогал лапой паяльник
Сообщения: 315
Зарегистрирован: Пт янв 29, 2010 19:42:27

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

Сообщение 12val12 »

Кто то сможет написать для at90s1200
по появлении перепада 0->1 на одном пине на другом пине

"0"->"1" - 50 мсек
"0"- 500мсек
"1" - 50 мсек
"0"- 500мсек
"1" - 50 мсек
"0"- 500мсек
"1" - 50 мсек
"0"- 500мсек
"1" - 50 мсек
"0"- 500мсек
"1" - 50 мсек
"0"- 500мсек

Пины произвольные но желательно чтобы не цепляли mosi miso sck
Хочу влепить в старый лсд телик что бы при включении переходил на vga вход
нужно именно для at90s1200
более новое для этой цели жалко
ух ты.... показывает
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Вот в первом приближении. Вход PD2/INT0, выход PB0. Частота кварца 4608кГц. Замечу, команда на PD2/INT0 должна приходить 0. Контроллер выходит из режима POWER-DOWN, отрабатывает временную диаграмму и опять засыпает в режиме минимального потребления.
TEST_1200.zip
12val12
Потрогал лапой паяльник
Сообщения: 315
Зарегистрирован: Пт янв 29, 2010 19:42:27

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

Сообщение 12val12 »

akl -Спасибо
немного не так работает
срабатывает по спаду "1"-->"0" а мне бы по фронту "0"-->"1"
и в конце бы на выходе чтобы был "0"
и еще на всяк Случай чтобы PORTB.1~=PORTB.0
Вложения
at90s1200.PNG
(61.39 КБ) 437 скачиваний
ух ты.... показывает
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Второе приближение
12val12
Потрогал лапой паяльник
Сообщения: 315
Зарегистрирован: Пт янв 29, 2010 19:42:27

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

Сообщение 12val12 »

Этот вариант никак не реагирует на вход
можно еще изменить

появляется питание контроллера
PORTB =0b00001111
ждем 9 сек

PORTB =0b11110000
ждем 200 ms //виртуальное нажатие кнопки sourse
PORTB =0b00001111

ждем 500 ms

PORTB =0b11110000
ждем 200 ms
PORTB =0b00001111

PORTB =0b11110000
ждем 200 ms
PORTB =0b00001111

ждем 500 ms

PORTB =0b11110000
ждем 200 ms
PORTB =0b00001111

ждем 500 ms

PORTB =0b11110000
ждем 200 ms
PORTB =0b00001111


порты оставляем в этом состоянии sleep
ух ты.... показывает
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

12val12 писал(а):Этот вариант никак не реагирует на вход
Третье, финишное приближение. Включил подтяжку на кнопку.
TEST_1200.zip

Проверил на макете с ATtiny2313 (установил указатель стека, установил вектор таймера)
Изображение
12val12
Потрогал лапой паяльник
Сообщения: 315
Зарегистрирован: Пт янв 29, 2010 19:42:27

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

Сообщение 12val12 »

третий вариант работает если в момент включения на входе была единица
потом был спад в ноль и потом "0" -->"1"
если же при включении на входе был 0 то потом при перепаде "0"--"1" не сработает
---------

Ваши программы невозможно редактировать
Можно проще програмку-появилось питание - через секунду на выходе "1" ?

с прогрммной задержкой-тройной вложенный цикл

появилось питание
программная задержка 1-10 сек (без call- т е в основном теле )
выдали на выход 1
ух ты.... показывает
12val12
Потрогал лапой паяльник
Сообщения: 315
Зарегистрирован: Пт янв 29, 2010 19:42:27

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

Сообщение 12val12 »

Хочу что-то примерно такое
это я еще могу читать
где должна располагаться подпрограмма?

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

;   
.INCLUDE "tn2313def.inc"
   .INCLUDE "1200def.inc"
   .equ   Fo=4608000
;   .equ   Fo=1024000
   .def   COUNTER=R20   
   .CSEG
.ORG   $0000
   RJMP   INIT ; Reset Handler
   RJMP EXT_INT0 ; IRQ0 Handler
;.ORG   $0006
.ORG   $0002
  CLI
;
  LDI   R24,0b11110000
  OUT   PORTB,R24
  LDI   R24,0b11111111  ;all PORTB  out
  OUT   DDRB,R24
; ----------
  ldi COUNTER,255
  rcall Delay
 ;----------
 LDI   R24,0b00001111
 OUT   PORTB,R24
 ; ----------
 ldi COUNTER,10
  rcall Delay
 ;----------
 LDI   R24,0b11110000
 OUT   PORTB,R24
 ; ----------
  ldi COUNTER,100
  rcall Delay
 ;----------
 LDI   R24,0b00001111
 OUT   PORTB,R24
 ; ----------
 ldi COUNTER,10
  rcall Delay
 ;----------
 LDI   R24,0b11110000
 OUT   PORTB,R24
 ; ----------
  ldi COUNTER,100
  rcall Delay
 ;----------
 LDI   R24,0b00001111
 OUT   PORTB,R24
 ; ----------
  ldi COUNTER,10
  rcall Delay
 ;----------
 LDI   R24,0b11110000
 OUT   PORTB,R24
 ; ----------
  ldi COUNTER,100
  rcall Delay
 ;----------
 LDI   R24,0b00001111
 OUT   PORTB,R24
 ; ----------

 
 
 
;----------
Delay:  ;    R20 = Counter <--- time
     DelayLoop1:
     ldi R21,255
       DelayLoop2:
        ldi R22,255
          DelayLoop3:
            dec R22
          nop
          nop
          nop
          nop
           brne DelayLoop3
        dec R21
        brne DelayLoop2
     dec R20
     brne DelayLoop1
 Ret
 
 

.EXIT


И еще как это компиллить?
avrasm2.exe -fI ??
Последний раз редактировалось 12val12 Ср мар 16, 2016 16:38:44, всего редактировалось 1 раз.
ух ты.... показывает
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Почему не используете средства языка? Ведь афффигеть можно nop'ы считать.
Спойлер

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

;.INCLUDE "tn2313def.inc"
   .INCLUDE "1200def.inc"
   .equ   Fo=4608000
;   .equ   Fo=1024000
   .def   COUNTER=R20   
   .CSEG
.ORG   $0000
   RJMP   INIT ; Reset Handler
   RJMP EXT_INT0 ; IRQ0 Handler
;.ORG   $0006
.ORG   $0002

  CLI
;
EXT_INT0:

INIT:


  LDI   R24,0b11110000
  OUT   PORTB,R24
  LDI   R24,0b11111111  ;all PORTB  out
  OUT   DDRB,R24
; ----------
;задержка 9000мс
D_9000:
   LDI   R20,BYTE3(9000*Fo/1000/5)
   LDI   R21,BYTE2(9000*Fo/1000/5)
   LDI   R22,BYTE1(9000*Fo/1000/5)
   RCALL   DELAY
;   RJMP   D_9000
;  ldi COUNTER,255
 ; rcall Delay
 ;----------
 LDI   R24,0b00001111
 OUT   PORTB,R24
 ; ----------
D_200:
   LDI   R20,BYTE3(200*Fo/1000/5)
   LDI   R21,BYTE2(200*Fo/1000/5)
   LDI   R22,BYTE1(200*Fo/1000/5)
   RCALL   DELAY
; ldi COUNTER,10
;  rcall Delay
 ;----------
 LDI   R24,0b11110000
 OUT   PORTB,R24
 ; ----------
;
;
;
;
;----------
DELAY:
   SUBI   R22,BYTE1(1)
   SBCI   R21,BYTE2(1)
   SBCI   R20,BYTE3(1)
   BRNE   DELAY
   RET


;Delay:  ;    R20 = Counter <--- time
;     DelayLoop1:
;     ldi R21,255
;       DelayLoop2:
;        ldi R22,255
;          DelayLoop3:
;            dec R22
;          nop
;          nop
;          nop
;          nop
;           brne DelayLoop3
;        dec R21
;        brne DelayLoop2
;     dec R20
;     brne DelayLoop1
; Ret
12val12
Потрогал лапой паяльник
Сообщения: 315
Зарегистрирован: Пт янв 29, 2010 19:42:27

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

Сообщение 12val12 »

ПОДСКАЖИТЕ чем компиллить?
разобрался
ух ты.... показывает
Ответить

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