Ассемблер (ASM) для AVR в вопросах и ответах
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Нет. Только если фронт опустится ниже логического уровня, который ПРИМЕРНО равен половине напряжения питания (с поправкой на то, что там триггрер Шмидта на входе, и уровни "вверх" и "вниз" будут чуть разные), а вообще есть, в даташите, графики зависимости логических уровней от напряжения питания.
- xkp
- Опытный кот
- Сообщения: 781
- Зарегистрирован: Ср ноя 18, 2009 12:50:31
- Откуда: ковров
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Мне как то раз нечем было заняться и я на практике испытал когда МК видит лог 0 а когда лог 1. При изначальном уровне в лог 1 (5 в) начал сбавлять напряжение примерно при напряжении 1.4 В МК "понял" что у него уже лог 0. Наоборот при повышении напряжения с 0 В, МК "понял" что у него лог 1 Где то на напряжении 2.6 В.
R5VCH
Хотелки:
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Хотелки:
Спойлер
Аналоговый осциллограф С1-112, С1-118, другиене/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Re: Ассемблер (ASM) для AVR в вопросах и ответах
вопрос немного не в тему - как лучше считать длительность импульсов?
1й вариант по первому импульсу запускаем счётчик по 2му вырубаем - результат сравниваем с константой (константами)
2й вариант считать количество импульсов за интервал времени, делить - результат сравниваем с константой (константами)
неправильно выразился - надо определять момент появления импульсов определённой длины (датчик холла и магнит на валу двигателя для определения оборотов, есть 80 фиксированных скоростей) сейчас реализовано 1м способом но хочу упростить алгоритм.
1й вариант по первому импульсу запускаем счётчик по 2му вырубаем - результат сравниваем с константой (константами)
2й вариант считать количество импульсов за интервал времени, делить - результат сравниваем с константой (константами)
неправильно выразился - надо определять момент появления импульсов определённой длины (датчик холла и магнит на валу двигателя для определения оборотов, есть 80 фиксированных скоростей) сейчас реализовано 1м способом но хочу упростить алгоритм.
- xkp
- Опытный кот
- Сообщения: 781
- Зарегистрирован: Ср ноя 18, 2009 12:50:31
- Откуда: ковров
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
самое простое и малоемкое это считать импульсы за определенное время. можно еще просто пустить таймер. И каждый раз по импульсу из текущего значения таймера вычитать предыдущее. Получаешь время (счет таймера) между импульсами. Вернись страницы на 3 назад. я там почти с такой же проблемой сталкнулся.
в первом случае (в моем посте) в константах хранится "количество импульсов на заданное время (время измерения)"
во втором случае (в моем посте) в константах хранится "длинна импульса"
в первом случае (в моем посте) в константах хранится "количество импульсов на заданное время (время измерения)"
во втором случае (в моем посте) в константах хранится "длинна импульса"
R5VCH
Хотелки:
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Хотелки:
Спойлер
Аналоговый осциллограф С1-112, С1-118, другиене/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Re: Ассемблер (ASM) для AVR в вопросах и ответах
xkp прочёл) кстати про 24х битный счётчик, ты не думал о том, что бы аппаратно тактировать один счётчик от другого?
8+16 бит = 24 
- xkp
- Опытный кот
- Сообщения: 781
- Зарегистрирован: Ср ноя 18, 2009 12:50:31
- Откуда: ковров
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Я думал о другом и там где то писал, не только я. Счетчик 16 бит. по переполнению он прыгает на tim_1_ovf, там в свою очередь еще один счетчик (8 битный) и того получаем 24 бита. Плюс этой идеи в том что при желании за место 8 битного счетчика можно написать счетчик на 16, 24, 32 бита, да на сколько угодно и тогда разрядность всего счетчика составит X+16 бит, где X - разрядность программного счетчика.
К сожалению я пока только думал об этом. Что то обленилась моя шерсть в последнее время. недельки через 2 планирую продолжить свой проект.
и... да... как аппаратно тактировать счетчик??? ну можно конечно запретить счет счетчика допустим на таймер_0 а в прерывании таймера 1 по переполнению инкрементировать счетчик таймера 0. думаю это сложнее... Да и таймеры будут перебивать друг друга. И просто так занимать таймер тоже не надо.
К сожалению я пока только думал об этом. Что то обленилась моя шерсть в последнее время. недельки через 2 планирую продолжить свой проект.
и... да... как аппаратно тактировать счетчик??? ну можно конечно запретить счет счетчика допустим на таймер_0 а в прерывании таймера 1 по переполнению инкрементировать счетчик таймера 0. думаю это сложнее... Да и таймеры будут перебивать друг друга. И просто так занимать таймер тоже не надо.
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 в вопросах и ответах
SatinS писал(а):вопрос немного не в тему - как лучше считать длительность импульсов?
1й вариант по первому импульсу запускаем счётчик по 2му вырубаем - результат сравниваем с константой (константами)
2й вариант считать количество импульсов за интервал времени, делить - результат сравниваем с константой (константами)
если исходить из описания - то ты измеряешь не длительность импульсов а период их повторения
неправильно выразился - надо определять момент появления импульсов определённой длины (датчик холла и магнит на валу двигателя для определения оборотов, есть 80 фиксированных скоростей) сейчас реализовано 1м способом но хочу упростить алгоритм.
или все-таки определенной частоты следования импульсов?
1. чтобы упростить алгоритм прежде всего нужно определиться что и с какой точностью надо измерять
2. если это 4х тактный 4х цилиндровый двигун (не от суперкара) то диапазон частоты искрообразования это где-то от 15-20 Гц до 260-270 Гц, и возникает вопрос для чего датчик Холла и магнит на коленвалу? (только дисбаланс коленвала)
Последний раз редактировалось GP1 Вт дек 02, 2014 20:45:13, всего редактировалось 1 раз.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
xkp, ещё проще,один из счётчиков тактировать шимом другого по External clock source on T0 pin. Clock on falling edge\External clock source on T0 pin. Clock on rising edge. то есть ноги просто замкнуть, если в мк 2 счётчика - проблем возникнуть не должно. Состояние так же можно считывать у обоих (и у шиманутого) останавливать чуть дольше только, но если 1м останавливать "шимующий" всё будет норм 
GP1, неее это электрический двигатель, просто там меняется нагрузка и обычный ПИДом там не обойтись, надо компенсировать как то, потому прилеплен маленький магнитик на вал (на торец), а измерять время между импульсами, да, частоту, запутался, не длительность ни в коем случае
можно правда и длительность, наверное , не знаю как сильно размазывается сигнал датчика от скорости, но это имхо извращение
GP1, неее это электрический двигатель, просто там меняется нагрузка и обычный ПИДом там не обойтись, надо компенсировать как то, потому прилеплен маленький магнитик на вал (на торец), а измерять время между импульсами, да, частоту, запутался, не длительность ни в коем случае
можно правда и длительность, наверное , не знаю как сильно размазывается сигнал датчика от скорости, но это имхо извращение
Последний раз редактировалось SatinS Вт дек 02, 2014 20:54:27, всего редактировалось 3 раза.
- xkp
- Опытный кот
- Сообщения: 781
- Зарегистрирован: Ср ноя 18, 2009 12:50:31
- Откуда: ковров
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
GP1, извиняюсь. не заметил как то... особой разницы нет мерить длительность или период. Я мерил длительность тупо запуская таймер и останавливая его, даже не на прерываниях, тупо в самой программе.
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
- Опытный кот
- Сообщения: 781
- Зарегистрирован: Ср ноя 18, 2009 12:50:31
- Откуда: ковров
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Главная разница это структура измерения, а поймать разницы нет, сравниваешь значения таймера с константой и коректируешь дальнейшие действия в ту или иную сторону до достижения равенства.
R5VCH
Хотелки:
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Хотелки:
Спойлер
Аналоговый осциллограф С1-112, С1-118, другиене/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Re: Ассемблер (ASM) для AVR в вопросах и ответах
он имеет в виду, что можно измерять длительность самого импульса- то есть от начала фронта до конца фронта импульса, а не по появлению или пропаданию
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
SatinS
открой секрет - что мострячишь?
тахометр с "лампочками"?
открой секрет - что мострячишь?
тахометр с "лампочками"?
- xkp
- Опытный кот
- Сообщения: 781
- Зарегистрирован: Ср ноя 18, 2009 12:50:31
- Откуда: ковров
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
SatinS, у так я и говорю разницы практически нет. даже по ICP1 можно это делать. Включаешь прерывание по нарастающему фронту и ждеш его (фронт). Как только он пришол прыгаем на прерывание, запоминаем состояние счетчика в пам_1, переключаем режим на спад сигнала. Как только спад, прыгаем на прерывание, счетчик в пам_2, пам_2 - пам_1 = пам_0, переключаемна нарастающий фронт.
Переключения необходимы для того что бы определить в какой из 2 периодов мы прыгнули в прерывание.
Переключения необходимы для того что бы определить в какой из 2 периодов мы прыгнули в прерывание.
R5VCH
Хотелки:
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Хотелки:
Спойлер
Аналоговый осциллограф С1-112, С1-118, другиене/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Re: Ассемблер (ASM) для AVR в вопросах и ответах
GP1, хуже, эмулятор механической части спидометра
берёт импульсы с коробки автомата и крутит двигателем механический спидометр (не спрашивай зачем всё это)))
xkp, есть, в тактах нескольких, я думал надо супер-пупер точно)
xkp, есть, в тактах нескольких, я думал надо супер-пупер точно)
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
SatinS писал(а):GP1, хуже, эмулятор механической части спидометраберёт импульсы с коробки автомата и крутит двигателем механический спидометр (не спрашивай зачем всё это)))
ну это просто жесть
давай так - тема про ASM поэтому либо в личку, либо создай тему, а то мы оба по горчишнику получим, а там что-нибудь придумаем
- xkp
- Опытный кот
- Сообщения: 781
- Зарегистрирован: Ср ноя 18, 2009 12:50:31
- Откуда: ковров
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
я выше там страницы 2 назад писал. когда мне надо было супер точно я взял мк с повышенной частотой тактирования до 20 мГц (tiny85). Пробовал кварц ставить больше 20 мГц, повесил осциллограф на кварц и увидел что генератор встроенный в мк начинает сбиваться. Пришлось оставить тактирование мк на 20 мГц. Но точности мне все равно не хватило и проект металлоискателя пришлось остановить, положить в долгий ящик, разобрать и забыть.
ЗЫ, но мы ведь и обсуждаем асм? хотя... мы обсуждаем структуру измерений...
ЗЫ, но мы ведь и обсуждаем асм? хотя... мы обсуждаем структуру измерений...
R5VCH
Хотелки:
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Хотелки:
Спойлер
Аналоговый осциллограф С1-112, С1-118, другиене/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Изучаю прерывания. Пробую эмулировать в AVR Studio 6.2
Использую Atmega8A
Код программы такой:
Таблицу прерываний взял из файла m8Adef.inc
Запускаю отладку, дохожу до бесконечного цикла и руками выставляю бит RXC в UCSRA. Продолжаю отладку, прерывания не возникает, по-прежнему продолжается бесконечный цикл.
Где ошибка?
Использую 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. Продолжаю отладку, прерывания не возникает, по-прежнему продолжается бесконечный цикл.
Где ошибка?
- xkp
- Опытный кот
- Сообщения: 781
- Зарегистрирован: Ср ноя 18, 2009 12:50:31
- Откуда: ковров
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
попробуйте
RETI
переместить в конец программы, после бесконечного цикла
Спойлер
RX_OK: IN R16,UDRRETI
переместить в конец программы, после бесконечного цикла
R5VCH
Хотелки:
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Хотелки:
Спойлер
Аналоговый осциллограф С1-112, С1-118, другиене/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Не сработало.
Еще раз проверил флаги. Что интересно, флаг "I" устанавливается, но после нескольких циклов NOP снимается. Но даже при всех установленных (I в SREG, RXCIE в UCSRB и RXC в UCSRA) прерывание не работает.
Может быть проблема версии 6.2? Или в настройках нужно покопаться? Эмулирую пошагово (F11). Вроде, все делаю правильно.
Еще раз проверил флаги. Что интересно, флаг "I" устанавливается, но после нескольких циклов NOP снимается. Но даже при всех установленных (I в SREG, RXCIE в UCSRB и RXC в UCSRA) прерывание не работает.
Может быть проблема версии 6.2? Или в настройках нужно покопаться? Эмулирую пошагово (F11). Вроде, все делаю правильно.
Последний раз редактировалось bondyara Вт дек 02, 2014 22:06:10, всего редактировалось 1 раз.
