Краткий Курс - программирование AVR - часть VII

 
1 6 7 8 9 10 11 12
RU termostat #22.11.2005 11:53
+
-
edit
 

termostat

аксакал

Обязательно нужно сделать свой виртуальный осцилограф цифро-аналоговый, как у VMLAB только добавить:

- вывод в аналоговом виде 8-ми и 10-ти битных чисел, т.е. как бы обычный сигнал в осцилографе.

- отображение на одном графике нескольких сигналов с разным масштабом по напряжению и разным цветом

- отображение горизонтальных разноцветных маркеров для отслеживания уровней сигнала и для измерений на экране.

- для измерений же перекресный курсор с показом цифровых координат

- сохранение всех отображаемых данных в текстовый файл .CSV - данные разделенные запятыми - для последующего анализа в сторонних программах.

===

SAA - вот бы тебе сделать такой !

Осцилограф (+ запоминающий) это важнейший инструмент в электронике.

RU termostat #22.11.2005 12:30
+
-
edit
 

termostat

аксакал

"SAA":
Я как то искал на протеус хелп по разработке компонент.
 


тут должны быть материалы:


callbus.ru - это наилучший источник информации по теме call bus. Этот веб-сайт продается

callbus.ru это наилучший источник информации по теме call bus . Здесь также представлены другие интересные разделы. Надеемся, что вы найдете то, что ищете.

// www.callbus.ru
 



и гдето в интете подробная статья была как их делать.

Щас написано что по требованию производителя ее убрали

http://www.callbus.ru%2farticles%2fmodels%2frindex.html - наверно на мыло могут кинуть.

но есть на каком то тарабарском языке

[PDF] Creation VSM - models of electronic components for Proteus.Формат файла: PDF/Adobe Acrobat - В виде HTML
Creation VSM - models of electronic components for. Proteus. Program interface VSM SDK. As 4 already he wrote in the previous article, all models for ...
proyectosfie.webcindario.com/documentos/proteus/ Creation%20VSM%20-%20Modelos%20Componentes%20Electronicos.PDF - Дополнительный Результат - Похожие страницы

Но я всеже думаю глвное осцилограф сделать.

=====

И я не понял:

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

"SAA":
мне именно как проект написанный в Протеусе и на Си
 


у меня такого нет.

"SAA":
реальный то проект работает, а его симуляция в Протеусе фиговничает ничего не выводит.
 

Ну значит не правильно отображаешь реальную схему в PROTEUS или он сам глючит.
Это сообщение редактировалось 22.11.2005 в 12:36
RU termostat #22.11.2005 12:40
+
-
edit
 

SAA

втянувшийся

termostat> Обязательно нужно сделать свой виртуальный осцилограф цифро-аналоговый, как у VMLAB только добавить:
termostat> - вывод в аналоговом виде 8-ми и 10-ти битных чисел, т.е. как бы обычный сигнал в осцилографе.
termostat> - отображение на одном графике нескольких сигналов с разным масштабом по напряжению и разным цветом
termostat> - отображение горизонтальных разноцветных маркеров для отслеживания уровней сигнала и для измерений на экране.
termostat> - для измерений же перекресный курсор с показом цифровых координат
termostat> - сохранение всех отображаемых данных в текстовый файл .CSV - данные разделенные запятыми - для последующего анализа в сторонних программах.
termostat> ===

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

termostat> SAA - вот бы тебе сделать такой !
termostat> Осцилограф (+ запоминающий) это важнейший инструмент в электронике. [»]

Согласен.
 

SAA

втянувшийся

termostat> Но я всеже думаю глвное осцилограф сделать.
termostat> =====

По важности и интересности все хорошо и то и это ;)

Еще одна задача корторая просто не заменима в ближайшем будующем в симуляторах, это описание компонента на Verilog или VHDL/AHDL, представляешь какие возможности - сейчас же все ядра пакуются в System On Chip. Это же полное проектирование ПЛИС устройств с визуальной обработкой!

termostat> И я не понял:
termostat> там есть возможность как в VMLAB как-то наблюдать за регистрами при симуляции, за занчениями переменных ?

Т.е. ты этого тамне нашел? А если нету, что делать придется свое симул. ядро писать для AVR?

termostat> Ну значит не правильно отображаешь реальную схему в PROTEUS или он сам глючит. [»]

Тебе на нем с LCD динамически работать никак не приходилось?

 

SAA

втянувшийся

termostat> Скачал 461 кб - на английском.
termostat> http://proyectosfie.webcindario.com/documentos/... [»]

Скачал. Спасибо, молодец, термостат, я столько ее искал!
 
RU termostat #22.11.2005 14:26
+
-
edit
 

ROOT

новичок
SAA, 22.11.2005 06:36:39:
Вот это зря ей богу, компилер сам должен такие вещи делать! Что за компилятор? Да и поздновато ты начал все таки ведь ранее ты уже успел что то проверить и сделать return. WinAVR делает это сразу в преамбуле. И, кроме того проверь ты входишь в обработчик с включенными прерываниями? WinAVR различает эти два случая, если прерывания остались включенными - значит тебе нужно обаботать АЦП как можно скорее.
 

Это я уже для экспериментов асм вставил :) Конечно, работает и без этих инструкций.
А пишу я на CodeVision.

SAA, 22.11.2005 06:36:39:
Сделай прерывание как можно короче, обработку вынеси в основной цикл в прерывании только считывание и инкремент. Остальное в главном цикле, не забудь в цикле уйти в "halt" slpeep-ом, тогда после каждого прерывания в системе ты будешь возвращаться в главный цикл и в спокойной обстановке делать обработку (можно даже выключить прерывания на время).
 

Согласен. Но опять не получается получить в главном цикле то, что сохраняю в прерывании. Код сейчас такой:

interrupt [ADC_INT] void adc_isr(void)
{
last_adc_lo = ADCL;
last_adc_hi = ADCH;

// start conversion
ADCSRA |= ADEN;

PORTB = last_adc_lo;
PORTE = last_adc_hi;

sample_index++;
PORTD = sample_index;
}

Все нормально, получаю на PORTB и PORTE непрерывно меняющееся двоичное значение сигнала. Но я не могу поймать в главном цикле значения, которые я сохраняю в прерывании
Т.е. если я уберу из кода выше запись в порты, то

#asm("sei")

while (1)
{
PORTE = last_acd_hi;
};

(в разных вариациях)
не выводит результат последнего преобразования, а выводит 0.

Вот про sleep поподробнее. sleep_enable(), что ли? А при возникновении прерывания МП сам "пробуждается"? Или его надо делать перед условием ожидания числа выборок, а потом сбрасывать через sleep_disable()?

SAA, 22.11.2005 06:36:39:
Да нет скорее всего ты получаешь вложенность. Какова тактовая частота?
 

АЦП - 125 кГц, проц - 4 Мгц
насчет вложенности ты, думаю, прав... Потому что при вышеприведенном коде значение PORTD в симуляторе протеуса - 0 или 1.
 

SAA

втянувшийся

ROOT> Т.е. если я уберу из кода выше запись в порты, то
ROOT> #asm("sei")
ROOT> while (1)
ROOT> {
ROOT> PORTE = last_acd_hi;

Ты делаешь именно так? Но порядок то чтения из АЦП у тебя правильный в прерывании, а здесь только чтение старшей части. Или ты просто упростил?

PORTB = last_adc_lo;
PORTE = last_adc_hi;
 


ROOT> };
ROOT> (в разных вариациях)
ROOT> не выводит результат последнего преобразования, а выводит 0.

Я сейчас очень торплюсь чуть позже раберу весь пост, на мой взгляд там есть еще пара "бобов".
 

SAA

втянувшийся

ROOT>
SAA, 22.11.2005 06:36:39:
ROOT> Сделай прерывание как можно короче, обработку вынеси в основной цикл в прерывании только считывание и инкремент. Остальное в главном цикле, не забудь в цикле уйти в "halt" slpeep-ом, тогда после каждого прерывания в системе ты будешь возвращаться в главный цикл и в спокойной обстановке делать обработку (можно даже выключить прерывания на время).
ROOT>
 

ROOT> Согласен. Но опять не получается получить в главном цикле то, что сохраняю в прерывании. Код сейчас такой:
ROOT> interrupt [ADC_INT] void adc_isr(void)
ROOT> {
ROOT> last_adc_lo = ADCL;
ROOT> last_adc_hi = ADCH;
ROOT> // start conversion
ROOT> ADCSRA |= ADEN;
ROOT> PORTB = last_adc_lo;
ROOT> PORTE = last_adc_hi;
ROOT> sample_index++;
ROOT> PORTD = sample_index;
ROOT> }
ROOT> Все нормально, получаю на PORTB и PORTE непрерывно меняющееся двоичное значение сигнала. Но я не могу поймать в главном цикле значения, которые я сохраняю в прерывании
 


Тут вот что, сколько еще прерываний происходит в системе, от другого оборудования? Если только одно, то достачтоно будет

code text
  1. ROOT>   last_adc_lo = ADCL;
  2. ROOT>   last_adc_hi = ADCH;


а в главном цикле так:
while(true) // true - определена не везде, кое где необходимо 1
{
asm("sei");
asm("sleep");
asm("cli");
// // тут мы появимся только после возникновения и отработки прерывания (если в // обработчике прерывания сами прерывания запрещены!!!!
// // Проводим обработку.
PORTB = last_adc_lo;
PORTE = last_adc_hi;
PORTD = ++sample_index;
ADCSRA |= ADEN; // только после обработки!!!
}

Но если прерывание в системе не от одного устройства то нужно дополнительно исследовать флаги, на предмет выяснения того кто вынул нас из halt состояния

ROOT> Вот про sleep поподробнее. sleep_enable(), что ли?
 


Это скорее всего установка режива разрешения "сна". По крайней мере в WinAVR есть две библиотечные функции установки режима sleep[но там используется константа режима "сна"] и самого sleep [перевода процессор ав режим "сна" из которого его выдернет прырывание], причем я предпочитаю использовать именно асм. комманду sleep, так как в WinAVR под sleep подразумевается несколько более универсальная функция. Их описание есть в sleep.h:
extern void set_sleep_mode (uint8_t mode);
extern void sleep_mode (void);

А при возникновении прерывания МП сам "пробуждается"? Или его надо делать перед условием ожидания числа выборок, а потом сбрасывать через sleep_disable()?
 


Нет нет, режимов "сна" несколько вплоть до Power Save, прерывания выодят его из состояния sleep причем первое прешедшее. Раньше в 8080 была команда HLT, так это сродни этому.

ROOT> АЦП - 125 кГц, проц - 4 Мгц
ROOT> насчет вложенности ты, думаю, прав... Потому что при вышеприведенном коде значение PORTD в симуляторе протеуса - 0 или 1.
 


Лучше поставить эксперимент в VMLab, а то что то Протеус достаточно сложен в настройке (убедился на собственном примере).

Давай посчитаем при тактовой 4MHz каков у тебя запас кода на прерывание, что бы не получить вложенности (ну вложенность только при условии что прерывания разрешены в обработчике - ты это проверял?)

Длительность одного такта 1/4E6 = 0,25 мкс = 250 нс.
При условии, что прерывания от АЦП приходят с частотой 125 кГц длительность окна свободного от обработки прерывания составит 1/125E3 = 0,008 мс = 8 мкс

Таким образом кол-во тактов от прерывания АЦП до его следующего прерывания = 8/0,25 = 32 такта MCU

При условии что на 1 комманду тратится 2 такта (худший вариант), то у нас 16 комманд ;) а это очень и очень мало, так как существуют еще непроизводственные потери таие как вход в прерывание - 2 такта, т.е. комманд у нас уже 15. Я думаю если глянешь листинг асм от CodeVision и увидишь что в обработчике прерывания у тебя разрешены прерывания - смело можешь считать что у тебя вложенность.

ROOT> interrupt [ADC_INT] void adc_isr(void)
ROOT> {
ROOT> last_adc_lo = ADCL;
ROOT> last_adc_hi = ADCH;
ROOT> // start conversion
ROOT> ADCSRA |= ADEN;
^^^^^^^^^^^^^^^^^^^^^^^^^
Если прерывания разрешены, то с этого момента начиинай отсчитывать такты
по хорошему надо тащить это в конец прерывания

ROOT> PORTB = last_adc_lo;
ROOT> PORTE = last_adc_hi;
ROOT> sample_index++;
ROOT> PORTD = sample_index;
ROOT> }


Но лучшим выбором будет разнести обработку и само прерывание!!!!
 
+
-
edit
 

Shurka

новичок
ДОбрый день. Скажите, люди добрые, кто-ниб. подключал внешнюю SRAM к AVR? если да, то поделитесь опытом:))
 

ROOT

новичок
SAA, 24.11.2005 12:10:04:
Но лучшим выбором будет разнести обработку и само прерывание!!!!
[»]
 

Спасибо за дельные советы, но я решил делать без прерываний.

Но проблемы появились и тут :)
Никак не могу отсчитать нужное число значений АЦП.

Вот главный цикл проги.

sample_index =0 ;
while (1)
{
while ((ADCSRA & ADIF) == 0);
if (sample_index >= 8)
{
PORTB = 4;
while (1);
}
else
{
PORTB = ADCL;
PORTE = ADCH;
}
delay_ms(100);
sample_index++;


ADCSRA |= ADSC;
};


Вроде все просто. Выводим первые 8 значений АЦП в PORTE PORTB, потом выводим в PORTB 4 как индикацию конца работы и зацикливаемся - бесполезно :(
При симуляции этого примера в протеусе видны непрерывно обновляющиеся PORTB, PORTE с текущим значением сигнала. Зацикливания и остановки АЦП не происходит.

В чем тут может быть дело? Ведь все предельно просто? Я уже начинаю думать, что это протеус глючит; сейчас скачал VMLAB, вечером дома попробую в нем проэмулировать схему.

P.S. Не подскажет ли уважаемая публика, где достать кряк к VMLAB3.10 + update 3.11?
 
+
-
edit
 

termostat

аксакал

Shurka> ДОбрый день. Скажите, люди добрые, кто-ниб. подключал внешнюю SRAM к AVR? если да, то поделитесь опытом:)) [»]

в PROTEUS есть пример для AVR8515

папка: Proteus 6 Professional\SAMPLES\AVR External Memory
+
-
edit
 

termostat

аксакал

ROOT> В чем тут может быть дело? Ведь все предельно просто? Я уже начинаю думать, что это протеус глючит;
 


Напиши алгоритм по русски, не на Си а на человеческом языке - псевдокод называется. А по нему сделаем прогу по новой.

ROOT> P.S. Не подскажет ли уважаемая публика, где достать кряк к VMLAB3.10 + update 3.11? [»]
 


на первой странице темы.


UA SashaM2005 #28.11.2005 13:18
+
-
edit
 

SashaM2005

новичок
Пробую к BASCOM 1.11.7.4 подключить програматор AVR 910.не определяет чип. В новой версии BASCOM 1.11.7.9 все нормально. Кто с таким сталкивался?
Как устранить? Или где взять лечилку на BASCOM1.11.7.9?
 
RU Андрей Суворов #29.11.2005 14:12
+
-
edit
 

Андрей Суворов

координатор

Люди с большим опытом, скажите, что лучше на АВР-ке: табличная аппроксимация вида
фактическая величина=табличная_функция(измеренная величина, температура)
или аналитическая аппроксимация вида
фактическая величина=(измеренная величина-коррекция1)*коррекция2;
где коррекция1=температура4*const1+температура*const2+const3
коррекция2=температура*const4*abs(измеренная величина)

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

pokos

аксакал

А.С.> Люди с большим опытом, скажите, что лучше на АВР-ке: табличная аппроксимация вида
Ну, это вопрос только баланса быстродействия и точности. Если нужны хотя бы 16-ти битные значения, я бы сделал линейную аппроксимацию с таблицей, потому что умножение нужно только одно. Ну, а если быстродействия хватает, то аналитическая, конечно, лучше. Только переполнения отслеживать приходится тщательно, либо задавать разрядность с запасом.
 
RU termostat #29.11.2005 14:23
+
-
edit
 
RU Андрей Суворов #29.11.2005 14:26
+
-
edit
 

Андрей Суворов

координатор

А.С.>> Люди с большим опытом, скажите, что лучше на АВР-ке: табличная аппроксимация вида
pokos>Ну, это вопрос только баланса быстродействия и точности. Если нужны хотя бы 16-ти битные значения, я бы сделал линейную аппроксимацию с таблицей, потому что умножение нужно только одно. Ну, а если быстродействия хватает, то аналитическая, конечно, лучше. Только переполнения отслеживать приходится тщательно, либо задавать разрядность с запасом.

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

Или как?

Кстати, в атмегах старших умножитель аппаратный, 16-битное умножение - это четыре умножения плюс три сложения, плюс два сдвига на четыре. Что-то в районе 25 тактов.
 
Это сообщение редактировалось 29.11.2005 в 18:04
+
-
edit
 

Serge77

модератор

А зачем тебе вообще эти вычисления? Чтобы потом на их основе принимать какое-то решение, например об изменении управляющих воздействий и т.п. ? Тогда можно сделать наоборот - заранее пересчитать данные, с которыми будешь сравнивать, в исходные 16-битные значения, и сравнивать с ними. Тогда на МК ничего не нужно считать.
RU Андрей Суворов #29.11.2005 14:53
+
-
edit
 

Андрей Суворов

координатор

Serge77>А зачем тебе вообще эти вычисления? Чтобы потом на их основе принимать какое-то решение, например об изменении управляющих воздействий и т.п. ? Тогда можно сделать наоборот - заранее пересчитать данные, с которыми будешь сравнивать, в исходные 16-битные значения, и сравнивать с ними. Тогда на МК ничего не нужно считать.

Хм. Дело в том, что эту величину я собираюсь интегрировать, а решения принимать на основе интеграла от этого значения... Как тут вывернуться - не знаю...
 
Это сообщение редактировалось 29.11.2005 в 18:03
+
-
edit
 

Serge77

модератор

Интегрируй исходные данные, без пересчёта по таблице. И сравнивай с заранее подготовленными величинами.
RU Андрей Суворов #29.11.2005 15:38
+
-
edit
 

Андрей Суворов

координатор

Serge77>Интегрируй исходные данные, без пересчёта по таблице. И сравнивай с заранее подготовленными величинами.

Сергей, А ЧТО БЫВАЕТ, КОГДА ИНТЕГРИРУЕШЬ КОНСТАНТУ?
 
Это сообщение редактировалось 29.11.2005 в 18:05
+
-
edit
 

Serge77

модератор

Не понял, причём тут константа.
Может я плохо объяснил, что я предлагаю.

Допустим, нужно выбросить парашют на высоте 200 м.

Вариант 1. В программу закладываем константу "200". Считываем данные с датчика давления, пересчитываем (по таблице или как) в высоту, сравниваем с 200.

Вариант 2. В программу закладываем константу "765" (это показания АЦП на высоте 200). Считываем данные с датчика давления и сразу сравниваем с 765, экономим на пересчётах.

Это плохой пример, потому что на высоте 200 показания АЦП могут быть разными из-за разного давления на высоте 0, но принцип понятен.

Более лучший пример: заложить в программу константу 22 (это разница показаний АЦП на высоте 0 и 200), в программе вычислять разность между показанием АЦП до старта и в полёте.
RU Андрей Суворов #29.11.2005 16:05
+
-
edit
 

Андрей Суворов

координатор

Serge77>Не понял, причём тут константа.
Serge77>Может я плохо объяснил, что я предлагаю.

При интегрировании ошибка накапливается со временем. Если интегрирование одно (угловая скорость -> положение), то линейно со временем. Если интегрирования два (боковое ускорение - боковая скорость - боковое перемещение), то квадратично со временем.

В последнем случае спасает, что перемещение вдоль траектории растёт примерно квадратично со временем, поэтому получается практически постоянный угол отклонения от номинальной траектории. Кстати, очень маленький, единицы миллирадиан.

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

У твердотельного гироскопа три источника ошибки.

Ошибка нуля в зависимости от температуры хорошо описывается функцией дельта тэ в четвёртой степени в пределах 0..55 градусов, если дельту отсчитывать от 22..25 градусов, в зависимости от экземпляра гироскопа. Причём всего 10 градусов дельты соответствуют "мнимому вращению" со скоростью оборот в секунду.

Ошибка масштабного коэффициента (зависимость чувствительности от температуры) практически линейна с температурой. Примерно полпроцента-процент на каждый градус.

Нелинейность характеристики (зависимость чувствительности от измеряемой величины). У мюратовских датчиков довольно заметная, у аналог-девайсовских - раз в пятьдесят меньше.
 
Это сообщение редактировалось 29.11.2005 в 18:06
1 6 7 8 9 10 11 12

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