Страница 240 из 399
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс ноя 30, 2014 23:19:54
SmarTrunk
Нет. Только если фронт опустится ниже логического уровня, который ПРИМЕРНО равен половине напряжения питания (с поправкой на то, что там триггрер Шмидта на входе, и уровни "вверх" и "вниз" будут чуть разные), а вообще есть, в даташите, графики зависимости логических уровней от напряжения питания.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пн дек 01, 2014 17:15:39
xkp
Мне как то раз нечем было заняться и я на практике испытал когда МК видит лог 0 а когда лог 1. При изначальном уровне в лог 1 (5 в) начал сбавлять напряжение примерно при напряжении 1.4 В МК "понял" что у него уже лог 0. Наоборот при повышении напряжения с 0 В, МК "понял" что у него лог 1 Где то на напряжении 2.6 В.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт дек 02, 2014 17:58:33
SatinS
вопрос немного не в тему - как лучше считать длительность импульсов?
1й вариант по первому импульсу запускаем счётчик по 2му вырубаем - результат сравниваем с константой (константами)
2й вариант считать количество импульсов за интервал времени, делить - результат сравниваем с константой (константами)
неправильно выразился - надо определять момент появления импульсов определённой длины (датчик холла и магнит на валу двигателя для определения оборотов, есть 80 фиксированных скоростей) сейчас реализовано 1м способом но хочу упростить алгоритм.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт дек 02, 2014 18:00:32
xkp
самое простое и малоемкое это считать импульсы за определенное время. можно еще просто пустить таймер. И каждый раз по импульсу из текущего значения таймера вычитать предыдущее. Получаешь время (счет таймера) между импульсами. Вернись страницы на 3 назад. я там почти с такой же проблемой сталкнулся.
в первом случае (в моем посте) в константах хранится "количество импульсов на заданное время (время измерения)"
во втором случае (в моем посте) в константах хранится "длинна импульса"
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт дек 02, 2014 20:15:09
SatinS
xkp прочёл) кстати про 24х битный счётчик, ты не думал о том, что бы аппаратно тактировать один счётчик от другого?

8+16 бит = 24

Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт дек 02, 2014 20:20:44
xkp
Я думал о другом и там где то писал, не только я. Счетчик 16 бит. по переполнению он прыгает на tim_1_ovf, там в свою очередь еще один счетчик (8 битный) и того получаем 24 бита. Плюс этой идеи в том что при желании за место 8 битного счетчика можно написать счетчик на 16, 24, 32 бита, да на сколько угодно и тогда разрядность всего счетчика составит X+16 бит, где X - разрядность программного счетчика.
К сожалению я пока только думал об этом. Что то обленилась моя шерсть в последнее время. недельки через 2 планирую продолжить свой проект.
и... да... как аппаратно тактировать счетчик??? ну можно конечно запретить счет счетчика допустим на таймер_0 а в прерывании таймера 1 по переполнению инкрементировать счетчик таймера 0. думаю это сложнее... Да и таймеры будут перебивать друг друга. И просто так занимать таймер тоже не надо.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт дек 02, 2014 20:37:44
GP1
SatinS писал(а):вопрос немного не в тему - как лучше считать длительность импульсов?
1й вариант по первому импульсу запускаем счётчик по 2му вырубаем - результат сравниваем с константой (константами)
2й вариант считать количество импульсов за интервал времени, делить - результат сравниваем с константой (константами)
если исходить из описания - то ты измеряешь не длительность импульсов а период их повторения
неправильно выразился - надо определять момент появления импульсов определённой длины (датчик холла и магнит на валу двигателя для определения оборотов, есть 80 фиксированных скоростей) сейчас реализовано 1м способом но хочу упростить алгоритм.
или все-таки определенной частоты следования импульсов?
1. чтобы упростить алгоритм прежде всего нужно определиться что и с какой точностью надо измерять
2. если это 4х тактный 4х цилиндровый двигун (не от суперкара) то диапазон частоты искрообразования это где-то от 15-20 Гц до 260-270 Гц, и возникает вопрос для чего датчик Холла и магнит на коленвалу? (только дисбаланс коленвала)
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт дек 02, 2014 20:40:38
SatinS
xkp, ещё проще,один из счётчиков тактировать шимом другого по
External clock source on T0 pin. Clock on falling edge\External clock source on T0 pin. Clock on rising edge. то есть ноги просто замкнуть, если в мк 2 счётчика - проблем возникнуть не должно. Состояние так же можно считывать у обоих (и у шиманутого) останавливать чуть дольше только, но если 1м останавливать "шимующий" всё будет норм
GP1, неее это электрический двигатель, просто там меняется нагрузка и обычный ПИДом там не обойтись, надо компенсировать как то, потому прилеплен маленький магнитик на вал (на торец), а измерять время между импульсами, да, частоту, запутался, не длительность ни в коем случае

можно правда и длительность, наверное , не знаю как сильно размазывается сигнал датчика от скорости, но это имхо извращение
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт дек 02, 2014 20:44:33
xkp
GP1, извиняюсь. не заметил как то... особой разницы нет мерить длительность или период. Я мерил длительность тупо запуская таймер и останавливая его, даже не на прерываниях, тупо в самой программе.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт дек 02, 2014 20:47:05
GP1
разница есть
смотря что ты пытаешься поймать
- определенную длительность
- определенную частоту
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт дек 02, 2014 20:49:20
xkp
Главная разница это структура измерения, а поймать разницы нет, сравниваешь значения таймера с константой и коректируешь дальнейшие действия в ту или иную сторону до достижения равенства.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт дек 02, 2014 20:51:24
SatinS
он имеет в виду, что можно измерять длительность самого импульса- то есть от начала фронта до конца фронта импульса, а не по появлению или пропаданию
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт дек 02, 2014 20:55:29
GP1
SatinS
открой секрет - что мострячишь?
тахометр с "лампочками"?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт дек 02, 2014 20:56:18
xkp
SatinS, у так я и говорю разницы практически нет. даже по ICP1 можно это делать. Включаешь прерывание по нарастающему фронту и ждеш его (фронт). Как только он пришол прыгаем на прерывание, запоминаем состояние счетчика в пам_1, переключаем режим на спад сигнала. Как только спад, прыгаем на прерывание, счетчик в пам_2, пам_2 - пам_1 = пам_0, переключаемна нарастающий фронт.
Переключения необходимы для того что бы определить в какой из 2 периодов мы прыгнули в прерывание.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт дек 02, 2014 21:02:24
SatinS
GP1, хуже, эмулятор механической части спидометра

берёт импульсы с коробки автомата и крутит двигателем механический спидометр (не спрашивай зачем всё это)))
xkp, есть, в тактах нескольких, я думал надо супер-пупер точно)
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт дек 02, 2014 21:06:24
GP1
SatinS писал(а):GP1, хуже, эмулятор механической части спидометра

берёт импульсы с коробки автомата и крутит двигателем механический спидометр (не спрашивай зачем всё это)))
ну это просто жесть
давай так - тема про ASM поэтому либо в личку, либо создай тему, а то мы оба по горчишнику получим, а там что-нибудь придумаем

Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт дек 02, 2014 21:06:42
xkp
я выше там страницы 2 назад писал. когда мне надо было супер точно я взял мк с повышенной частотой тактирования до 20 мГц (tiny85). Пробовал кварц ставить больше 20 мГц, повесил осциллограф на кварц и увидел что генератор встроенный в мк начинает сбиваться. Пришлось оставить тактирование мк на 20 мГц. Но точности мне все равно не хватило и проект металлоискателя пришлось остановить, положить в долгий ящик, разобрать и забыть.
ЗЫ, но мы ведь и обсуждаем асм? хотя... мы обсуждаем структуру измерений...
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт дек 02, 2014 21:14:54
bondyara
Изучаю прерывания. Пробую эмулировать в AVR Studio 6.2
Использую Atmega8A
Код программы такой:
Спойлер
Код: Выделить всё
.CSEG ; Кодовый сегмент
.ORG $000 ; (RESET)
RJMP Reset
.ORG INT0addr
RETI ; (INT0) External Interrupt Request 0
.ORG INT1addr
RETI ; (INT1) External Interrupt Request 1
.ORG OC2addr
RETI ; (TIMER2 COMP) Timer/Counter2 Compare Match
.ORG OVF2addr
RETI ; (TIMER2 OVF) Timer/Counter2 Overflow
.ORG ICP1addr
RETI ; (TIMER1 CAPT) Timer/Counter1 Capture Event
.ORG OC1Aaddr
RETI ; (TIMER1 COMPA) Timer/Counter1 Compare Match A
.ORG OC1Baddr
RETI ; (TIMER1 COMPB) Timer/Counter1 Compare Match B
.ORG OVF1addr
RETI ; (TIMER1 OVF) Timer/Counter1 Overflow
.ORG OVF0addr
RETI ; (TIMER0 OVF) Timer/Counter0 Overflow
.ORG SPIaddr
RETI ; (SPI,STC) Serial Transfer Complete
.ORG URXCaddr
RJMP RX_OK ; (USART,RXC) USART, Rx Complete
.ORG UDREaddr
RETI ; (USART,UDRE) USART Data Register Empty
.ORG UTXCaddr
RETI ; (USART,TXC) USART, Tx Complete
.ORG ADCCaddr
RETI ; (ADC) ADC Conversion Complete
.ORG ERDYaddr
RETI ; (EE_RDY) EEPROM Ready
.ORG ACIaddr
RETI ; (ANA_COMP) Analog Comparator
.ORG TWIaddr
RETI ; (TWI) 2-wire Serial Interface
.ORG SPMRaddr
RETI ; (SPM_RDY) Store Program Memory Ready
.ORG INT_VECTORS_SIZE ; Конец таблицы прерываний
RX_OK: IN R16,UDR
RETI
Reset: LDI R16,Low(RAMEND) ; Инициализация стека
OUT SPL,R16
LDI R16,High(RAMEND)
OUT SPH,R16
SEI ; Разрешаем прерывания глобально
LDI R17,(1<<RXCIE) ; Разрешаем прерывания по приему байта
OUT UCSRB,R17
M1: NOP
NOP
NOP
NOP
RJMP M1
Таблицу прерываний взял из файла m8Adef.inc
Спойлер
Код: Выделить всё
; ***** INTERRUPT VECTORS ************************************************
.equ INT0addr = 0x0001 ; External Interrupt Request 0
.equ INT1addr = 0x0002 ; External Interrupt Request 1
.equ OC2addr = 0x0003 ; Timer/Counter2 Compare Match
.equ OVF2addr = 0x0004 ; Timer/Counter2 Overflow
.equ ICP1addr = 0x0005 ; Timer/Counter1 Capture Event
.equ OC1Aaddr = 0x0006 ; Timer/Counter1 Compare Match A
.equ OC1Baddr = 0x0007 ; Timer/Counter1 Compare Match B
.equ OVF1addr = 0x0008 ; Timer/Counter1 Overflow
.equ OVF0addr = 0x0009 ; Timer/Counter0 Overflow
.equ SPIaddr = 0x000a ; Serial Transfer Complete
.equ URXCaddr = 0x000b ; USART, Rx Complete
.equ UDREaddr = 0x000c ; USART Data Register Empty
.equ UTXCaddr = 0x000d ; USART, Tx Complete
.equ ADCCaddr = 0x000e ; ADC Conversion Complete
.equ ERDYaddr = 0x000f ; EEPROM Ready
.equ ACIaddr = 0x0010 ; Analog Comparator
.equ TWIaddr = 0x0011 ; 2-wire Serial Interface
.equ SPMRaddr = 0x0012 ; Store Program Memory Ready
.equ INT_VECTORS_SIZE = 19 ; size in words
Запускаю отладку, дохожу до бесконечного цикла и руками выставляю бит RXC в UCSRA. Продолжаю отладку, прерывания не возникает, по-прежнему продолжается бесконечный цикл.
Где ошибка?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт дек 02, 2014 21:20:38
xkp
попробуйте Спойлер
RX_OK: IN R16,UDR
RETI
переместить в конец программы, после бесконечного цикла
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт дек 02, 2014 21:24:05
bondyara
Не сработало.
Еще раз проверил флаги. Что интересно, флаг "I" устанавливается, но после нескольких циклов NOP снимается. Но даже при всех установленных (I в SREG, RXCIE в UCSRB и RXC в UCSRA) прерывание не работает.
Может быть проблема версии 6.2? Или в настройках нужно покопаться? Эмулирую пошагово (F11). Вроде, все делаю правильно.