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

Обсуждаем контроллеры компании Atmel.
SmarTrunk
Друг Кота
Сообщения: 6014
Зарегистрирован: Чт ноя 26, 2009 11:16:50
Откуда: Москва

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

Сообщение SmarTrunk »

Нет. Только если фронт опустится ниже логического уровня, который ПРИМЕРНО равен половине напряжения питания (с поправкой на то, что там триггрер Шмидта на входе, и уровни "вверх" и "вниз" будут чуть разные), а вообще есть, в даташите, графики зависимости логических уровней от напряжения питания.
Аватара пользователя
xkp
Опытный кот
Сообщения: 781
Зарегистрирован: Ср ноя 18, 2009 12:50:31
Откуда: ковров
Контактная информация:

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

Сообщение xkp »

Мне как то раз нечем было заняться и я на практике испытал когда МК видит лог 0 а когда лог 1. При изначальном уровне в лог 1 (5 в) начал сбавлять напряжение примерно при напряжении 1.4 В МК "понял" что у него уже лог 0. Наоборот при повышении напряжения с 0 В, МК "понял" что у него лог 1 Где то на напряжении 2.6 В.
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
SatinS
Открыл глаза
Сообщения: 53
Зарегистрирован: Пн ноя 09, 2009 20:14:52

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

Сообщение SatinS »

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

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

Сообщение xkp »

самое простое и малоемкое это считать импульсы за определенное время. можно еще просто пустить таймер. И каждый раз по импульсу из текущего значения таймера вычитать предыдущее. Получаешь время (счет таймера) между импульсами. Вернись страницы на 3 назад. я там почти с такой же проблемой сталкнулся.
в первом случае (в моем посте) в константах хранится "количество импульсов на заданное время (время измерения)"
во втором случае (в моем посте) в константах хранится "длинна импульса"
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
SatinS
Открыл глаза
Сообщения: 53
Зарегистрирован: Пн ноя 09, 2009 20:14:52

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

Сообщение SatinS »

xkp прочёл) кстати про 24х битный счётчик, ты не думал о том, что бы аппаратно тактировать один счётчик от другого? :) 8+16 бит = 24 :)))
Аватара пользователя
xkp
Опытный кот
Сообщения: 781
Зарегистрирован: Ср ноя 18, 2009 12:50:31
Откуда: ковров
Контактная информация:

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

Сообщение xkp »

Я думал о другом и там где то писал, не только я. Счетчик 16 бит. по переполнению он прыгает на tim_1_ovf, там в свою очередь еще один счетчик (8 битный) и того получаем 24 бита. Плюс этой идеи в том что при желании за место 8 битного счетчика можно написать счетчик на 16, 24, 32 бита, да на сколько угодно и тогда разрядность всего счетчика составит X+16 бит, где X - разрядность программного счетчика.
К сожалению я пока только думал об этом. Что то обленилась моя шерсть в последнее время. недельки через 2 планирую продолжить свой проект.


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

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

Сообщение GP1 »

SatinS писал(а):вопрос немного не в тему - как лучше считать длительность импульсов?
1й вариант по первому импульсу запускаем счётчик по 2му вырубаем - результат сравниваем с константой (константами)
2й вариант считать количество импульсов за интервал времени, делить - результат сравниваем с константой (константами)

если исходить из описания - то ты измеряешь не длительность импульсов а период их повторения
неправильно выразился - надо определять момент появления импульсов определённой длины (датчик холла и магнит на валу двигателя для определения оборотов, есть 80 фиксированных скоростей) сейчас реализовано 1м способом но хочу упростить алгоритм.

или все-таки определенной частоты следования импульсов?
1. чтобы упростить алгоритм прежде всего нужно определиться что и с какой точностью надо измерять
2. если это 4х тактный 4х цилиндровый двигун (не от суперкара) то диапазон частоты искрообразования это где-то от 15-20 Гц до 260-270 Гц, и возникает вопрос для чего датчик Холла и магнит на коленвалу? (только дисбаланс коленвала)
Последний раз редактировалось GP1 Вт дек 02, 2014 20:45:13, всего редактировалось 1 раз.
Чем дальше, тем больше становлюсь занудой...
Изображение
SatinS
Открыл глаза
Сообщения: 53
Зарегистрирован: Пн ноя 09, 2009 20:14:52

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

Сообщение 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, неее это электрический двигатель, просто там меняется нагрузка и обычный ПИДом там не обойтись, надо компенсировать как то, потому прилеплен маленький магнитик на вал (на торец), а измерять время между импульсами, да, частоту, запутался, не длительность ни в коем случае :))
можно правда и длительность, наверное , не знаю как сильно размазывается сигнал датчика от скорости, но это имхо извращение
Последний раз редактировалось SatinS Вт дек 02, 2014 20:54:27, всего редактировалось 3 раза.
Аватара пользователя
xkp
Опытный кот
Сообщения: 781
Зарегистрирован: Ср ноя 18, 2009 12:50:31
Откуда: ковров
Контактная информация:

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

Сообщение xkp »

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

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

Сообщение GP1 »

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

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

Сообщение xkp »

Главная разница это структура измерения, а поймать разницы нет, сравниваешь значения таймера с константой и коректируешь дальнейшие действия в ту или иную сторону до достижения равенства.
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
SatinS
Открыл глаза
Сообщения: 53
Зарегистрирован: Пн ноя 09, 2009 20:14:52

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

Сообщение SatinS »

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

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

Сообщение GP1 »

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

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

Сообщение xkp »

SatinS, у так я и говорю разницы практически нет. даже по ICP1 можно это делать. Включаешь прерывание по нарастающему фронту и ждеш его (фронт). Как только он пришол прыгаем на прерывание, запоминаем состояние счетчика в пам_1, переключаем режим на спад сигнала. Как только спад, прыгаем на прерывание, счетчик в пам_2, пам_2 - пам_1 = пам_0, переключаемна нарастающий фронт.
Переключения необходимы для того что бы определить в какой из 2 периодов мы прыгнули в прерывание.
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
SatinS
Открыл глаза
Сообщения: 53
Зарегистрирован: Пн ноя 09, 2009 20:14:52

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

Сообщение SatinS »

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

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

Сообщение GP1 »

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

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

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

Сообщение xkp »

я выше там страницы 2 назад писал. когда мне надо было супер точно я взял мк с повышенной частотой тактирования до 20 мГц (tiny85). Пробовал кварц ставить больше 20 мГц, повесил осциллограф на кварц и увидел что генератор встроенный в мк начинает сбиваться. Пришлось оставить тактирование мк на 20 мГц. Но точности мне все равно не хватило и проект металлоискателя пришлось остановить, положить в долгий ящик, разобрать и забыть.

ЗЫ, но мы ведь и обсуждаем асм? хотя... мы обсуждаем структуру измерений...
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
bondyara
Встал на лапы
Сообщения: 139
Зарегистрирован: Сб май 07, 2011 17:00:42
Откуда: Оттуда

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

Сообщение 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. Продолжаю отладку, прерывания не возникает, по-прежнему продолжается бесконечный цикл.
Где ошибка?
Аватара пользователя
xkp
Опытный кот
Сообщения: 781
Зарегистрирован: Ср ноя 18, 2009 12:50:31
Откуда: ковров
Контактная информация:

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

Сообщение xkp »

попробуйте
СпойлерRX_OK: IN R16,UDR

RETI

переместить в конец программы, после бесконечного цикла
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
bondyara
Встал на лапы
Сообщения: 139
Зарегистрирован: Сб май 07, 2011 17:00:42
Откуда: Оттуда

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

Сообщение bondyara »

Не сработало.
Еще раз проверил флаги. Что интересно, флаг "I" устанавливается, но после нескольких циклов NOP снимается. Но даже при всех установленных (I в SREG, RXCIE в UCSRB и RXC в UCSRA) прерывание не работает.
Может быть проблема версии 6.2? Или в настройках нужно покопаться? Эмулирую пошагово (F11). Вроде, все делаю правильно.
Последний раз редактировалось bondyara Вт дек 02, 2014 22:06:10, всего редактировалось 1 раз.
Ответить

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