RC-Switch 2.0 - Новый функционал
| |
uwrtey | Дата: Суббота, 04.05.2013, 00:02 | Сообщение # 16 |
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Статус: Offline
| Цитата Вопрос в том, как определять "что на ноге"... и сколько времени это займёт... это два вопроса 1) Первый ответ нужную ногу настроить на вход Ldi R16, 0b11101111 ( четвертая нога порта Б настроена на вход ) out DDRB, R16 затем читаем что на этой ноге in r16, PortB ( читаем весь порт ) andi R16, 0b00010000 ( оставляем данные только в четвертом бите ) cpi r16, 0b00010000 ( сравниваем с числом ) breq log_1 ; если лог 1 rjmp log_0 ; если лог 0
2) второй ответ незнаю , сколько-то займет, а сколько не знаю дак и нормальный таймер то-же сколько то занимает и скорее всего может показывать разные значения...
не успеваю за своими мыслями......
Сообщение отредактировал uwrtey - Суббота, 04.05.2013, 00:06 |
|
| |
Plohish | Дата: Суббота, 04.05.2013, 00:12 | Сообщение # 17 |
Сержант
Группа: Проверенные
Сообщений: 24
Статус: Offline
| когда я говорил "как определить" я имел ввиду способ, а не конкретный код, хотя и за него спасибо, но я в ассемблере ни бум бум... я и Си знаю только по наитию, пару команд... я говорил про способ определения, ну да это ладно...
Таймер, я так понимаю вещь работающая независимо от основного кода, а следовательно он считать будет на порядок точнее того что вы предлагаете... однако попробовать нужно
|
|
| |
uwrtey | Дата: Суббота, 04.05.2013, 00:16 | Сообщение # 18 |
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Статус: Offline
| все верно
да я и сам не бум бум, где то что то прочитал. Но в основном всему ВитГо научил, где что нужно пальцем показал, разжевал и в рот положил. Спасибо ему
не успеваю за своими мыслями......
Сообщение отредактировал uwrtey - Суббота, 04.05.2013, 00:18 |
|
| |
Plohish | Дата: Суббота, 04.05.2013, 12:03 | Сообщение # 19 |
Сержант
Группа: Проверенные
Сообщений: 24
Статус: Offline
| идею uwrtey реализовал, вроде работает, однако как скажется на ней например внешняя температура, нипанятна
|
|
| |
uwrtey | Дата: Суббота, 04.05.2013, 13:13 | Сообщение # 20 |
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Статус: Offline
| Молодец.
А про какую внешнюю температуру речь ?
не успеваю за своими мыслями......
|
|
| |
ВитГо | Дата: Суббота, 04.05.2013, 13:22 | Сообщение # 21 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| на счет таймера:
имхо, разделить работу с таймером на 2 части: 1. работаем на захват - у нас это импульс с интервалом от 1 до 2 мс.. 2. оставшиеся 18 мс - работаем как таймер для отмера длительности импульса для ШИМ (причем с учетом полученного значения из [1])
в принципе ничего сложного..
если 90% мощности ШИМ (общий цикл 20 мс, из них 2 мс - это замер - то есть 10% пустое время) будет не достаточно - то перед замером устанавливаем выход ШИМ в "1" (ненамного сложнее алгоритм кстати !)
получается как бы полупрограммный ШИМ (но процессор все равно ничего больше не делает)...
Виталий (аka ВитГо)
|
|
| |
ВитГо | Дата: Суббота, 04.05.2013, 13:26 | Сообщение # 22 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| Цитата (Plohish) Таймер, я так понимаю вещь работающая независимо от основного кода, а следовательно он считать будет на порядок точнее того что вы предлагаете...
таймер это фактически микросхема счетчика - поэтому точность максимальная.. - это намного лучше чем считать программно..
хотя опять таки - если тинька больше ничем не занимается - то ради бога - можете делать и программный подсчет, если это будет на асме - то длительность задержки легко считается так как время исполнения каждой асм команды известна... для си конечно будет чуть сложнее, но в этом случае можно применить inline ассемблер в си... либо посмотреть в какой код преобразовывается код задержки на си компилятором в асм...
Виталий (аka ВитГо)
|
|
| |
Plohish | Дата: Суббота, 04.05.2013, 14:34 | Сообщение # 23 |
Сержант
Группа: Проверенные
Сообщений: 24
Статус: Offline
| Цитата (uwrtey) А про какую внешнюю температуру речь ?
окружающего воздуха... плюс 35 - минус 15 ....
|
|
| |
uwrtey | Дата: Суббота, 04.05.2013, 21:19 | Сообщение # 24 |
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Статус: Offline
| Цитата (Plohish) вроде работает, однако как скажется на ней например внешняя температура, нипанятна ни когда не задавался этим вопросом , надеюсь ни как
Нужно еще попробовать то, что советует ВитГо ( полу программный ШИМ ) - Правда я не понял, как его организовать ...
не успеваю за своими мыслями......
Сообщение отредактировал uwrtey - Суббота, 04.05.2013, 21:20 |
|
| |
Plohish | Дата: Суббота, 04.05.2013, 21:24 | Сообщение # 25 |
Сержант
Группа: Проверенные
Сообщений: 24
Статус: Offline
| он имел ввиду немножко не то...
он предлагает на время замера длительности, это порядка 20 миллисекунд на выводе который поджигает светодиод ШИМом отключать ШИМ и тупо включать "единицу", потом снова возвращать ШИМ
не знаю как это отразится на свечении диода, особенно когда ШИМ в самом "начале", когда свечение слабое...
Сообщение отредактировал Plohish - Суббота, 04.05.2013, 21:27 |
|
| |
uwrtey | Дата: Суббота, 04.05.2013, 21:31 | Сообщение # 26 |
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Статус: Offline
| интересно... нужно пробовать, что бы проверить...
не успеваю за своими мыслями......
Сообщение отредактировал uwrtey - Суббота, 04.05.2013, 21:32 |
|
| |
Plohish | Дата: Суббота, 04.05.2013, 21:42 | Сообщение # 27 |
Сержант
Группа: Проверенные
Сообщений: 24
Статус: Offline
| после реализации вашей идеи, мне это кажется уже слишком геморно а при условии того что результат непонятен, так вообще...
но для развития мозгов поковырять как нить можно...
а вы так и не дошли до реализации плавного зажигания на асме?
|
|
| |
ВитГо | Дата: Суббота, 04.05.2013, 21:44 | Сообщение # 28 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| Цитата (Plohish) отключать ШИМ и тупо включать "единицу", потом снова возвращать ШИМ
либо тупо включать ноль !
это нужно делать в зависимости от длительности - если менее 80% то держать выключено (ноль) на выходе ШИМ во время захвата, а если больше 80% то держать лог.1
в общем ничего сложного..
единственно что для светодиода возможно частота в 50 гц будет маловата :-(
Виталий (аka ВитГо)
|
|
| |
uwrtey | Дата: Воскресенье, 05.05.2013, 13:19 | Сообщение # 29 |
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Статус: Offline
| Цитата (Plohish) а вы так и не дошли до реализации плавного зажигания на асме? нет, я пока не занимался этим... времени не хватает. Закончу пропорциональное управление для вертолета и попробую. Я думаю что стоит прислушаться к ВитГо, его вариант "покруче" будет.
Цитата после реализации вашей идеи, мне это кажется уже слишком геморно smile а при условии того что результат непонятен, так вообще...
пускай геморно, лишь бы это кому то нужно было... а результат непонятен в силу того, что у нас с Вами маловато знаний и опыта... ______________________________________________________________________
Цитата (ВитГо) единственно что для светодиода возможно частота в 50 гц будет маловата :-( наверно RC-цепочка поможет в таком случае. Добавлено (05.05.2013, 13:19) --------------------------------------------- Plohish, мне хочется посмотреть на то что у вас получилось, хоть я и не понимаю СИ
не успеваю за своими мыслями......
Сообщение отредактировал uwrtey - Суббота, 04.05.2013, 22:02 |
|
| |
Plohish | Дата: Вторник, 07.05.2013, 17:10 | Сообщение # 30 |
Сержант
Группа: Проверенные
Сообщений: 24
Статус: Offline
| стрёмно мне как то
наверняка написано всё по лоховски ...
есть небольшая загвоздка, когда я писал этот код в CodeVisionAVR и дебажил в AVR Studio 4, количество циклов по подсчёту переменной было одно, а когда всё это засунул в протеус, там стало совсем по другому! и в реальном железе точно так же как и в протеусе... видимо протеус обрабатывает уже asm и там всё не так... но с другой стороны методом подбора нашёл нужные цифры, всё работает!
Код
#include <tiny13.h>
// Declare your global variables here
int tmp=0,front=0;
// Pin change interrupt service routine interrupt [PC_INT0] void pin_change_isr(void) { if (PINB.1 == 1) { front = 1; tmp = 0; } else { if (tmp < 1150) tmp = 1150; if (tmp > 1915) tmp = 1915; OCR0A = (tmp-1150)/3; front = 0; } }
void main(void) { // Declare your local variables here
// Crystal Oscillator division factor: 1 #pragma optsize- CLKPR=(1<<CLKPCE); CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0); #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif
// Port B initialization PORTB=0b11111111; DDRB=0b00000001; PORTB.0 = 0;
// External Interrupt(s) initialization GIMSK = 0b00100000; PCMSK = 0b00000010; // Прерывание по перепаду // Таймер TCCR0A = 0b10000001; // управление выходом, ШИМ TCCR0B = 0x01; // делителя нет
// Global enable interrupts ) #asm("sei")
while (1) { if (front == 1) tmp++; }
}
Сообщение отредактировал Plohish - Вторник, 07.05.2013, 17:14 |
|
| |
|