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

- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Alexeyslav писал(а):У этого метода есть недостаток... пока мы входим в прерывание и до фиксации значения ... таймер все еще считает. внося неконтролируемую погрешность.
при любой реализации будет некоторая аппаратная погрешность...
и с чего ты взял, что не контролируемая?
количество тактов от установки флага до входа в прерывание известно, посчитать сколько тактов уходит от начала прерывания до момента чтения счетчика, тоже не проблема
Re: Ассемблер (ASM) для AVR в вопросах и ответах
можно еще по компаратору работать, он тоже во всех моделях есть.
Так как ТС по книжкам даже в школе не умел учиться, пришлось даташит открывать мне. Там у таймеров нет модуля захвата. Работа с компаратором будет аналогична работе по внешнему прерыванию.
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
ploop писал(а): Работа с компаратором будет аналогична работе по внешнему прерыванию.
само-собой
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Подтверждаю!ploop писал(а):пришлось даташит открывать мне. Там у таймеров нет модуля захвата.
С первой строчки доки запустил поиск слова capture. Через полсекунды получил ответ - нетути!
Не свосем понимаю, как люди принимаются решать поставленные задачи инструментом, свойств которого не знают, да еще и гордятся этим? Фраза насчет неумения учится по книжкам насквозь пропитана этой гордостью. Мол вот я каков, не читал, а делаю. Ведь нам сразу видно, кто читал, а кто гордится...
С уважением,
Виктор.
Виктор.
- xkp
- Опытный кот
- Сообщения: 781
- Зарегистрирован: Ср ноя 18, 2009 12:50:31
- Откуда: ковров
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
я не говорил что не читал! я читал и читаю, книжек у меня 8гб. но по книжкам не могу я понять. там как то не так все написано. надо либо более подробно, либо очень кратко.
еще когда начинал изучать программирование 3 месяца искал команды на асме. в книжках они все расписаны на сотни страниц. и пока я не нашел вот это я не мог написать самой простой программы для мигания светодиодика.
еще когда начинал изучать программирование 3 месяца искал команды на асме. в книжках они все расписаны на сотни страниц. и пока я не нашел вот это я не мог написать самой простой программы для мигания светодиодика.
R5VCH
Хотелки:
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Хотелки:
Спойлер
Аналоговый осциллограф С1-112, С1-118, другиене/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Re: Ассемблер (ASM) для AVR в вопросах и ответах
xkp писал(а):я не говорил что не читал! я читал и читаю, книжек у меня 8гб. но по книжкам не могу я понять. там как то не так все написано. надо либо более подробно, либо очень кратко.
еще когда начинал изучать программирование 3 месяца искал команды на асме. в книжках они все расписаны на сотни страниц. и пока я не нашел вот это я не мог написать самой простой программы для мигания светодиодика.
1. Ценность библиотеки не измеряется ее суммарным объемом.
2. Я не затрагивал темы программирования. Лишь коснулся описания МК, который вы применяете. И именно эту доку и имел ввиду. Считаю, что для грамотного применения того или иного типа МК надо знать, что он умеет и может. А эти сведения по крупицам на форуме не соберете.
Да ладно, чего это я.
Удачи вам и успехов!
С уважением,
Виктор.
Виктор.
- xkp
- Опытный кот
- Сообщения: 781
- Зарегистрирован: Ср ноя 18, 2009 12:50:31
- Откуда: ковров
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
это был пример...
R5VCH
Хотелки:
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Хотелки:
Спойлер
Аналоговый осциллограф С1-112, С1-118, другиене/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
- xkp
- Опытный кот
- Сообщения: 781
- Зарегистрирован: Ср ноя 18, 2009 12:50:31
- Откуда: ковров
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
вернемся к генератору импульсов. задал необходимую длительность импульсов, выдал необходимое количество импульсов. как выключить генерирование импульсов и очистить PINB PORTB?
пробовал разное но флаги TIFR0 не сбрасываются, либо устанавливаются обратно и генерирование продолжается.
ставил OUTI tccr0a,(0<<com0a1)|(0<<COM0A0) генерирование останавливается но PINB не сбрасывается.
пробовал разное но флаги 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
Хотелки:
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Хотелки:
Спойлер
Аналоговый осциллограф С1-112, С1-118, другиене/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Re: Ассемблер (ASM) для AVR в вопросах и ответах
В любой из Ваших книжек , есть чёткое упоминание о том как останавливать и запускать генерацию.
А уж как сбрасывать порт - даже не прилично спрашивать.
А уж как сбрасывать порт - даже не прилично спрашивать.
- xkp
- Опытный кот
- Сообщения: 781
- Зарегистрирован: Ср ноя 18, 2009 12:50:31
- Откуда: ковров
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
А вы попробуйте сами, остановив генерацию сбросить пин! Cbi pin(port, ddr)b не помогает, через clr tmp / out pin(port, ddr)b аналогично. Pinb остается установленным.
R5VCH
Хотелки:
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Хотелки:
Спойлер
Аналоговый осциллограф С1-112, С1-118, другиене/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
И все же, время от возникновения прерывания до начала исполнения кода обработчика прерывания можно контролировать только в одном случае - если оно единственное в программе и в основном коде не используются участки кода с запретом прерываний. Представь контроллер обрабатывает другое прерывание и в этот момент поступил сигнал нашего прерывания - он будет обработан только после того как закончится обработка текущего прерывания или в коде не встретится команда разрешения прерываний.
Аппаратное стробирование входа таймера решает все эти проблемы на корню. Как только сигнал будет убран, таймер остановится независимо от того начался выполнятся код обработчика или нет. И не надо мучить голову по поводу подсчета задержек. А они, кстати, будут не менее 8-ми тактов + такты на сохранение контекста. За это время, чего хорошего, таймер может и переполнится если его не остановить.
Генерацию надо останавливать ОСТАНОВКОЙ ТАЙМЕРА, и потом только гасить пин. И кстати в режиме когда пин принадлежит таймеру, на него не действуют регистры порта, поэтому сбрасывать его надо либо манипуляцией с таймером, либо перевести таймер в другой режим и уже после этого гасить порт стандартным методом.
Аппаратное стробирование входа таймера решает все эти проблемы на корню. Как только сигнал будет убран, таймер остановится независимо от того начался выполнятся код обработчика или нет. И не надо мучить голову по поводу подсчета задержек. А они, кстати, будут не менее 8-ми тактов + такты на сохранение контекста. За это время, чего хорошего, таймер может и переполнится если его не остановить.
Генерацию надо останавливать ОСТАНОВКОЙ ТАЙМЕРА, и потом только гасить пин. И кстати в режиме когда пин принадлежит таймеру, на него не действуют регистры порта, поэтому сбрасывать его надо либо манипуляцией с таймером, либо перевести таймер в другой режим и уже после этого гасить порт стандартным методом.
- xkp
- Опытный кот
- Сообщения: 781
- Зарегистрирован: Ср ноя 18, 2009 12:50:31
- Откуда: ковров
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Ну так а остановить то как его? Cli не помогает.
R5VCH
Хотелки:
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Хотелки:
Спойлер
Аналоговый осциллограф С1-112, С1-118, другиене/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Re: Ассемблер (ASM) для AVR в вопросах и ответах
А вы попробуйте сами, остановив генерацию сбросить пин!
Пробовали, и что?
Остановив генерацию, пины остаются подключены к таймеру. Никто не давал команды их отключить.
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
.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 в вопросах и ответах
Вы его выключили
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
.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 в вопросах и ответах
блин ну я косячник
) Заместо
sts TIMSK1,temp;
написал
sts TCCR1A,temp;
20 раз проверил) и был уверен что правильно))
sts TIMSK1,temp;
написал
sts TCCR1A,temp;
20 раз проверил) и был уверен что правильно))
- Vicont
- Прорезались зубы
- Сообщения: 201
- Зарегистрирован: Пт июл 25, 2008 14:09:04
- Откуда: Зауралье
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Я тренируюсь управлять внешними прерываниями ATTiny2313. За основу проекта взял схему из обучалки, где 8 светодиодов подключены порту Б, и присоединил 2 кнопки к выводам INT0 и INT1. Задача при нажатии одной из кнопок светодиод должен сдвигаться влево/вправо
В результате получилось так, что когда светодиод сдвигается в самый край, срабатывает равенство breq и загорается светодиод на противоположенном конце, то программа входит в бесконечный цикл и перестает вообще реагировать на любые прерывания, даже на Reset. и огонек стоит на месте....
Пожалуйста, помогите разобраться в чем дело.
Спойлер
Код: Выделить всё
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. и огонек стоит на месте....
Пожалуйста, помогите разобраться в чем дело.
