Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
18.04.2007, 18:05
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
Сообщение от andrey-u
|
TMR0 даст большую погрешность так как при кварце 20МГц и предделителе 256--получим погрешность до 2мсек
а это уже много
|
а что мешает поставить меньший пределитель...
я бы прерывания сделал так -
Код:
|
void interrupt tmr_pb7(void)
{
if(T0IE && T0IF)
{
T0IE=0;// запрещаем прерывания
T0IF=0;
TMR0=235;
st++;// увеличиваем значение счетчика
T0IE=1;
}// отпускаем прерывание
if(RBIE && RBIF)// произошло прерывание по пб7
{
if (in_bit == 1)// произошло срабатывание по фронту
{
GIE=0;// запрещаем прерывания
T0IF=0;
st=0; // обнуляем счетчик
T0IE=1;// запускаем таймер0
TMR0=235;// устанавливаем 100 микросекунд
INTEDG=0;//разрешаем прерывания по спаду импульса
RBIF=0;// чистим флаг
GIE=1;// общее разрешение прерывания
}
if (in_bit == 0)// произошло срабатывание по спаду
{
T0IE=0;
RBIE=0;
GIE=0;// запрещаем прерывания
// в счетчике st - нужное значение
}
}
} |
эти значения для 4 - мегагерц.
|
|
|
|
18.04.2007, 18:08
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
Сообщение от CERGEI1982
|
знаю только ассамблер,есть желание перейти на более высокий язык програмирования.
|
hттp://www.remexpert.com/forum/dload.php?action=file&file_id=324
|
|
|
|
18.04.2007, 18:14
|
|
Частый гость
Регистрация: 27.11.2006
Сообщений: 11
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
Пишу компилятором MicroCode Studio Plus.
Он делает несколько файлов--один из них asm,и hex.
В протеусе выбираешь микроконтроллер потом тыкаешь на него и указываешь частоту кварца и путь к hex файлу.
Есть другие компиляторы простенький CH Basic - Flash Edition V3.7.0--сразу генерит и показывает как это будет в asemblere --тока hex файл негенерит сволочь, а еще есть mikroBasic--сначало мне очень понравился позволяет отлаживать пошагово и показывает сколько при этом проходит времени--но очень непонравился преобразование числа в строку для вывода на экран, зато очень много примеров и хороший help
Могу выложить если заинтересует.
Кстати может ты подскажешь:
если нужно делать прерывание каждые 0,1 мсек через таймер TMR1 используя кварц на 20МГц--в счетчик прописываю начальное значение 65036--правильно???
т.е. получается 65536-65036=500
20МГц /4=5МГц
5МГц /500=10000 -- т.е. 0,1мсек получается
|
|
|
|
18.04.2007, 18:37
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Сообщение от urry
|
Сообщение от CERGEI1982
|
знаю только ассамблер,есть желание перейти на более высокий язык програмирования.
|
hттp://www.remexpert.com/forum/dload.php?action=file&file_id=324
|
еще бы объяснение что это?
MicroCode Studio Plus у меня есть,посидеть поразбиратся надо потихоньку.Буду спрашивать если что не получится
|
|
|
|
18.04.2007, 18:41
|
|
Частый гость
Регистрация: 27.11.2006
Сообщений: 11
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
Цитата:
|
andrey-u писал(а):
TMR0 даст большую погрешность так как при кварце 20МГц и предделителе 256--получим погрешность до 2мсек
а это уже много
а что мешает поставить меньший пределитель...
я бы прерывания сделал так -
Код:
void interrupt tmr_pb7(void)
{
if(T0IE && T0IF)
{
T0IE=0;// запрещаем прерывания
T0IF=0;
TMR0=235;
st++;// увеличиваем значение счетчика
T0IE=1;
}// отпускаем прерывание
if(RBIE && RBIF)// произошло прерывание по пб7
{
if (in_bit == 1)// произошло срабатывание по фронту
{
GIE=0;// запрещаем прерывания
T0IF=0;
st=0; // обнуляем счетчик
T0IE=1;// запускаем таймер0
TMR0=235;// устанавливаем 100 микросекунд
INTEDG=0;//разрешаем прерывания по спаду импульса
RBIF=0;// чистим флаг
GIE=1;// общее разрешение прерывания
}
if (in_bit == 0)// произошло срабатывание по спаду
{
T0IE=0;
RBIE=0;
GIE=0;// запрещаем прерывания
// в счетчике st - нужное значение
}
}
}
эти значения для 4 - мегагерц.
|
Это при каком предделителе??
по моим расчете получается предделитель =5--а такого быть неможет
считаем
прерывание каждые 100мксек=0,1мсек
тоесть за одну секунду 10000 прерываний
так как в TMR0 пишешь 235 то получается что на TMR0 приходят импульсы с частотой 10000*20=200КГц
20=255-235
так как на предделитель приходит сигнал с частотой кварца/4 то при обратном пересчете получаем частоту кварца 200КГц*4=800КГц
Так как автор указал частоту кварца 4Мгц--то значит был установлен предделитель
считаем коэффициент предделителя
4МГц/800КГц=5
Насколько я знаю тако предделитель нельзя установить ---значит либо ошибся автор либо ошибаюсь Я--прошу указать мою ошибку
|
|
|
|
18.04.2007, 18:50
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
65536-65036=500 циклов,при частоте 20 мгц один цикл равен 20/4=5мгц и время одного цикла равно тогда 1/5=200нсек.умножаем на 500*0.2=100мкс=0.1 мс до переполнения таймера и уход в прерывание.
А зачем тебе? если измерять длительность импульса то можно сделать на компараторах.когда будет прерывание от компаратора при фронте включаеш таймер и отсчитываеш(если большое время ,то инкременируеш регистр или два,смотря какая длительность сигнала и предделитель),как только произошел спад компаратор снова выдает прерывание считываеш и преобразуеш в десятично двоичный код и выдаеш на жки.
|
|
|
|
18.04.2007, 18:58
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.05.2006
Адрес: Москва
Сообщений: 3,559
Сказал спасибо: 76
Сказали Спасибо 326 раз(а) в 230 сообщении(ях)
|
Сообщение от andrey-u
|
В протеусе выбираешь микроконтроллер потом тыкаешь на него и указываешь частоту кварца и путь к hex файлу.
|
PROTEUS настоятельно рекомендует чтоб файлы были в папке проекта - proteus123.narod.ru/01.htm
__________________
Обучалка AVR PIC ARM начинающим программирование курс самоучитель шаг за шагом с нуля, CVAVR, PROTEUS, MPLAB, WinAVR, IAR, KEIL электроника - http://proavr.narod.ru
|
|
|
|
18.04.2007, 19:00
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Сообщение от avr123-nm-ru
|
Сообщение от andrey-u
|
В протеусе выбираешь микроконтроллер потом тыкаешь на него и указываешь частоту кварца и путь к hex файлу.
|
PROTEUS настоятельно рекомендует чтоб файлы были в папке проекта - proteus123.narod.ru/01.htm
|
это само собой
|
|
|
|
18.04.2007, 19:11
|
|
Частый гость
Регистрация: 27.11.2006
Сообщений: 11
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
Цитата:
|
CERGEI1982 Добавлено: Ср Апр 18, 2007 5:50 pm Заголовок сообщения:
--------------------------------------------------------------------------------
65536-65036=500 циклов,при частоте 20 мгц один цикл равен 20/4=5мгц и время одного цикла равно тогда 1/5=200нсек.умножаем на 500*0.2=100мкс=0.1 мс до переполнения таймера и уход в прерывание.
А зачем тебе? если измерять длительность импульса то можно сделать на компараторах.когда будет прерывание от компаратора при фронте включаеш таймер и отсчитываеш(если большое время ,то инкременируеш регистр или два,смотря какая длительность сигнала и предделитель),как только произошел спад компаратор снова выдает прерывание считываеш и преобразуеш в десятично двоичный код и выдаеш на жки.
|
Я с тобой полностью согласен и делаю вроде так же--но невыходит при длительности 0,5сек у меня выдает 150 прерываний тоесть 15мсек
И согласись здесь неполучается так
Цитата:
|
Код:
void interrupt tmr_pb7(void)
{
if(T0IE && T0IF)
{
T0IE=0;// запрещаем прерывания
T0IF=0;
TMR0=235;
st++;// увеличиваем значение счетчика
T0IE=1;
}// отпускаем прерывание
if(RBIE && RBIF)// произошло прерывание по пб7
{
if (in_bit == 1)// произошло срабатывание по фронту
{
GIE=0;// запрещаем прерывания
T0IF=0;
st=0; // обнуляем счетчик
T0IE=1;// запускаем таймер0
TMR0=235;// устанавливаем 100 микросекунд
INTEDG=0;//разрешаем прерывания по спаду импульса
RBIF=0;// чистим флаг
GIE=1;// общее разрешение прерывания
}
if (in_bit == 0)// произошло срабатывание по спаду
{
T0IE=0;
RBIE=0;
GIE=0;// запрещаем прерывания
// в счетчике st - нужное значение
}
}
}
эти значения для 4 - мегагерц.
|
автор наверно забыл про то что на TMR0 подается Fкварца /4
|
|
|
|
18.04.2007, 19:52
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
Да неужели ?
Забыл сказать, что option =1
Кстати, для 20 мегагерц при этом же пределителе таймер должен быть -134...
-- Прилагается рисунок: --
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 05:50.
|
|