Мелкие вопросы по МК и ПЛИС.
- -= Александр =-
- Нашел транзистор. Понюхал.
- Сообщения: 174
- Зарегистрирован: Пн дек 10, 2007 12:19:18
- Откуда: Санкт-Петербург
- Контактная информация:
-
pirotehnick
- Потрогал лапой паяльник
- Сообщения: 327
- Зарегистрирован: Пт фев 08, 2008 13:46:03
- Откуда: Воронеж
- Контактная информация:
Вот мой программатор, он самый простой, даже без всякой защиты, хотя пока работает нормально. Только вот сама плата немного криво конвертировалась в pdf (в компасе ещё тогда чертил), небольшие зазоры между дорожками получились.
- Вложения
-
- stk200.rar
- (143.05 КБ) 262 скачивания
Пишу часы + датчики температуры.
Для подсчета времени используется прерывание таймера(увеличиваю счетчик секунд). Все остальное делается в основном бесконечном цикле. В том числе идет опрос датчиков температуры по 1wire. Во время опроса датчиков, необходимо запрещать прерывание. Насколько я понимаю, возможно получение пропуска/задержку прерывания подсчета секунд(т.е. могу получить ошибку подсчета времени если прерывание должно произойти в тот момент, когда они запрещены для опроса датчиков). Как в таких случаях принято поступать? как-то синхронизировать возникновение прерываний и опрос датчиков температуры и опрашивать датчики между прерываниями(например сразу после прерывания так чтобы успеть до следующего, подобрав "тики"/периоды прерывания так, чтобы гарантировано успеть между ними) или ест еще способы? Интересно как принято поступать в тех случаях, когда есть необходимость на относительно продолжитеное время запретить прерывания, но в тоже время не внести(или как-то скомпенсировать после) ошибку подсчета времени.
Для подсчета времени используется прерывание таймера(увеличиваю счетчик секунд). Все остальное делается в основном бесконечном цикле. В том числе идет опрос датчиков температуры по 1wire. Во время опроса датчиков, необходимо запрещать прерывание. Насколько я понимаю, возможно получение пропуска/задержку прерывания подсчета секунд(т.е. могу получить ошибку подсчета времени если прерывание должно произойти в тот момент, когда они запрещены для опроса датчиков). Как в таких случаях принято поступать? как-то синхронизировать возникновение прерываний и опрос датчиков температуры и опрашивать датчики между прерываниями(например сразу после прерывания так чтобы успеть до следующего, подобрав "тики"/периоды прерывания так, чтобы гарантировано успеть между ними) или ест еще способы? Интересно как принято поступать в тех случаях, когда есть необходимость на относительно продолжитеное время запретить прерывания, но в тоже время не внести(или как-то скомпенсировать после) ошибку подсчета времени.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
во-первых, если прерывания запрещены менее, чем на интервал между двумя прерываниями таймера, то потери не произойдет, произойдет задержка счета, но сам счет не собъется.
во-вторых, кто вам сказал, что на время работы с 1-wire нужно запрещать прерывания?! нужно запрещать только на время приема-передачи одного бита, а это всего-навсего несколько микросекунд...
во-вторых, кто вам сказал, что на время работы с 1-wire нужно запрещать прерывания?! нужно запрещать только на время приема-передачи одного бита, а это всего-навсего несколько микросекунд...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
-
pirotehnick
- Потрогал лапой паяльник
- Сообщения: 327
- Зарегистрирован: Пт фев 08, 2008 13:46:03
- Откуда: Воронеж
- Контактная информация:
oleg1 писал(а):а если не секрет чем это черевато? (без защиты) от чего и что она защищает?
и можно ли ещё принципиальную схемку этого прогроматора с подписью всех элементов схемы...
имеется ввиду нет промежуточного буфера как в классическом программаторе STK200, т.е. выводы МК напрямую подключаются к линиям порта LPT, хотя я здесь поставил токоограничивающие резисторы по 150 Ом. Вообще конечно не следует напрямую подрубать контроллер к порту, т.к. LPT вообще достаточно чувствителен к нагрузкам и случайно можно его спалить, хотя это редкость. Я вот до сих пор шью этим программатором, и вроде бы всё в порядке.
А вообще лучше сделай нормальный STK200.
Всё хочу себе спаять нормальный параллельный программатор
http://radiokot.ru/forum/viewtopic.php?t=864
и тебе советую.
Что касается схемки, то у меня её просто нет, а чертить чего-то не охото.
При разработке платы я опирался на схему подключения, представленную сдесь:
http://myrobot.ru/stepbystep/mc_programmer.php
там где нарисовано какие ноги надо соединять.
у меня в схеме содержаться: стабилизатор питания (7805), кондюры для его подключения, батарейка (крона 9 В), светодиод, кварц (8 МГц)... ну и всё, я ещё сделал 2 панелькти на DIP28 и DIP40 что бы можно ещё было 16 и 32 мегу шить, вообщем просто посмотри куда чего идёт, там всё понятно.
Если нужно могу ещё файл компаса скинуть (сам чертёж).
ARV писал(а):во-первых, если прерывания запрещены менее, чем на интервал между двумя прерываниями таймера, то потери не произойдет, произойдет задержка счета, но сам счет не собъется.
потери прерывания не произойдет? правильно я понял? а произошедшая задержка внесет погрешность в подсчет?
ARV писал(а):во-вторых, кто вам сказал, что на время работы с 1-wire нужно запрещать прерывания?! нужно запрещать только на время приема-передачи одного бита, а это всего-навсего несколько микросекунд...
т.е. максимум что я могу получить, что возможную задержку прерывания на несколько микросекунд, что может дать погрешность?
Если я использую прерывание таймера по переполнению, то чтобы скомпенсировать эту задержку, могу ли я считать значение регистра счетчика(например TCNT2) во время прерывания и если оно не равно 255, то прибавить это значение к тому, которое я подставляю во время прерывания? т.е. сделать что-то типа:
было TCNT2=0x83; а изменить на TCNT2=TCNT2+0x83;
или мы не о том говорим?
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
кто вам сказал про погрешность? по-моему, я ясно выразился: если запрет на короткое время - произойдет небольшая задержка подсчета, но сам счет не нарушится. нарисую образно:
без запрета:
0------1-------2-------3-------4-------5-------6----
с запретом (момент запрета обозначен плюсом):
------++----------++----------++----------
0---------1----2----------2----4----------5----6----
видно, что при запрете каждое второе прерывание запаздывает, но сам счет не искажается...
без запрета:
0------1-------2-------3-------4-------5-------6----
с запретом (момент запрета обозначен плюсом):
------++----------++----------++----------
0---------1----2----------2----4----------5----6----
видно, что при запрете каждое второе прерывание запаздывает, но сам счет не искажается...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
это значения вашего счетчика секунд
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
ARV писал(а):это значения вашего счетчика секунд
что-то я окончательно запутался. К примеру, я предделителями выставляю частоту таймера 125кГц,
далее создаю прерывание по переполнению:
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
TCNT2=0x83;
msec++;
}
т.е. увеличиваю msec раз в 1ms
насколько я понял, если при подходе TCNT2 к переполнению(т.е. 255) я запрещу прерывания, то при переполнении выставится флаг переполнения, но прерывание не произойдет, потом, после разрешения прерываний, возникнет прерывание но TCNT2 будет уже например =10... в прерывании я его устанавниваю в 0x83, т.е. 10 тиков из 125 я потерял и получил погрешность? или нет? или для часов нужно как-то по другому использовать прерывания?
Telek писал(а):...или для часов нужно как-то по другому использовать прерывания?
Я думаю вам действительно лучше использовать прерывания по-другому. Например так:
1. Использовать вместо прерывания по переполнению таймера прерывания по совпадению регистра TCNT с регистром сравнения (OCR), в котором должна быть временнАя константа (в вашем случае наверное 0х83).
2. Настроить таймер так, чтобы при достижении сравнения происходил сброс таймера.
При таких действиях таймер после возникновения условия прерывания (при совпадении счетчика тиков с регистром сравнения) счетчик тиков обнулится и счет продолжится с 0. Причем для обнуления не обязателен вход в обработчик прерывания. Таким образом не будет погрешности подсчета, возможна только задержка подсчета милисекунд. И последнее, главное чтобы прерывания не были запрещены на длительное время - такое чтобы за это время не возникло двух прерываний от таймера.
Извините за тупой вопрос,
DDRD = 0x7F; //111 1111 все ножки порта D на выход
PORTD = 0x00;//111 1111 на все ножки порта D 0 вольт
в чем отличие если написать
PORTD = 0x00;//111 1111 на все ножки порта D -5 вольт
по сути там -5 вольт?
подключив к ножке порта D вольтметр и к +5 вольтам вольтметр покажет что на ножке порта D -5 вольт, так зачем писать что там 0 вольт?
DDRD = 0x7F; //111 1111 все ножки порта D на выход
PORTD = 0x00;//111 1111 на все ножки порта D 0 вольт
в чем отличие если написать
PORTD = 0x00;//111 1111 на все ножки порта D -5 вольт
по сути там -5 вольт?
подключив к ножке порта D вольтметр и к +5 вольтам вольтметр покажет что на ножке порта D -5 вольт, так зачем писать что там 0 вольт?
-
BerZerK-ku
- Мучитель микросхем
- Сообщения: 492
- Зарегистрирован: Вт июл 22, 2008 08:10:54
yaotzin писал(а):Извините за тупой вопрос,
DDRD = 0x7F; //111 1111 все ножки порта D на выход
PORTD = 0x00;//111 1111 на все ножки порта D 0 вольт
в чем отличие если написать
PORTD = 0x00;//111 1111 на все ножки порта D -5 вольт
по сути там -5 вольт?
подключив к ножке порта D вольтметр и к +5 вольтам вольтметр покажет что на ножке порта D -5 вольт, так зачем писать что там 0 вольт?
Че-то сути вопроса не понял.
Отличие записи DDRD=..; PORTD=..; и просто PORTD=.. в том, что в первой записи указаны направления порта вход/выход, а во-второй, вроде, все порты будут по умолчанию настроены на вход.
-5В конечно же можно выставить на выходе, если измерять относительно напряжения питания. А вот по отношению к земле будет либо 0, либо +5В.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
наиболее простое решение - выполнить "замер" в отладчике, например, AVR Studio. другой способ - анализ листинга, но это очень трудоемкий и требующий высокой внимательности способ (если, конечно, не примитивные операторы надо замерить, а циклы или условия, например).KIP писал(а):Подскажите, как подсчитать количество времени, требуемое процессору на выполнение операций прописанных в конкретном коде программы на СИ?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- tych
- Э...
- Сообщения: 2792
- Зарегистрирован: Ср апр 04, 2007 08:39:14
- Откуда: Москва
- Контактная информация:
yaotzin писал(а): зачем писать что там 0 вольт?
Затем чтоб не дописывать у каждого напряжения относительно чего оно измерялось ! - по умолчанию базовым напряжением является напряжение на GND. Смотрите стр.2 в моей домашней страничке - там это растолклвано.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
yaotzin писал(а):Извините за тупой вопрос,
DDRD = 0x7F; //111 1111 все ножки порта D на выход
PORTD = 0x00;//111 1111 на все ножки порта D 0 вольт
в чем отличие если написать
PORTD = 0x00;//111 1111 на все ножки порта D -5 вольт?
Просто запись в PORTD ничего не значит, надо выбирать каким образом +5 или 0 будут соединены с ножкой порта.
Выбирается это как раз записью 0 или 1 в регистр DDRD