Страница 154 из 400

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

Добавлено: Чт сен 06, 2012 07:24:46
xkp
опять же повторюсь, по книжкам я даже в школе не умел учиться, хотя и был отличником по точным наукам. про INT0 я так и думал что по переднему фронту включить счетчик, по заднему - выключить и сохранить результат для дальнейшей обработки. просто может есть еще какой аппаратный способ подсчета длительности импульса.

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

Добавлено: Чт сен 06, 2012 07:28:29
GP1
xkp писал(а):опять же повторюсь, по книжкам я даже в школе не умел учиться...
плохо... :facepalm:
можно еще по компаратору работать, он тоже во всех моделях есть.
но без книжек - никуда :tea:

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

Добавлено: Чт сен 06, 2012 07:30:36
GP1
Alexeyslav писал(а):У этого метода есть недостаток... пока мы входим в прерывание и до фиксации значения ... таймер все еще считает. внося неконтролируемую погрешность.
при любой реализации будет некоторая аппаратная погрешность...
и с чего ты взял, что не контролируемая?
количество тактов от установки флага до входа в прерывание известно, посчитать сколько тактов уходит от начала прерывания до момента чтения счетчика, тоже не проблема

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

Добавлено: Чт сен 06, 2012 07:41:59
ploop
можно еще по компаратору работать, он тоже во всех моделях есть.
Так как ТС по книжкам даже в школе не умел учиться, пришлось даташит открывать мне. Там у таймеров нет модуля захвата. Работа с компаратором будет аналогична работе по внешнему прерыванию.

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

Добавлено: Чт сен 06, 2012 07:50:33
GP1
ploop писал(а): Работа с компаратором будет аналогична работе по внешнему прерыванию.
само-собой

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

Добавлено: Чт сен 06, 2012 08:40:30
ut1wpr
ploop писал(а):пришлось даташит открывать мне. Там у таймеров нет модуля захвата.
Подтверждаю! :)
С первой строчки доки запустил поиск слова capture. Через полсекунды получил ответ - нетути!
Не свосем понимаю, как люди принимаются решать поставленные задачи инструментом, свойств которого не знают, да еще и гордятся этим? Фраза насчет неумения учится по книжкам насквозь пропитана этой гордостью. Мол вот я каков, не читал, а делаю. Ведь нам сразу видно, кто читал, а кто гордится...
:)

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

Добавлено: Чт сен 06, 2012 09:39:10
xkp
я не говорил что не читал! я читал и читаю, книжек у меня 8гб. но по книжкам не могу я понять. там как то не так все написано. надо либо более подробно, либо очень кратко.

еще когда начинал изучать программирование 3 месяца искал команды на асме. в книжках они все расписаны на сотни страниц. и пока я не нашел вот это я не мог написать самой простой программы для мигания светодиодика.

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

Добавлено: Чт сен 06, 2012 11:07:39
ut1wpr
xkp писал(а):я не говорил что не читал! я читал и читаю, книжек у меня 8гб. но по книжкам не могу я понять. там как то не так все написано. надо либо более подробно, либо очень кратко.

еще когда начинал изучать программирование 3 месяца искал команды на асме. в книжках они все расписаны на сотни страниц. и пока я не нашел вот это я не мог написать самой простой программы для мигания светодиодика.
1. Ценность библиотеки не измеряется ее суммарным объемом.
2. Я не затрагивал темы программирования. Лишь коснулся описания МК, который вы применяете. И именно эту доку и имел ввиду. Считаю, что для грамотного применения того или иного типа МК надо знать, что он умеет и может. А эти сведения по крупицам на форуме не соберете.

Да ладно, чего это я.
Удачи вам и успехов!

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

Добавлено: Чт сен 06, 2012 11:10:58
xkp
это был пример...

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

Добавлено: Чт сен 06, 2012 19:15:14
xkp
вернемся к генератору импульсов. задал необходимую длительность импульсов, выдал необходимое количество импульсов. как выключить генерирование импульсов и очистить PINB PORTB?
пробовал разное но флаги TIFR0 не сбрасываются, либо устанавливаются обратно и генерирование продолжается.
ставил OUTI tccr0a,(0<<com0a1)|(0<<COM0A0) генерирование останавливается но PINB не сбрасывается.

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

.INCLUDE "tn13DEF.INC"
.list

.def tmp=r16
.def tmp0=r17
.def cnt=r19

.DSEG
clok:	.byte 1

.cseg
.org $0a

RESET:
	ldi tmp,low(RAMEND)
	out spl,tmp


.macro OUTI
	LDI   R16,@1
	OUT   @0,R16
	.endm
.macro OUTF
	LDs   R16,@1
	OUT   @0,R16
	.endm
.macro INF
	ldi   R16,@1
	sts   @0,R16
	.endm

	OUTI   tccr0a,(0<<com0a1)|(1<<COM0A0)|(0<<com0b1)|(0<<COM0b0)|(1<<wgm01)|(0<<wgm00);НАСТРОЙКА ШИМ
	ldi tmp,low(RAMEND)
	out spl,tmp

	ldi tmp,$01	;преддилитель 64
	out tccr0b,tmp

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

main:
/* процедура задания значений частоты*/
inf clok,$04	;для проверки

;вывод трех импульсов
	outi tccr0b,$01
	lds tmp0,clok
	cpi tmp0,$80
	brlo metka
	outi tccr0b,$02
	subi tmp0,$80
metka:
	out ocr0a,tmp0

ldi tmp,2
metka2:
	sbis pinb,0
	rjmp metka2
metka3:
	sbic pinb,0
	rjmp metka3

	subi tmp,1
	brcc metka2

; ТУТ НАДО ОТКЛЮЧИТЬ ГЕНЕРАЦИЮ И СБРОСИТЬ PINB PORTB

main_2:
rjmp main_2
;		Address Labels Code Comments
.org $00
rjmp RESET ; Reset Handler
	reti	;rjmp EXT_INT0 ; IRQ0 Handler
	reti	;rjmp PCINT0 ; PCINT0 Handler
	reti	;rjmp TIM0_OVF ; Timer0 Overflow Handler
	reti	;rjmp EE_RDY ; EEPROM Ready Handler
	reti	;rjmp ANA_COMP ; Analog Comparator Handler
	reti	;rjmp TIM0_COMPA ; Timer0 CompareA Handler
	reti	;rjmp TIM0_COMPB ; Timer0 CompareB Handler
	reti	;rjmp WATCHDOG ; Watchdog Interrupt Handler
	reti	;rjmp ADC_inc ; ADC Conversion Handler

.exit

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

Добавлено: Чт сен 06, 2012 19:32:50
ILYAUL
В любой из Ваших книжек , есть чёткое упоминание о том как останавливать и запускать генерацию.
А уж как сбрасывать порт - даже не прилично спрашивать.

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

Добавлено: Чт сен 06, 2012 20:21:06
xkp
А вы попробуйте сами, остановив генерацию сбросить пин! Cbi pin(port, ddr)b не помогает, через clr tmp / out pin(port, ddr)b аналогично. Pinb остается установленным.

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

Добавлено: Чт сен 06, 2012 20:26:57
Alexeyslav
И все же, время от возникновения прерывания до начала исполнения кода обработчика прерывания можно контролировать только в одном случае - если оно единственное в программе и в основном коде не используются участки кода с запретом прерываний. Представь контроллер обрабатывает другое прерывание и в этот момент поступил сигнал нашего прерывания - он будет обработан только после того как закончится обработка текущего прерывания или в коде не встретится команда разрешения прерываний.

Аппаратное стробирование входа таймера решает все эти проблемы на корню. Как только сигнал будет убран, таймер остановится независимо от того начался выполнятся код обработчика или нет. И не надо мучить голову по поводу подсчета задержек. А они, кстати, будут не менее 8-ми тактов + такты на сохранение контекста. За это время, чего хорошего, таймер может и переполнится если его не остановить.


Генерацию надо останавливать ОСТАНОВКОЙ ТАЙМЕРА, и потом только гасить пин. И кстати в режиме когда пин принадлежит таймеру, на него не действуют регистры порта, поэтому сбрасывать его надо либо манипуляцией с таймером, либо перевести таймер в другой режим и уже после этого гасить порт стандартным методом.

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

Добавлено: Чт сен 06, 2012 20:44:03
xkp
Ну так а остановить то как его? Cli не помогает.

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

Добавлено: Чт сен 06, 2012 20:49:36
ploop
А вы попробуйте сами, остановив генерацию сбросить пин!
Пробовали, и что?
Остановив генерацию, пины остаются подключены к таймеру. Никто не давал команды их отключить.

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

Добавлено: Вс сен 09, 2012 01:28:46
спящий
Подскажите почему нет прерывание?(нужно прерывание при сравнение)


.include "C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\m48def.inc"
.list
.nolist
.list



;
.def temp =r16;
.def delay =r17;
.def delay1 =r18;


.equ XTAL = 8000000
.equ baudrate = 9600
.equ bauddivider = XTAL/(16*baudrate)-1


.org 0x000
rjmp init;

.org 0x000B
rjmp perepoln; совпадение CTC


rjmp init;

init:

ldi r16,high(RAMEND) ;
out SPH,r16 ;
ldi r16,low(RAMEND) ;
out SPL,r16 ;



Ldi temp,(0<<com1a1)|(0<<com1a0);отрубаем вывод
sts TCCR1A,temp;

Ldi temp,(1<<CS11)|(1<<WGM12);делитель 8,режим CTC
sts TCCR1B,temp;

Ldi temp,(0<<OCIE1A);прерыание при сравнении TNT и OCRA
sts TCCR1A,temp;

ldi temp,25;
sts OCR1Ah,temp;
ldi temp,205;
sts OCR1Al,temp;

sei;
start:
nop;
rjmp start;


perepoln:


nop;
reti

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

Добавлено: Вс сен 09, 2012 09:29:23
ILYAUL
Вы его выключили

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

Добавлено: Вс сен 09, 2012 09:40:37
спящий
Исправил,но всеравно нет прерываний


.include "C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\m48def.inc"
.list
.nolist
.list



;
.def temp =r16;
.def delay =r17;
.def delay1 =r18;


.equ XTAL = 8000000
.equ baudrate = 9600
.equ bauddivider = XTAL/(16*baudrate)-1


.org 0x000
rjmp init;

.org 0x000B
rjmp perepoln; совпадение CTC


rjmp init;

init:

ldi r16,high(RAMEND) ;
out SPH,r16 ;
ldi r16,low(RAMEND) ;
out SPL,r16 ;



Ldi temp,(0<<com1a1)|(0<<com1a0);отрубаем вывод
sts TCCR1A,temp;

Ldi temp,(1<<CS11)|(1<<WGM12);делитель 8,режим CTC
sts TCCR1B,temp;

Ldi temp,(1<<OCIE1A);прерыание при сравнении TNT и OCRA
sts TCCR1A,temp;

ldi temp,25;
sts OCR1Ah,temp;
ldi temp,205;
sts OCR1Al,temp;

sei;
start:
nop;
rjmp start;


perepoln:


nop;
reti

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

Добавлено: Вс сен 09, 2012 12:17:03
спящий
блин ну я косячник :)) ) Заместо
sts TIMSK1,temp;
написал
sts TCCR1A,temp;
20 раз проверил) и был уверен что правильно)) :)))

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

Добавлено: Вс сен 09, 2012 13:40:06
Vicont
Я тренируюсь управлять внешними прерываниями ATTiny2313. За основу проекта взял схему из обучалки, где 8 светодиодов подключены порту Б, и присоединил 2 кнопки к выводам INT0 и INT1. Задача при нажатии одной из кнопок светодиод должен сдвигаться влево/вправо
Спойлер

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

RESET:
      ldi Temp,RamEnd	;инициализация стека
      out SPL,Temp

      ldi   Temp,0b11111111  ; Настройка порта B на вывод
      out   DDRB,Temp

      ldi   Temp,0b10000000  ; Разрешение внешних прерывний 
      out   SREG,Temp

      ldi   Temp,0b11000000  ; Разрешить прерывания через INT1 и INT0
      out   GIMSK,Temp

      ldi   Temp,0b00001010  ; прерывания INT1 и INT0 по спаду
      out   MCUCR,Temp

sei ;глобальное разрешение прерываний 



      ldi  Temp,0b00000001
      out  PortB,Temp

;------ Основной цикл программы -------
MAIN:
nop
rjmp MAIN
;---------------------------

;******* Обработчик внешних прерываний *******
EXT_INT0:
         cpi Temp,0b10000000  ;сравнить Temp с крайним значением
         breq Right           ;если равно - включаем крайний правый светодиод
         lsl Temp             ;иначе - сдвиг влево
         out PortB,Temp       ;вывод на ндикацию
reti                          ;возвращение в бесконечный цикл

Right:   ldi  Temp,0b00000001 ;включаем крайний правый светодиод
         out  PortB,Temp
rjmp MAIN



EXT_INT1:
         cpi Temp,0b00000001  ;сравнить Temp с крайним значением
         breq Left            ;если равно - включаем крайний левый светодиод
         lsr Temp             ;иначе - сдвиг вправо
         out PortB,Temp       ;вывод на ндикацию
reti                          ;возвращение в бесконечный цикл

Left:    ldi  Temp,0b10000000 ;включаем крайний левый светодиод
         out  PortB,Temp
rjmp MAIN      
В результате получилось так, что когда светодиод сдвигается в самый край, срабатывает равенство breq и загорается светодиод на противоположенном конце, то программа входит в бесконечный цикл и перестает вообще реагировать на любые прерывания, даже на Reset. и огонек стоит на месте.... :(
Пожалуйста, помогите разобраться в чем дело.