Ассемблер (ASM) для AVR в вопросах и ответах
В наихудшем случае прибор будет измерять 1 секунду - какой смысл в более быстрых измерениях если он такой интервал терпит?
- Реклама
Возможна изначально перегруженная основная программа, в которую "встраивается" дополнительная функция. В такой ситуации переписывать все заново с перепланировкой аппаратных ресурсов и программных алгоритмов весьма непросто. Зато такая ситуация чем дальше, тем чаще встречаться будет... 
А разрешение и точность будут разные...Alexeyslav писал(а):В наихудшем случае прибор будет измерять 1 секунду - какой смысл в более быстрых измерениях если он такой интервал терпит?
Мяу, товарищи!
Помогите, пожалуйста, разобраться в непонятном вопросе.
Читаю в даташите на МК про регистры флагов прерываний следующие тезисы:
1) Изначально во всех флаговых битах прописаны нули;
2) Когда происходит вызов прерывания, то соответствующий флаг устанавливается в 1, и МК переходит к Соответствующему Вектору Прерывания;
3) Этот флаг очищается аппаратно после выхода из подпрограммы обработки прерывания (то есть возвращается в лог.0 ?! Верно?);
4) Этот Флаг, также, может быть очищен записью в него лог.1
Но у мя ни как не укладывается в голове:
- Почему флаги прерываний очищаются записью лог.1 (!!!), а не лог. 0 ???
- Ведь если программно установить флаг в лог 1, разве не должен быть автоматический переход к соответствующему вектору?
P.S. Среди смайликов нашего форума, явно не хватает анимации котика, бьющегося головой об стену, который точно описал бы мое эмоциональное состояние...
Помогите, пожалуйста, разобраться в непонятном вопросе.
Читаю в даташите на МК про регистры флагов прерываний следующие тезисы:
1) Изначально во всех флаговых битах прописаны нули;
2) Когда происходит вызов прерывания, то соответствующий флаг устанавливается в 1, и МК переходит к Соответствующему Вектору Прерывания;
3) Этот флаг очищается аппаратно после выхода из подпрограммы обработки прерывания (то есть возвращается в лог.0 ?! Верно?);
4) Этот Флаг, также, может быть очищен записью в него лог.1
Но у мя ни как не укладывается в голове:
- Почему флаги прерываний очищаются записью лог.1 (!!!), а не лог. 0 ???
- Ведь если программно установить флаг в лог 1, разве не должен быть автоматический переход к соответствующему вектору?
P.S. Среди смайликов нашего форума, явно не хватает анимации котика, бьющегося головой об стену, который точно описал бы мое эмоциональное состояние...
Решено делать как предлагалось выше на основе модуля capture. Но что то не получается...
По нарастающиму фронту сигнала на ICP (PINB0), происходит срабатывание прерывания (о чем можно судить по "прыжку" программы на метку TIM1_CAPT:). Но регистр ICR1 (ICR1H:ICR1L) остается пустым...
Что не так в коде инициализации прерываний?
Спойлер
Код: Выделить всё
.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
Что не так в коде инициализации прерываний?
Последний раз редактировалось xkp Пт ноя 21, 2014 20:56:48, всего редактировалось 1 раз.
R5VCH
Хотелки:
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Хотелки:
Спойлер
Аналоговый осциллограф С1-112, С1-118, другиене/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
- Реклама
Потому что это не обычный регистр из которого читается то, что туда было записано.Vicont писал(а):Но у мя ни как не укладывается в голове:
- Почему флаги прерываний очищаются записью лог.1 (!!!), а не лог. 0 ???![]()
- Ведь если программно установить флаг в лог 1, разве не должен быть автоматический переход к соответствующему вектору?
Запись обрабатывается специальным образом на чипе.
Переход по вектору зависит не от того, что ты записываешь в этот регистр, а от содержания соответствующего бита, реального бита. А оный сбросится при записи "1" - так особым образом обрабатывается запись этого бита.
Просто такая особенность.
Разработчики так захотели
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
ну так а как мне сделать то что я хочу? как прочитать этот регистр?
R5VCH
Хотелки:
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Хотелки:
Спойлер
Аналоговый осциллограф С1-112, С1-118, другиене/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Читается как обычно, с помощью команд IN или LDS .
А в чём загвоздка, собственно?
А в чём загвоздка, собственно?
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Спасибо. В даташитах таких подробностей не пишут.Kavka писал(а): Потому что это не обычный регистр из которого читается то, что туда было записано.
Запись обрабатывается специальным образом на чипе.
Разработчики так захотели
А можно ли флаговые биты как-нибудь установить программно, чтобы выполнения некой команды, произошел переход по вектору прерывания, без наступления соответствующего события?
Или же, из-за особенностей таких регистров, установка битов происходит ТОЛЬКО при наступления некого события?
P.S. Хотя... Если подумать, то тоже самое можно реализовать просто, непосредственно вызвав обработчик прерывания командой rcall, вообще не обращаясь к регистру флагов и векторам, как к посредникам...
наверное я не правильно вопрос задал. как читать то я знаю. но в регистре значение $0000. Как сделать что бы в регистр записывалось значение счетчика (наверное счетчика)?
R5VCH
Хотелки:
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Хотелки:
Спойлер
Аналоговый осциллограф С1-112, С1-118, другиене/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Читаете сначала ICR1L, потом ICR1H? Иначе результат непредсказуем.xkp писал(а):Но регистр ICR1 (ICR1H:ICR1L) остается пустым...
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Я пока их не читал. Запустил программу (ту что выше в спойлере) в эмуляторе АВРстудии. При наступлении прерывания регистр остается пустым.
R5VCH
Хотелки:
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Хотелки:
Спойлер
Аналоговый осциллограф С1-112, С1-118, другиене/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
xkp, еще я обратил внимание, что в Вашем исходном коде определен только 1 РОН - .def tmp=r16, хотя далее встречается некая переменная tmp0, которую без инициализации компилятор не переварит.
Последний раз редактировалось Vicont Пт ноя 21, 2014 20:58:57, всего редактировалось 1 раз.
исправил
.def tmp=r16
.def tmp0=r17
.cseg
случайно удалил вместе с коментариями в программе пока её сюда вам копировал))
Спойлер
.INCLUDE "m8DEF.INC".def tmp=r16
.def tmp0=r17
.cseg
R5VCH
Хотелки:
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Хотелки:
Спойлер
Аналоговый осциллограф С1-112, С1-118, другиене/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
А может попробовать прочитать.xkp писал(а):Я пока их не читал.
Симулятор вещь не надёжная.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Спойлер
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
Хотелки:
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Хотелки:
Спойлер
Аналоговый осциллограф С1-112, С1-118, другиене/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Привет всем! Опять я к вам со своими проблемами.
Есть задача: сделать схему на МК, где при старте сам МК выдавал бы на выход плавно растущую частоту (скважность 0.4, важно) начиная от 1 Гц до 300-500 Гц. Что-то вообще никаких мыслей нет, как это организовать. Железный ШИМ чётко привязан к ЗГ МК, софтовый... даже не знаю... Толкните плиз в нужную сторону.
Есть задача: сделать схему на МК, где при старте сам МК выдавал бы на выход плавно растущую частоту (скважность 0.4, важно) начиная от 1 Гц до 300-500 Гц. Что-то вообще никаких мыслей нет, как это организовать. Железный ШИМ чётко привязан к ЗГ МК, софтовый... даже не знаю... Толкните плиз в нужную сторону.
Прибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.
Для Seriyvolk
Смотря какой камень, в 16 меге, например, для этого подходят 14 и 15 режимы таймера1:
в 14 режиме для изменения частоты меняешь значение регистра ICR1, для изменения скважности меняешь OCR1A или OCR1B, можно использовать оба канала, но разрешение у обоих будет ICR1.
в 15 режиме для изменения частоты меняешь значение регистра OCR1A, для изменения скважности меняешь OCR1B, можно использовать только канал B.
Смотря какой камень, в 16 меге, например, для этого подходят 14 и 15 режимы таймера1:
в 14 режиме для изменения частоты меняешь значение регистра ICR1, для изменения скважности меняешь OCR1A или OCR1B, можно использовать оба канала, но разрешение у обоих будет ICR1.
в 15 режиме для изменения частоты меняешь значение регистра OCR1A, для изменения скважности меняешь OCR1B, можно использовать только канал B.
Да, забыл упомянуть... Хотелось бы обойтись 13-й тинькой. Но намёк я понял, спасибо!
Прибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.
В регистр ICR1 значение таймера1 заносится аппаратно (по умолчанию по спаду ICES1=0, при ICES1=1 по фронту) при изменении сигнала на входе ICP1(PB0). У Вас таймер не запущен, значит в регистр ICR1 будет заноситься состояние TCNT1=0. Попробуйте попереключать в студии PINB0(ICP1); должны увидеть занесение значения TCNT1 в ICR1 при переходе 0->1.xkp писал(а):Скорее в инициализации прерываний что то забыл написать.
Спойлер
Код: Выделить всё
.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По мне, слабенький таймер tiny13 с такой задачей не справится, т.к. диапазон роста частоты слишком широкий. Как предложение. Организовать цепочку из 5 регистров, чтобы можно было точно формировать требуемую скважность ( не стал менять т.к. скважность, по определению, не может быть меньше 1 и речь идёт о коэффициенте заполнения) и сдвигать по прерыванию таймера. Темп этого сдвига будет определяться значениями,заложенными в таймере. Примерно так как ниже.Seriyvolk писал(а):... сам МК выдавал бы на выход плавно растущую частоту (скважность 0.4, важно) начиная от 1 Гц до 300-500 Гц.
Спойлер
Код: Выделить всё
; Проба изменяемой в пределах 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
;*************************************************


