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

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

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

Сообщение xkp »

опять же повторюсь, по книжкам я даже в школе не умел учиться, хотя и был отличником по точным наукам. про INT0 я так и думал что по переднему фронту включить счетчик, по заднему - выключить и сохранить результат для дальнейшей обработки. просто может есть еще какой аппаратный способ подсчета длительности импульса.
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

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

Сообщение GP1 »

xkp писал(а):опять же повторюсь, по книжкам я даже в школе не умел учиться...

плохо... :facepalm:
можно еще по компаратору работать, он тоже во всех моделях есть.
но без книжек - никуда :tea:
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

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

Сообщение GP1 »

Alexeyslav писал(а):У этого метода есть недостаток... пока мы входим в прерывание и до фиксации значения ... таймер все еще считает. внося неконтролируемую погрешность.

при любой реализации будет некоторая аппаратная погрешность...
и с чего ты взял, что не контролируемая?
количество тактов от установки флага до входа в прерывание известно, посчитать сколько тактов уходит от начала прерывания до момента чтения счетчика, тоже не проблема
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

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

Так как ТС по книжкам даже в школе не умел учиться, пришлось даташит открывать мне. Там у таймеров нет модуля захвата. Работа с компаратором будет аналогична работе по внешнему прерыванию.
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

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

Сообщение GP1 »

ploop писал(а): Работа с компаратором будет аналогична работе по внешнему прерыванию.

само-собой
Чем дальше, тем больше становлюсь занудой...
Изображение
ut1wpr
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

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

Сообщение ut1wpr »

ploop писал(а):пришлось даташит открывать мне. Там у таймеров нет модуля захвата.
Подтверждаю! :)
С первой строчки доки запустил поиск слова capture. Через полсекунды получил ответ - нетути!
Не свосем понимаю, как люди принимаются решать поставленные задачи инструментом, свойств которого не знают, да еще и гордятся этим? Фраза насчет неумения учится по книжкам насквозь пропитана этой гордостью. Мол вот я каков, не читал, а делаю. Ведь нам сразу видно, кто читал, а кто гордится...
:)
С уважением,
Виктор.
Аватара пользователя
xkp
Опытный кот
Сообщения: 781
Зарегистрирован: Ср ноя 18, 2009 12:50:31
Откуда: ковров
Контактная информация:

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

Сообщение xkp »

я не говорил что не читал! я читал и читаю, книжек у меня 8гб. но по книжкам не могу я понять. там как то не так все написано. надо либо более подробно, либо очень кратко.

еще когда начинал изучать программирование 3 месяца искал команды на асме. в книжках они все расписаны на сотни страниц. и пока я не нашел вот это я не мог написать самой простой программы для мигания светодиодика.
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
ut1wpr
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

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

Сообщение ut1wpr »

xkp писал(а):я не говорил что не читал! я читал и читаю, книжек у меня 8гб. но по книжкам не могу я понять. там как то не так все написано. надо либо более подробно, либо очень кратко.

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

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

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

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

Сообщение xkp »

это был пример...
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Аватара пользователя
xkp
Опытный кот
Сообщения: 781
Зарегистрирован: Ср ноя 18, 2009 12:50:31
Откуда: ковров
Контактная информация:

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

Сообщение 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
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

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

Сообщение ILYAUL »

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

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

Сообщение xkp »

А вы попробуйте сами, остановив генерацию сбросить пин! Cbi pin(port, ddr)b не помогает, через clr tmp / out pin(port, ddr)b аналогично. Pinb остается установленным.
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

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

Сообщение Alexeyslav »

И все же, время от возникновения прерывания до начала исполнения кода обработчика прерывания можно контролировать только в одном случае - если оно единственное в программе и в основном коде не используются участки кода с запретом прерываний. Представь контроллер обрабатывает другое прерывание и в этот момент поступил сигнал нашего прерывания - он будет обработан только после того как закончится обработка текущего прерывания или в коде не встретится команда разрешения прерываний.

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


Генерацию надо останавливать ОСТАНОВКОЙ ТАЙМЕРА, и потом только гасить пин. И кстати в режиме когда пин принадлежит таймеру, на него не действуют регистры порта, поэтому сбрасывать его надо либо манипуляцией с таймером, либо перевести таймер в другой режим и уже после этого гасить порт стандартным методом.
Аватара пользователя
xkp
Опытный кот
Сообщения: 781
Зарегистрирован: Ср ноя 18, 2009 12:50:31
Откуда: ковров
Контактная информация:

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

Сообщение xkp »

Ну так а остановить то как его? Cli не помогает.
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

А вы попробуйте сами, остановив генерацию сбросить пин!

Пробовали, и что?
Остановив генерацию, пины остаются подключены к таймеру. Никто не давал команды их отключить.
спящий
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

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

Сообщение спящий »

Подскажите почему нет прерывание?(нужно прерывание при сравнение)


.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
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

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

Сообщение ILYAUL »

Вы его выключили
спящий
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

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

Сообщение спящий »

Исправил,но всеравно нет прерываний


.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
спящий
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

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

Сообщение спящий »

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

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

Сообщение 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. и огонек стоит на месте.... :(
Пожалуйста, помогите разобраться в чем дело.
Ответить

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