[image]

Курс: программирование AVR - часть IV

 
1 6 7 8 9 10 11 12
RU termostat #08.01.2005 02:27
+
-
edit
 

termostat

аксакал

mishok>Непонятно как завести сигнал с переменника на АЦП(нужны говорят усилители и ограничительные диоды).
 


Напряжение нужно подавать на ножку МК - допустимый диапазон этого напряжения указан в ДатаШите и в задаче 5 курса.

Напряжения то разные бывают, а у тебя вопрос большой а главного нет - каков диапазон измеряемого напряжения?
   
RU termostat #08.01.2005 02:35
+
-
edit
 

termostat

аксакал

coolnik>У меги169 в порте F (четыре старших бита) на выводах постоянно высокий уровень, не зависимо от того, что записано в PORTF. Чего я только не делал - тщетно.
 


Проверь в ДатаШите - какие побочные функции у этих ног МК - может они по умолчанию так себя ведут?

Опубликуй твой код какойнить ткстовой програмки для PORTF - типа переключение 1 - 0 - 1 с паузами и т.д. - посмотрим.
   
Это сообщение редактировалось 08.01.2005 в 03:31
+
-
edit
 

mishok

новичок
termostat>Напряжение нужно подавать на ножку МК - допустимый диапазон этого напряжения указан в ДатаШите и в задаче 5 курса.
 


Как и упомянуто в задаче № 5 курса, допустимый диапазон напряжения - от 0 до напряжения на ножке AREF, на которой в свою очередь AGND<AREF<AVCC, а AVCC не должно отличаться от VCC более чем на 0,3 вольта.
В моем ТЗ сказано, что на вход АЦП должно подаваться напряжение от 0 до 100Мв(многговато непарвда ли? )
Как сказано в курсе
Изменить этот диапазон можно с помощью делителя на резисторах или внешнего усилителя на ОУ (Операционный Усилитель).
 

Вот только непонятно, как это будет выглядеть на принципиальной схеме.
Еще наткнулся в ДШ на шумоподавляющую функцию АЦП. Нужная ли вообще это штука, и хотелось бы знать улучшатся ли результаты измерений при реализации этой функции( необходим кусок кода для ее реализации, если не затруднит).
Буду очень признателен за любого рода инфу.


   
+
-
edit
 

mishok

новичок
Кстати еще хотел спросить, если мы хотим чтоб сопротивление на входе АЦП изменялось от 0 до 5 В, то потенциометр какого номинала нужно ставить?

P.S. Не судите мя строго я еще совсем новичок.
   
+
-
edit
 

coolnik

новичок
да. Все работают на выход.
DDRF=0xff;



   
+
-
edit
 

coolnik

новичок
Спасибо!
В очередной раз все проблемы решил даташит.(закон подлости. хоть и читаешь его, но пока не посоветуют решение поискать в нем - ничего не находится)
Эти ноги - выводы JTAG интерфейса. Когда он активен (а он, гад, активен по-умолчанию), они не могут использоваться для i/o. Сбросил JTAGEN и всё ОК!
   
RU termostat #09.01.2005 12:41
+
-
edit
 

termostat

аксакал

mishok >
Вот только непонятно, как это будет выглядеть на принципиальной схеме.
 


mishok > если мы хотим чтоб сопротивление на входе АЦП изменялось от 0 до 5 В, то потенциометр какого номинала нужно ставить?

...я еще совсем новичок.
 


Да это видно из твоих вопросов, но все были новичками, а конференция и курс как раз для того чтоб спросить.

Тебе ОЧЕНЬ нужно скачать книгу:
"Искусство схемотехники" П.Хоровиц, У.Хилл.
- это библия электронных схем.

LordN: Книги и софт с Walla.com (там множество литературы!)

Если ты ее купишь в магазине то тебе будет удобней читать.

далее скачай ДатаШит на ОУ (Операционный Усилитель) AD8541 с сайта Analog.com и АпликейшнНоуты к нему.

Тебе нужно усилить входной сигнал от 0_100 мв до диапазона 0_5 вольт - значит тебе нужен НЕинвертирующий усилитель с коэф. усиления 50.

Посмотри в ТЗ кокое входное сопротивление должно иметь твое устройство - возьми ткой потенциометр и входной сигнал подавай на него, а с движка потенциометра сигнал подавай прямо на вход "+" ОУ.

С выхода ОУ на вход "-" пусти резистор в 49 раз больший чем с входа "-" на "землю". и выход ОУ подключи на ножку АЦП МК.

   
+
-
edit
 

mishok

новичок
Спасибо за помощь, но у меня опять-таки чайниковский вопросик:
при программировании МК на RESET подается 0, а потом мк перезапускается подачей VCC, и в рабочем режиме на RESET подаем VCC, скажите так ли это?
А то я совсем запутался.
   

Yuran

опытный

mishok>Спасибо за помощь, но у меня опять-таки чайниковский вопросик:
mishok>при программировании МК на RESET подается 0, а потом мк перезапускается подачей VCC, и в рабочем режиме на RESET подаем VCC, скажите так ли это?
mishok>А то я совсем запутался.[»]

Я советую тебе всегда внимательно читать datasheet, там ответы на все вопросы и ньюансы связанные с конкретным устройством. Логика простая

Reset input. A low level on this pin for more than 50 ns will generate a reset, even if the clock is not running. Shorter pulses are not guaranteed to generate a reset.
оответсвенно чтобы исключить перезапуск чипа, вывод reset в устройстве соединяется с питанием Vcc, чтобы на нём всегда был высокий уровнь.
При программировании чипа есть специальная последовательность для уровней на линиях, поэтому всё ОК. Читай datasheet =)
:)
   
+
-
edit
 

coolnik

новичок
Ещё вопрос. Давно терзает уже, а сам решение никак не найду:

Как снизить или исключить влияние таймеров друг на друга?

90S8535. Кварц 16Мгц. Есть три таймера, обработчики прерываний по переполнению которых выполняют:

Первый:
выдаёт импульсы с периодом 3 мкс в порт D и считает, сколько их выдалось.

Второй:
Выдаёт импульсы в порт С с периодом 10 мкс и выполняет пару операций на несколько тактов.

Третий:
Выдает импульсы в порт А с периодом 100 мс.

Эмулирую в VMlab, получается нездоровщина какая-то. То прерывания только от одного таймера идут, от остальных нет. То импульсы по длительности разные получаются.
Да и вообще, невозможно рассчитать частоту возникновения прерывания, т.к. частота прерываний одного таймера влияет на частоту другого.

Как узнать, какому таймеру соответствует каждая из приведенных выше задач. От чего отталкиваться? От привилегий прерывания или размера подпрограммы обработчика прерывания или еще от чего?
Прикреплённые файлы:
 
   

KIT.

новичок
coolnik>Ещё вопрос. Давно терзает уже, а сам решение никак не найду:
coolnik>Как снизить или исключить влияние таймеров друг на друга?
coolnik>90S8535. Кварц 16Мгц. Есть три таймера, обработчики прерываний по переполнению которых выполняют:
coolnik>Первый:
coolnik>выдаёт импульсы с периодом 3 мкс в порт D и считает, сколько их выдалось.
coolnik>Второй:
coolnik>Выдаёт импульсы в порт С с периодом 10 мкс и выполняет пару операций на несколько тактов.
coolnik>Третий:
coolnik>Выдает импульсы в порт А с периодом 100 мс.
А может воспользоваться одним таймером?
   
+
-
edit
 

coolnik

новичок
что-то никак не представлю, как оно будет выглядеть. Можно пример с кодом?

Если делить часоту софтварно, типа после возникновения каждого третьего прерывания с периодом 3 мкс считать, что прошло 10 мкс и выполнять следующее задание, то в результате все задания должны уложиться в 3 мкс, чтобы успеть выполниться до следующего прерывания.
Поправьте, если не прав или не так понял.
Вообще-то, использовать один таймер было бы просто замечательно, с удовольствием бы взял в таком разе МК попроще.
   
+
-
edit
 

mishok

новичок
Здравствуйте, господа.
Опять к вам с вопросом, теперь уже по поводу VMLAB, подрубил потенциометр ко входу AT90s8535(все как в курсе), диодики(8) к порту В, и используя UART передаю в писюк. В окошке Rx появляется результат, который ксати говоря не всегда радует. Есть ли какой-нибудь способ, отформатировать выводимые данные в dec(пробовал, мало что получилось). А то не очень то красиво...
Ну дак вот отображаю изменение напряжения с потенциометра, и хотелось бы для наглядности получать такую же зависимость для выходного сигнала. Насколько я понимаю в результате после записи в UDR, результат преобразования будет на ноге PD1, так ли это? Пытаюсь в осциллографе посмотреть что на этой ноге творится- сплошные !-!-!-!-!-!-!, только горизонтальные палки-вверху. Короче неясно что делать.
Привожу код(он весь из курса)...
Буду очень вам признателен за быстрый ответ, кусовик горит...(
Прикреплённые файлы:
1.txt (скачать) [423 Б]
 
 
   
RU termostat #10.01.2005 04:50
+
-
edit
 

termostat

аксакал

Попробуй писать сообщения в офф-лайне неспеша. Набери текст, прочитай его внимательно. Если самому понятно что ты спршиваешь то отпрвляй в конфу.

О переводе в десятичный вид есть в курсе: задача 4 (почти конец) и еще обсуждали несколько страниц назад.

в VMLAB есть модель ОУ (идеального). так что ты все свое устройство можешь смоделировать.
   

+AlS+>Может всетаки глюк Algorithm Builder

Очень может быть, какая версия?

 

coolnik>Первый:
coolnik>выдаёт импульсы с периодом 3 мкс в порт D и считает, сколько их выдалось.
coolnik>Второй:
coolnik>Выдаёт импульсы в порт С с периодом 10 мкс и выполняет пару операций на несколько тактов.
coolnik>Третий:
coolnik>Выдает импульсы в порт А с периодом 100 мс.
coolnik>Эмулирую в VMlab, получается нездоровщина какая-то. То прерывания только от одного таймера идут, от остальных нет. То импульсы по длительности разные получаются.
coolnik>Да и вообще, невозможно рассчитать частоту возникновения прерывания, т.к. частота прерываний одного таймера влияет на частоту другого.
coolnik>Как узнать, какому таймеру соответствует каждая из приведенных выше задач. От чего отталкиваться? От привилегий прерывания или размера подпрограммы обработчика прерывания или еще от чего?[»]

Если по порядку то нужно это делать аппаратно ж-) Дело в том что все таймера (ну или почти все) на атмелах позволяют формировать фронты на соотвествующих ногах портов независимо от работы программы. Т.е. аппаратура контроллера настраивается на простейшее деление по каждому таймеру. Если при этом нехватает аппаратуры, то эммулируется программно. Это один.

Всю выдачу импульсов нужно осуществлять в одном таймере если уж так хочется программно управлять событиями на порту А,В,С от таймеров, тогда исчезнет проблема перекрытия таймеров. А она заметна так как код внутри процедуры обработки прерывания от таймера имеет размер ж-) а значит кол-во тактов тратится при этом. А на каждем такте что?... Правильно на каждом такте внутрений делитель тактовой частоты (который устанавливается для каждого таймера отдельно) будет увеличитваться на +1. Его можно сблокировать, но тогда что...? Получится лакуна величиной в затраченное кол-во тактов на обработку прерывания, в том случае если прерывания запрещены, если же внутри процедуры обработки они разрешены то лакуны будут плавать (я бы сказал не прогнозируемо). Надо не забывать при этом что на вход в прерывание тратися такты, на выход по ret тоже тратится. Если при этом сохранять еще и статус (а это в большинстве случаев просто необходимо делать) то еще такты. Как минимум насчитал уже 10 тактов. Это много больше простой проверки в одной процедуре своего счетчика в любом из регистров (и даже пары регистров). Т.е. r18,r19,r20 это для A,B,C соотвественные задержки, которые надо декрементировать в единственной процедуре обработке любого таймера (пусть 0-го). В этом случае дрейф фронтов ± 1 такт, а это уже не так много.
 
+
-
edit
 

mishok

новичок
termostat> С выхода ОУ на вход "-" пусти резистор в 49 раз больший чем с входа "-" на "землю". и выход ОУ подключи на ножку АЦП МК.
 

Пытаюсь поставить оу и резисторы в VMLAB, как вы объясняли, в общем что-то не то получается. Я просто в замешательстве...(((
А также вопрос по поводу вывода результатов преобразования в писюк( с putchar-ом что -то не получается)остался неразрешенным, дайте ,пожалуйста, ссылочку!!!
Кстати по поводу входного сопротивления устройства в ТЗ ничего не сказано...
Мой курсач пропадает, помогите!!!!
   
RU termostat #10.01.2005 11:54
+
-
edit
 

termostat

аксакал

coolnik> Эмулирую в VMlab, получается нездоровщина какая-то.
 


Я думаю получаешь то что в програму наваял, ищи ошибки, думай...

coolnik> невозможно рассчитать частоту возникновения прерывания, т.к. частота прерываний одного таймера влияет на частоту другого.
 


Таймеры не зависимые устройства, они не могут влиять друг на друга аппаратно. Если прерывания возникют одновременно то это в ДШ "обзор Аркитектуры AVR"
   
+
-
edit
 

mishok

новичок
termostat> Я думаю получаешь то что в програму наваял, ищи ошибки, думай...
 

Уже все что можно было перепробовал:
.MICRO "AT90S8535"
.TOOLCHAIN "GENERIC"
.TARGET "a8535.hex"
.COFF "a8535.cof"
.SOURCE "a8535__.c"
.TRACE
.STORE 1000m;
.CLOCK 3.69meg R1 VDD AREF 1
V1 pot VSS SLIDER_1(0 0.1) ; на концах переменника 0 и 0.1 В
R2 X1 0 2K ; r2-к оу и gnd
R_1 R2 PA0 98K ;r1-к r2 и к мк(ацп)
X1 OPAMP pot R2 PA0;к потенциометру и r2
X_MyRS232 TTY(115200 8) PD0 PD1;
D1 VDD PB0
D2 VDD PB1
D3 VDD PB2
D4 VDD PB3
D5 VDD PB4
D6 VDD PB5
D7 VDD PB6
D8 VDD PB7

.PLOT V(PA0) V(PD1)
   
+
-
edit
 

termostat>Таймеры не зависимые устройства, они не могут влиять друг на друга аппаратно. Если прерывания возникют одновременно то это в ДШ "обзор Аркитектуры AVR"[»]

Маленько ты человека в заблуждение вводишь, он не может понять что прерывание от таймера Б придет на n тактов позже если попадет во время обработки прерывания от таймера А, в случае если прерывания запрещены в обработчике А. А если обработчик А настолько долог по исполнению что придет еще и повтор от А до того как обработчик закончит свою работу, как думаеш что произойдет? Ведь А приоритетней чем Б по обработке.
 
+
-
edit
 

coolnik

новичок
Если по порядку то нужно это делать аппаратно ж-) Дело в том что все таймера (ну или почти все) на атмелах позволяют формировать фронты на соотвествующих ногах портов независимо от работы программы. Т.е. аппаратура контроллера настраивается на простейшее деление по каждому таймеру. Если при этом нехватает аппаратуры, то эммулируется программно. Это один.
 


- дело в том, что помимо выставления уровней на ногах обработчик должен еще выполнять некоторые операции (например инициальзация массива).

Всю выдачу импульсов нужно осуществлять в одном таймере если уж так хочется программно управлять событиями на порту А,В,С от таймеров, тогда исчезнет проблема перекрытия таймеров.
 


Ну никак я не врублюсь, как это можно сделать одним таймером. Наверное, уже зациклился на трёх. Объясните, please с кодом (ну на пару строк хотя бы) или алгоритм действий подробнее опишите. Чисто символически, например:
Каждые 5 мкс – считать до 20 и обратно
Каждые 10 мкс – считать до 50 и обратно
Каждые 10 мс – считать до 100 и обратно
Изменяя при этом уровень в соответствующем порте (чтобы отлаживать проще было)

>Т.е. r18,r19,r20 это для A,B,C соотвественные задержки, которые надо
>декрементировать в единственной процедуре обработке любого таймера
>(пусть 0-го). В этом случае дрейф фронтов ± 1 такт, а это уже не так много.

Можно подробнее? А если подпрограмма не влезла в лимит времени, то так она недовыполниться чтоли?

Я думаю получаешь то что в програму наваял, ищи ошибки, думай...
 


Дык фишка-то в том, что стратегия решения ошибочна. Хотелось бы узнать альтернативные способы выхода из ситуации. Все вот, например, советуют один таймер использовать (правда, фиг знает, как это сделать) ну или что-то типа того. Может как-то можно по привилегиям таймеров задачи раскидать. Например, таймер с наивысшим приоритетом считает чаще. Так короткие импульсы будут стабильнее. Хотя... хех... :huh: наверное, другие таймеры загнутся.

он не может понять что прерывание от таймера Б придет на n тактов позже если попадет во время обработки прерывания от таймера А, в случае если прерывания запрещены в обработчике А. А если обработчик А настолько долог по исполнению что придет еще и повтор от А до того как обработчик закончит свою работу, как думаеш что произойдет? Ведь А приоритетней чем Б по обработке.
 

это понятно... здесь и собака зарыта. Поэтому и хочется что-то новое придумать.


Насколько я понял, установить частоту большую, чем требуется на отработку одного обработчика не получится. В принципе, не важно, какая точно получится частота. Главное, чтобы меандр был ровный. Как избавиться от таких переходов? (картинка приложена).




Прикреплённые файлы:
 
   

Yuran

опытный

Мда... как то обидно за студентов наших... и образование... нужно по всей видимости начинать с нуля, чтобы понять что такое прерывание и их маскирование... B) Толи там не учат нифига, толи народ всю сессию бухает.
   

coolnik>
он не может понять что прерывание от таймера Б придет на n тактов позже если попадет во время обработки прерывания от таймера А, в случае если прерывания запрещены в обработчике А. А если обработчик А настолько долог по исполнению что придет еще и повтор от А до того как обработчик закончит свою работу, как думаеш что произойдет? Ведь А приоритетней чем Б по обработке.
 

coolnik>это понятно... здесь и собака зарыта. Поэтому и хочется что-то новое придумать.
coolnik>Насколько я понял, установить частоту большую, чем требуется на отработку одного обработчика не получится. В принципе, не важно, какая точно получится частота. Главное, чтобы меандр был ровный. Как избавиться от таких переходов? (картинка приложена).[»]

Тады слушай как бы я сделал, точнее ж-) я так делал и в одном таймере у меня обновлялся дисплей с чатотой 85 Гц и обрабатывался меандр генератора (ошгибающая стостяла из нескольких ступеннек).

Ставлю минимальное значение по времени срабатывания таймеру 0 (в твоем случае 5 мкс). Таким образом таймер 0 каждые 5 мкс входит в обработчик EVENT0. Вычисляю 10 мкс как задержку на инкремент для регистра r18 (Получаю 2) загружаю ее до того как разрешу прерывания и работу таймера 0 в r18. ВЫчисляю 50 мкс (получаю 5) гружу там же в r19. Беру r0 за ноль.

EVENT0:
0 -> I
r18--
r19--
? r18 -= r0 ? jmp end10
лял лял код для 10 мкс
end10:
? r19 -= r0 ? jmp end50
лял лял код для 50 мкс
end50:
лял лял код для 5 мкс
reti

Уж извини что так аляповато привык к AlgoritmBuilder но надеюсь что идея понятна? Таким образом 5 мкс может у дрейфовать на длину кода 10 мкс + 50 мкс. Если это критично то вставь его в начало обработчика. Но 50мкс будет дрейфовать на длину кода 10 мкс всегда.
 
Yuran>Мда... как то обидно за студентов наших... и образование... нужно по всей видимости начинать с нуля, чтобы понять что такое прерывание и их маскирование... B) Толи там не учат нифига, толи народ всю сессию бухает.[»]

Это не выход запрещать отдельно каждые таймера. Потому как 5 мкс таймер может только и делать то запрещать прерывание от двух других в то время как таймер ниже по приоритету будет честно пытаться выставить свое прерывание. Тут либо сбрасывать нужно прескаллер (что ну очень гиморойно, так как он буквально в следующем же такте начнет нарастать). И все равно это ничего не даст. И маскировка ничего не даст. Это только на IBM PC можно циклически менять приоритет у прерываний а в AVR такой штуки нет. Старший тот который старший хоть тресни.
 
AD Реклама Google — средство выживания форумов :)
RU termostat #10.01.2005 14:58
+
-
edit
 

termostat

аксакал

Маленько ты человека в заблуждение вводишь, он не может понять что прерывание от таймера Б придет на n тактов позже если попадет во время обработки прерывания от таймера А, в случае если прерывания запрещены в обработчике А.
 


Да нет не ввожу в заблуждение, а именно указываю на то что если программа не делает то что от нее требуется то она написана неверно либо МК нужен пошустрей.
   
1 6 7 8 9 10 11 12

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru