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

Обсуждаем контроллеры компании Atmel.
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

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

Сообщение Alexeyslav »

В наихудшем случае прибор будет измерять 1 секунду - какой смысл в более быстрых измерениях если он такой интервал терпит?
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15551
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

Возможна изначально перегруженная основная программа, в которую "встраивается" дополнительная функция. В такой ситуации переписывать все заново с перепланировкой аппаратных ресурсов и программных алгоритмов весьма непросто. Зато такая ситуация чем дальше, тем чаще встречаться будет... 8)
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25155
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

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

Сообщение КРАМ »

Alexeyslav писал(а):В наихудшем случае прибор будет измерять 1 секунду - какой смысл в более быстрых измерениях если он такой интервал терпит?

А разрешение и точность будут разные... :)))
Аватара пользователя
Vicont
Прорезались зубы
Сообщения: 201
Зарегистрирован: Пт июл 25, 2008 14:09:04
Откуда: Зауралье
Контактная информация:

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

Сообщение Vicont »

Мяу, товарищи!
Помогите, пожалуйста, разобраться в непонятном вопросе.

Читаю в даташите на МК про регистры флагов прерываний следующие тезисы:
1) Изначально во всех флаговых битах прописаны нули;
2) Когда происходит вызов прерывания, то соответствующий флаг устанавливается в 1, и МК переходит к Соответствующему Вектору Прерывания;
3) Этот флаг очищается аппаратно после выхода из подпрограммы обработки прерывания (то есть возвращается в лог.0 ?! Верно?);
4) Этот Флаг, также, может быть очищен записью в него лог.1

Но у мя ни как не укладывается в голове:
- Почему флаги прерываний очищаются записью лог.1 (!!!), а не лог. 0 ??? :o
- Ведь если программно установить флаг в лог 1, разве не должен быть автоматический переход к соответствующему вектору? :dont_know:

P.S. Среди смайликов нашего форума, явно не хватает анимации котика, бьющегося головой об стену, который точно описал бы мое эмоциональное состояние...
Аватара пользователя
xkp
Опытный кот
Сообщения: 781
Зарегистрирован: Ср ноя 18, 2009 12:50:31
Откуда: ковров
Контактная информация:

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

Сообщение xkp »

Решено делать как предлагалось выше на основе модуля capture. Но что то не получается...
Спойлер

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

.INCLUDE "m8DEF.INC"
.def tmp=r16
.def tmp0=r17
.cseg
;INTERRUPT VECTORS
   rjmp reset            ; Reset Handler
   reti;   rjmp EXT_INT0          ; IRQ0 Handler
   reti               ;   rjmp EXT_INT1 ; IRQ1 Handler
   reti               ;rjmp TIM2_COMP ; Timer2 Compare Handler
   reti               ;rjmp TIM2_OVF ; Timer2 Overflow Handler
   rjmp TIM1_CAPT            ;Timer1 Capture Handler
   reti               ;rjmp TIM1_COMPA ; Timer1 CompareA Handler
   reti               ;rjmp TIM1_COMPB ; Timer1 CompareB Handler
   reti               ;rjmp TIMPINC 4 191_OVF   ;Timer1 Overflow Handler
reti;   rjmp look            ;tim0_ovf ; Timer0 Overflow Handler
   reti               ;rjmp SPI_STC ; SPI Transfer Complete Handler
   reti               ;rjmp USART_RXC ; USART RX Complete Handler
   reti               ;rjmp USART_UDRE ; UDR Empty Handler
   reti               ;rjmp USART_TXC ; USART TX Complete Handler
   reti               ;rjmp ADC_inc ; ADC Conversion Complete Handler
   reti               ;rjmp EE_RDY ; EEPROM Ready Handler
   reti               ;rjmp ANA_COMP ; Analog Comparator Handler
   reti               ;rjmp TWSI ; Two-wire Serial Interface Handler
   reti               ;rjmp SPM_RDY ; Store Program Memory Ready Handler
RESET:
   ldi tmp,low(RAMEND)
   out spl,tmp
   ldi tmp,high(RAMEND)
   out sph,tmp

   ldi tmp,(1<<ticie1)
   out timsk,tmp
   ldi tmp,(0<<icnc1)|(1<<ices1)
   out tccr1b,tmp

   ldi tmp,0b00000000
   out ddrb,tmp
   ldi tmp,0b00000000
   out portb,tmp
   sei
main:
   rjmp main

TIM1_CAPT:
   push tmp         ;сохраняем данные
   push tmp0         ;которые можем потерять
   in tmp,sreg         ;tmp, tmp0,
   push tmp         ;sreg



   pop tmp            ;восстанавливаем ранее
   out sreg,tmp      ;сохранённые данные
   pop tmp0         ;в обратном порядке
   pop tmp            ;sreg,tmp,tmp0
   reti
.exit

По нарастающиму фронту сигнала на ICP (PINB0), происходит срабатывание прерывания (о чем можно судить по "прыжку" программы на метку TIM1_CAPT:). Но регистр ICR1 (ICR1H:ICR1L) остается пустым...
Что не так в коде инициализации прерываний?
Последний раз редактировалось xkp Пт ноя 21, 2014 20:56:48, всего редактировалось 1 раз.
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

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

Сообщение Kavka »

Vicont писал(а):Но у мя ни как не укладывается в голове:
- Почему флаги прерываний очищаются записью лог.1 (!!!), а не лог. 0 ??? :o
- Ведь если программно установить флаг в лог 1, разве не должен быть автоматический переход к соответствующему вектору?
Потому что это не обычный регистр из которого читается то, что туда было записано.
Запись обрабатывается специальным образом на чипе.
Переход по вектору зависит не от того, что ты записываешь в этот регистр, а от содержания соответствующего бита, реального бита. А оный сбросится при записи "1" - так особым образом обрабатывается запись этого бита.
Просто такая особенность.
Разработчики так захотели :)
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Аватара пользователя
xkp
Опытный кот
Сообщения: 781
Зарегистрирован: Ср ноя 18, 2009 12:50:31
Откуда: ковров
Контактная информация:

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

Сообщение xkp »

ну так а как мне сделать то что я хочу? как прочитать этот регистр?
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

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

Сообщение Kavka »

Читается как обычно, с помощью команд IN или LDS .
А в чём загвоздка, собственно?
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Аватара пользователя
Vicont
Прорезались зубы
Сообщения: 201
Зарегистрирован: Пт июл 25, 2008 14:09:04
Откуда: Зауралье
Контактная информация:

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

Сообщение Vicont »

Kavka писал(а):Потому что это не обычный регистр из которого читается то, что туда было записано.
Запись обрабатывается специальным образом на чипе.
Разработчики так захотели :)

Спасибо. В даташитах таких подробностей не пишут. :)

А можно ли флаговые биты как-нибудь установить программно, чтобы выполнения некой команды, произошел переход по вектору прерывания, без наступления соответствующего события?
Или же, из-за особенностей таких регистров, установка битов происходит ТОЛЬКО при наступления некого события? :roll:

P.S. Хотя... Если подумать, то тоже самое можно реализовать просто, непосредственно вызвав обработчик прерывания командой rcall, вообще не обращаясь к регистру флагов и векторам, как к посредникам... :roll:
Аватара пользователя
xkp
Опытный кот
Сообщения: 781
Зарегистрирован: Ср ноя 18, 2009 12:50:31
Откуда: ковров
Контактная информация:

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

Сообщение xkp »

наверное я не правильно вопрос задал. как читать то я знаю. но в регистре значение $0000. Как сделать что бы в регистр записывалось значение счетчика (наверное счетчика)?
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

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

Сообщение Kavka »

xkp писал(а):Но регистр ICR1 (ICR1H:ICR1L) остается пустым...
Читаете сначала ICR1L, потом ICR1H? Иначе результат непредсказуем.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Аватара пользователя
xkp
Опытный кот
Сообщения: 781
Зарегистрирован: Ср ноя 18, 2009 12:50:31
Откуда: ковров
Контактная информация:

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

Сообщение xkp »

Я пока их не читал. Запустил программу (ту что выше в спойлере) в эмуляторе АВРстудии. При наступлении прерывания регистр остается пустым.
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Аватара пользователя
Vicont
Прорезались зубы
Сообщения: 201
Зарегистрирован: Пт июл 25, 2008 14:09:04
Откуда: Зауралье
Контактная информация:

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

Сообщение Vicont »

xkp, еще я обратил внимание, что в Вашем исходном коде определен только 1 РОН - .def tmp=r16, хотя далее встречается некая переменная tmp0, которую без инициализации компилятор не переварит.
Последний раз редактировалось Vicont Пт ноя 21, 2014 20:58:57, всего редактировалось 1 раз.
Аватара пользователя
xkp
Опытный кот
Сообщения: 781
Зарегистрирован: Ср ноя 18, 2009 12:50:31
Откуда: ковров
Контактная информация:

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

Сообщение xkp »

исправил
Спойлер.INCLUDE "m8DEF.INC"
.def tmp=r16
.def tmp0=r17
.cseg

случайно удалил вместе с коментариями в программе пока её сюда вам копировал))
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

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

Сообщение Kavka »

xkp писал(а):Я пока их не читал.
А может попробовать прочитать.
Симулятор вещь не надёжная. :)
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Аватара пользователя
xkp
Опытный кот
Сообщения: 781
Зарегистрирован: Ср ноя 18, 2009 12:50:31
Откуда: ковров
Контактная информация:

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

Сообщение xkp »

СпойлерTIM1_CAPT:
push tmp ;сохраняем данные
push tmp0 ;которые можем потерять
in tmp,sreg ;tmp, tmp0,
push tmp ;sreg
in tmp,icr1l
in tmp0,icr1h


pop tmp ;восстанавливаем ранее
out sreg,tmp ;сохранённые данные
pop tmp0 ;в обратном порядке
pop tmp ;sreg,tmp,tmp0
reti

думаю проблема не в том что я их не читаю... Скорее в инициализации прерываний что то забыл написать.
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Аватара пользователя
Seriyvolk
Друг Кота
Сообщения: 4961
Зарегистрирован: Сб май 05, 2012 20:19:55
Откуда: Минск

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

Сообщение Seriyvolk »

Привет всем! Опять я к вам со своими проблемами. :))
Есть задача: сделать схему на МК, где при старте сам МК выдавал бы на выход плавно растущую частоту (скважность 0.4, важно) начиная от 1 Гц до 300-500 Гц. Что-то вообще никаких мыслей нет, как это организовать. Железный ШИМ чётко привязан к ЗГ МК, софтовый... даже не знаю... Толкните плиз в нужную сторону. :)
Прибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

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

Сообщение zero648 »

Для Seriyvolk
Смотря какой камень, в 16 меге, например, для этого подходят 14 и 15 режимы таймера1:
в 14 режиме для изменения частоты меняешь значение регистра ICR1, для изменения скважности меняешь OCR1A или OCR1B, можно использовать оба канала, но разрешение у обоих будет ICR1.
в 15 режиме для изменения частоты меняешь значение регистра OCR1A, для изменения скважности меняешь OCR1B, можно использовать только канал B.
Аватара пользователя
Seriyvolk
Друг Кота
Сообщения: 4961
Зарегистрирован: Сб май 05, 2012 20:19:55
Откуда: Минск

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

Сообщение Seriyvolk »

Да, забыл упомянуть... Хотелось бы обойтись 13-й тинькой. Но намёк я понял, спасибо!
Прибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

xkp писал(а):Скорее в инициализации прерываний что то забыл написать.
В регистр ICR1 значение таймера1 заносится аппаратно (по умолчанию по спаду ICES1=0, при ICES1=1 по фронту) при изменении сигнала на входе ICP1(PB0). У Вас таймер не запущен, значит в регистр ICR1 будет заноситься состояние TCNT1=0. Попробуйте попереключать в студии PINB0(ICP1); должны увидеть занесение значения TCNT1 в ICR1 при переходе 0->1.
Спойлер

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

.INCLUDE "m8DEF.INC"
.def tmp=r16
.def tmp0=r17
.cseg
;INTERRUPT VECTORS
   rjmp reset            ; Reset Handler
   reti;   rjmp EXT_INT0          ; IRQ0 Handler
   reti               ;   rjmp EXT_INT1 ; IRQ1 Handler
   reti               ;rjmp TIM2_COMP ; Timer2 Compare Handler
   reti               ;rjmp TIM2_OVF ; Timer2 Overflow Handler
   IN   XL,ICR1L   ;Timer1 Capture Handler
   IN   XH,ICR1H
;   rjmp TIM1_CAPT;Timer1 Capture Handler
   reti               ;rjmp TIM1_COMPA ; Timer1 CompareA Handler
;   reti               ;rjmp TIM1_COMPB ; Timer1 CompareB Handler
;   reti               ;rjmp TIMPINC 4 191_OVF   ;Timer1 Overflow Handler
;reti;   rjmp look            ;tim0_ovf ; Timer0 Overflow Handler
;   reti               ;rjmp SPI_STC ; SPI Transfer Complete Handler
;   reti               ;rjmp USART_RXC ; USART RX Complete Handler
;   reti               ;rjmp USART_UDRE ; UDR Empty Handler
;   reti               ;rjmp USART_TXC ; USART TX Complete Handler
;   reti               ;rjmp ADC_inc ; ADC Conversion Complete Handler
;   reti               ;rjmp EE_RDY ; EEPROM Ready Handler
;   reti               ;rjmp ANA_COMP ; Analog Comparator Handler
;   reti               ;rjmp TWSI ; Two-wire Serial Interface Handler
;   reti               ;rjmp SPM_RDY ; Store Program Memory Ready Handler
RESET:
   ldi tmp,low(RAMEND)
   out spl,tmp
   ldi tmp,high(RAMEND)
   out sph,tmp

   ldi tmp,0b00000000
   out ddrb,tmp
   ldi tmp,0b00000001
   out portb,tmp

   ldi tmp,(1<<ticie1)
   out timsk,tmp

   OUT   TIFR,tmp

;   ldi tmp,(0<<icnc1)|(1<<ices1)
 ;  out tccr1b,tmp


   LDI   R22,(1<<ices1|1<<cs10)
   OUT   TCCR1B,R22

   sei
main:
   rjmp main

;TIM1_CAPT:
;   push tmp         ;сохраняем данные
;   push tmp0         ;которые можем потерять
;   in tmp,sreg         ;tmp, tmp0,
;   push tmp         ;sreg



;   pop tmp            ;восстанавливаем ранее
;   out sreg,tmp      ;сохранённые данные
;   pop tmp0         ;в обратном порядке
;   pop tmp            ;sreg,tmp,tmp0
;   reti
.exit


Seriyvolk писал(а):... сам МК выдавал бы на выход плавно растущую частоту (скважность 0.4, важно) начиная от 1 Гц до 300-500 Гц.
По мне, слабенький таймер tiny13 с такой задачей не справится, т.к. диапазон роста частоты слишком широкий. Как предложение. Организовать цепочку из 5 регистров, чтобы можно было точно формировать требуемую скважность ( не стал менять т.к. скважность, по определению, не может быть меньше 1 и речь идёт о коэффициенте заполнения) и сдвигать по прерыванию таймера. Темп этого сдвига будет определяться значениями,заложенными в таймере. Примерно так как ниже.
Спойлер

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

; Проба изменяемой в пределах 1...300 Гц частоты Fout
.include "tn13def.inc"; используемое устройство

.equ   Fo=9600000

.equ   Fout=1
;.equ   Fout=300

.equ   Tout=Fo/40/Fout   ; длительность периода сдвига R0...R4
; длительность 1/40 периода придется рассчитываь или сводить в таблицу!!!!!!!!
   .CSEG
   .ORG   0
   RJMP   START
   .ORG   $03
OVER_T0:
   SBIW   YL,1
   BRPL   OUT_RETI
SET_Tout:
   LDI   YH,BYTE3(Tout)
   LDI   YL,BYTE2(Tout)
   LDI   R16,BYTE1(256-low(Tout)-1)
   OUT   TCNT0,R16

   OUT   TIMSK0,R17
   OUT   TIFR0,R17

   SET
   RET
OUT_RETI:
   RETI
;*************************************************
START:
   CLR   R0
   CLR   R1
   CLR   R2
   LDI   R16,$FF
   MOV   R3,R16
   MOV   R4,R16

   SBI   PORTB,1
   SBI   DDRB,1
   
   LDI   R22,$80
   OUT   ACSR,R22   ; выключить аналоговый компаратор
;*************************************************
GO:
; настройка таймера
   LDI   ZH,40

   LDI   R17,$02
   RCALL   SET_Tout
   CLT
;*************************************************
   LDI   R22,$20
   OUT   MCUCR,R22   ; разрешение режима SLEEP IDLE

   LDI   R22,1
   OUT   TCCR0B,R22
;*************************************************
   SEI
WAIT:
   SLEEP
   BRTC   WAIT
   CLT

GO_TIME:
   IN   R16,PORTB

   CLC
   SBRC   R4,0
   SEC

   ROR   R0   
   ROR   R1   
   ROR   R2   
   ROR   R3   
   ROR   R4
   
   CBR      R16,$02
   BRCC   PC+2
   SBR      R16,$02
   OUT      PORTB,R16

   DEC   ZH
   BRNE   WAIT-1
;вычисление периода следующей частоты
SET_PERIOD:
;***
;***
;***
;***
   RJMP   GO
;*************************************************
Ответить

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