Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
21.04.2009, 12:51
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
Получается, Вам в основном цикле нужно тогда отслеживать и R3, а не только при загрузке.Перенесите его анализ в основной цикл
Код:
|
while (1)
{
//теперь берем от этого числа 10 часть для определения
//градации регулировки 3 резистором
s.na=tperiod/10;
// делим на 256
s.na››=8; // получили градацию для 3 резистора
//считываем значение 3 резистора
t1min=readr3(s.na);
//вычисляем градацию для 2 резистора
s.real=tperiod-t1min; // общий период - минимальная длительность
// делим на 256
s.real››=8; // получили градацию для 2 резистора
//считываем значение 2 резистора
t1real=readr2(s.real);
if (t1real ‹ 5)
{
tmr_stop();
}
else{
t1real+=t1min;
// получили значение импульса, вычисляем паузу
t1pause=tperiod-t1real;
// заносим в счетчики
imp.imp.all=65536-t1real;
imp.pau.all=65536-t1pause;
tmr_start();
}
}; |
Или я опять не понял ?
Может, в предыдущем варианте Вам просто надо заремить строчку сложения с минимальным значением ?
Но тогда градация изменится, перед заходом в рабочий цикл нужно восстановить...
|
|
|
|
22.04.2009, 09:56
|
|
Временная регистрация
Регистрация: 18.11.2004
Сообщений: 63
Сказал спасибо: 1
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Вот разобрался где накосячил :
Код:
|
//теперь берем от этого числа 10 часть для определения
//градации регулировки 3 резистором
s.na=tperiod/10;
// делим на 256
s.na››=8; // получили градацию для 3 резистора
//считываем значение 3 резистора
t1min=readr3(s.na); |
Кусок кода переносил в рабочий цикл ,и получалось что здесь
Код:
|
//вычисляем градацию для 2 резистора
s.real=tperiod-t1min; // общий период - минимальная длительность |
t1min оказывалась неопределеной величиной
Теперь верхний кусок не удалял , а добавил в рабочий цикл , а этот до рабочего цикла закомментил и всё пошло правильно , теперь разбираюсь с задержкой ,вопросы скорее всего ещё будут .
Спасибо большое что тратишь на меня своё время , теперь я не чувствую себя полным бараном , начинаю немного понимать что к чему .
|
|
|
|
22.04.2009, 18:25
|
|
Временная регистрация
Регистрация: 18.11.2004
Сообщений: 63
Сказал спасибо: 1
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Теперь с выдержкой запутался вот здесь
Код:
|
//ожидаем возврата 2 резистора в 0 положение
//вернули, запускаем задержку от 4 резистора
/*задержка будет в милисекундах -
градация 10000 милисекунд на 256 -39 милисекунд
*/
tdelay=readr4(39);
delay_ms(tdelay); |
считывание оставляю на месте , а delay_ms(tdelay); комментю и вставляю его в рабочий цикл , получается задержка на каждое изменение 2 резистора , а задержка нужна только при переходе 2 резистора из нуля ,на остальное изменение задержка не нужна .
Тогда ставлю ещё одно условие в рабочем цикле
Код:
|
if (t1real ‹ 5)
{
goto label //метку ставлю ниже delay_ms(tdelay)
}
else{
delay_ms(tdelay);
} |
и ничего не выходит .
Потом начинаю понимать что это условие никогда не выполнится , если резистор в нуле то таймер стоит .
Подскажи как можно реализовать задержку только от нуля .
|
|
|
|
23.04.2009, 11:02
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
А что Вам мешает поставить задержку здесь ?
if (t1real ‹ 5)
{
tmr_stop();
delay_ms(tdelay);
}
После окончания задержки программа выскакивает из скобок и должна анализировать 2 резистор. Если он отличный от 0, то сюда она не заходит, а стартует таймер.
|
|
|
|
23.04.2009, 16:48
|
|
Временная регистрация
Регистрация: 18.11.2004
Сообщений: 63
Сказал спасибо: 1
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Точно , зачем было городить ещё один цикл , тут я лоханулся .
Почему то когда Вы подсказываете всё становится на свои места , и мало того всё становится понятным даже мне , ещё и думаю почему это я сам не догнал .
И , я надеюсь , последний вопрос : промодулировать t1real 5кГц(прямоугольный) на любой выход , т.е. импульс-на выходе 5кГц , пауза-на выходе ничего .
|
|
|
|
23.04.2009, 23:17
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
Для заполнения используем ШИМ - 2 таймер в режиме fast pwm. Taймер 2- 8 разрядный, частоту на вход через делители подадим 1 мегагерц, следовательно нужный период - 5 килогерц, для этого 1 мегагерц нужно разделить на 200. 256 - 200 = 56, делаем прерывание по переполнению, и в тот момент, когда таймер досчитал до 255 и перевалился в 0, запишем в него число 56. Так получим нужный период - он будет считать от 56 до 256.
Длительность импульса - должен быть меандр получаем как среднее значение - т.е. 256-56 делим на 2, получается 100, к числу 56 начальному добавляем эту сотню и получаем 156, которое заносим в OCR2.
Ну и чтобы не рвать импульс в момент перехода, анализируем в прерывании 2 таймера, можно ли это делать. Если можно, останавливаем 2 таймер, обнуляя регистр.
Код:
|
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
if(!BITTST1(bit_pole,impu))
{
TCCR2=0;
}
else{
TCNT2=58;
}
} |
Почему число 58, а не 56 ? Отработка прерывания тоже занимает время, так точнее.
И.соответственно, взводится 2 таймер в условии 1 -
Код:
|
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
if(!BITTST1(bit_pole,impu)) // если импульса нет, его нужно включить
{
BITSET(bit_pole,impu);// ставим флаг
PORTD=0xFF; // светим
TCCR2=0x7a;
TCNT2=58;
TCNT1H=imp.imp.st.hi;
TCNT1L=imp.imp.st.lo;
} |
Ну и проект...
Прикрепленный файл: 403503.rar
|
|
|
|
24.04.2009, 12:46
|
|
Временная регистрация
Регистрация: 18.11.2004
Сообщений: 63
Сказал спасибо: 1
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Спасибо огромное , всё шевелится как нужно , всё понятно , не то-что в книжках описано , чем больше читаю тем меньше понимаю . Так что Вам можно книги писать , я думаю даже новичок как я поймёт .
|
|
|
|
24.04.2009, 13:25
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
Насчет книг... Посмотрел на количество просмотров этой темы... Как-то даже странно при таком количестве апноутов для той же меги...Программы, которые написали не Вася Пупкин или urry, а профессионалы в своем деле.
Но - на англицком все.
Выпустить бы книгу - перевод апноутов - наверняка пользовалась бы спросом, особенно если комменты от себя добавить подробнее. Чем объясняется популярность того же Евстигнеева - там просто перевод даташита ?
Ну это все лирика.
|
|
|
|
24.04.2009, 17:57
|
|
Временная регистрация
Регистрация: 18.11.2004
Сообщений: 63
Сказал спасибо: 1
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Сообщение от urry
|
Посмотрел на количество просмотров этой темы...
|
Может простое любопытство , собеседников то раз-два и обчёлся .
Цитата:
|
Выпустить бы книгу - перевод апноутов - наверняка пользовалась бы спросом, особенно если комменты от себя добавить подробнее.
|
Мечта для новичка .
Ещё раз спасибо не только за программу , которую я попросил помочь написать , а сам бессовестно ничего не делая слизал Вами написаную , а ещё и за то что анализируя ваш код начал хоть что-то понимать , и это стало так интересно , так что сделаю ещё одну попытку победить книгу Лебедева , с самого начала , а не там где мне надо было .
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 18:25.
|
|