Мелкие вопросы по МК и ПЛИС.

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
amd9800
Опытный кот
Сообщения: 822
Зарегистрирован: Вс июн 02, 2013 12:23:03

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение amd9800 »

sphincs писал(а):подозреваю, что протеус может просто плохо дружить с прерываниями от таймеров


Могу сказать что отлично дружит.
amd9800
Опытный кот
Сообщения: 822
Зарегистрирован: Вс июн 02, 2013 12:23:03

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение amd9800 »

Хочу оптимизировать данную функцию на скорость.
y - это данные с ADC
x - это то к чему мы равняемся но умноженное на m (К примеру мерю напряжение на аккумуляторе через делитель 1:11, Ref = 4.94V, делитель m =10, тогда x = 4.94*11*10=543.4 ставим 543)
z - это куда закинуть обработанные данные.


Код: Выделить всё

void DigitalV(unsigned char y, unsigned int x, unsigned char z, unsigned char m){ //y number to digitalize x-reference
unsigned char point=3;
unsigned long number;
unsigned int last=0;
unsigned char sut=0, zeci=0;
    if (y==0){last=0;}else{
    number=y;
    number=((number*x*100)/255)/m;

/*Final_nr<100*/   if ((number<10000)&(number>999)) {last=number/10;point = 1;}
/*Final_nr <10*/   else if (number<1000) {last=number;point = 0;}
                   else {last=number/100;}
    }
   
  while(last>99)
        {
        sut++;last=last-100;
        }
    while(last>9)
        {
        zeci++;last=last-10;
        }
        MENU_Data[z][0]=dig[sut];
        MENU_Data[z][1]=dig[zeci];
        MENU_Data[z][2]=dig[last];
        if (point<3) {MENU_Data[z][point]=(MENU_Data[z][point]) | (0b00000001);}
}
Аватара пользователя
Pink-Pank
Опытный кот
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США
Контактная информация:

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Pink-Pank »

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


Посмотрел код 32-й меги.

общие замечания:

1) Если Вы не используете для вывода строки стандартную библиотечную функцию, а в своей функции просто выводите фиксированное значение символов, то добавлять в конце строки NULL не имеет смысла.
2) При настройке таймера в асинхронном режиме и дальнейшем изменении его регистров необходимо учитывать, что изменение этих регистров в контроллере происходит не мгновенно, а с некоторой задержкой. Поэтому факт самого изменения регистров нужно отслеживать по изменению флагов в регистре ASSR.
3) В функции if (PINC.2==1) //СБРОС

Код: Выделить всё

#asm("cli"); // Запретили прерывания
TCCR2=0x01;
time1=0;
//#asm("sei"); // Забыли разрешить прерывания

4) Для повышения скорости вычислений рекомендую избавиться от типа данных float.
5) переменная mode у Вас принимает значения 0..2. можно выделить для нее тип данных char (занимает в два раза меньше места). Важно понимать, что перевод типов данных char(символ) и integer(целое число) никак не соотносятся с целевым применением этих типов и обозначают всего лишь размер места в памяти. char занимает 1 байт и может содержать как число, так и символ (кодировка ASCII); integer занимает (для AVR) 2 байта и также может содержать число или символ (кодировка UNICODE).
6) Не работают остальные кнопки у Вас потому, что в начале идет кусок кода, который заключен в бесконечный цикл while(1). Оператора выхода из цикла (break) я у Вас там что-то не увидел. Т.е. все банально просто - у Вас молотит все время первый кусок, а до остальных дело не доходит.
Дальше не смотрел.

amd9800 писал(а):Хочу оптимизировать данную функцию на скорость.

Тогда изучайте Ассемблер. ;)
Fucking static initialization order fiasco
Аватара пользователя
sphincs
Нашел транзистор. Понюхал.
Сообщения: 174
Зарегистрирован: Вт сен 11, 2012 09:13:52
Откуда: Брест, Беларусь
Контактная информация:

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение sphincs »

Pink-Pank писал(а):3) В функции if (PINC.2==1) //СБРОС

Код: Выделить всё

#asm("cli"); // Запретили прерывания
TCCR2=0x01;
time1=0;
//#asm("sei"); // Забыли разрешить прерывания


нет, тут все нормально, прерывания разрешаются по нажатию кнопки СТАРТ, пока устройство простаивает мне нет необходимости считать время
Pink-Pank писал(а):5) переменная mode у Вас принимает значения 0..2. можно выделить для нее тип данных char

согласен, обычно unsigned char выделяю, тут просто просмотрел
Pink-Pank писал(а):6) Не работают остальные кнопки у Вас потому, что в начале идет кусок кода, который заключен в бесконечный цикл while(1). Оператора выхода из цикла (break) я у Вас там что-то не увидел. Т.е. все банально просто - у Вас молотит все время первый кусок, а до остальных дело не доходит.
Дальше не смотрел.

а вот это действительно так. блин. криво скопипастил похоже из первоначального проекта

спасибо за помощь!
amd9800
Опытный кот
Сообщения: 822
Зарегистрирован: Вс июн 02, 2013 12:23:03

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение amd9800 »

Pink-Pank писал(а):
amd9800 писал(а):Хочу оптимизировать данную функцию на скорость.

Тогда изучайте Ассемблер. ;)


Я смотрю на то чтоб программировать в С с ассемблерными вставками.
Аватара пользователя
sphincs
Нашел транзистор. Понюхал.
Сообщения: 174
Зарегистрирован: Вт сен 11, 2012 09:13:52
Откуда: Брест, Беларусь
Контактная информация:

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение sphincs »

delete
Спойлерпроблема с дисплеем была в неправильной библиотеке
Аватара пользователя
Pink-Pank
Опытный кот
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США
Контактная информация:

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Pink-Pank »

amd9800 писал(а):Я смотрю на то чтоб программировать в С с ассемблерными вставками.

Ну... Это бывает полезно в исключительных ситуациях. А так, чтобы обработать переменные Вам нужно, например, засунуть их стек перед вызовом ассемблерной вставки. А в самой вставке их оттуда извлечь, что-то с ними сделать, засунуть обратно в стек. При этом, перед всеми действиями сначала сохранить используемые регистры и регистр флагов, а в конце их восстановить. В общем, тоже мало хорошего. либо изучать документацию на Ваш компилятор. Большинство компиляторов оставляет часть регистров не используемыми - и их можно задействовать в Вашей вставке без последствий. Либо икать в листинге, по каким адресам записаны переменные и какие регистры свободны.
Fucking static initialization order fiasco
amd9800
Опытный кот
Сообщения: 822
Зарегистрирован: Вс июн 02, 2013 12:23:03

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение amd9800 »

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

Таким образом буду резервировать, а потом использовать в асемблере.
nirq
Опытный кот
Сообщения: 758
Зарегистрирован: Вс фев 10, 2013 15:26:00

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение nirq »

Есть горсть плат, на каждой плате припаяна микросхема модели %defaul_MCU% (в названии производителя первая буква А, всё правильно). Тактируется от внешнего источника.
Но у внешнего источника частота слегка не та оказалась внезапно.

Решение: допаять кварцы на весу. И по два конденсатора, как на картинке в инструкции.
Кварцы допаяли, а конденсаторов нет в наличии. Подходящих для именно навесного монтажа.

И сомнения: то ли оставить работать как есть, то ли морочиться сначала с закупкой, потом опять разборкой и допаиванием уже конденсаторов...
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение ARV »

amd9800 писал(а):А можно компилятору задать какие регистры резервировать?
Таким образом буду резервировать, а потом использовать в асемблере.

в AVR-GCC можно, но зарезервированные регистры все равно могут быть испорчены, если используются сторонние библиотеки (в том числе avr-libc).
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Pink-Pank
Опытный кот
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США
Контактная информация:

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Pink-Pank »

ARV писал(а):в AVR-GCC можно

О, а как?
Fucking static initialization order fiasco
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение ARV »

Pink-Pank писал(а):О, а как?
опция компилятора -ffixed-x: в этой опции вместо х должен быть указан номер резервируемого регистра. например, если надо зарезервировать R6, то следует указать при компиляции опцию -ffixed-6. если резервируются несколько регистров, на каждый должна быть своя опция.

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

Мой уютный бложик... заходите!
Аватара пользователя
Pink-Pank
Опытный кот
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США
Контактная информация:

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Pink-Pank »

Это, я так понимаю, указывается в коммандной строке компилятора. А чтобы в тексте программы указать такого нет?
Fucking static initialization order fiasco
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение ARV »

в тексте - нет. и причина проста: при сборке программы из нескольких файлов необходимо, чтобы каждый файл компилировался с одним и тем же набором резервируемых регистров, в противном случае никакого смысла в резервироваии не будет. именно по этой причине при подключении некоторых библиотек avr-libc, которые были скомпилированы без учета резервирования, смысл резервирования в вашей программы теряется.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
amd9800
Опытный кот
Сообщения: 822
Зарегистрирован: Вс июн 02, 2013 12:23:03

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение amd9800 »

На меге 48 я подал питание на саму микруху с одного стабилизатора 78L05 и на AVCC c другой 78L05.
Схема начинает шипеть.

Если питаю ее через LC цепь и ставлю индуктивность 50uH и конденсатор 8,8uH керамика, то когда начинает работать шим то наблюдаются помехи притом помехи(смотрю осцилографом) в на стороне AVCC больше чем на VCC.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25155
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение КРАМ »

Питание AVcc нужно подавать через RC цепь. Причем резистор следует взять совсем не большой 5...10 Ом.
Если в качестве опоры АЦП взят именно AVcc, а при этом требуется долговременная стабильность этой опоры (для вольтметра, например), то тогда лучше использовать специальный источник опоры с малым падением и понизить AVcc до 4,096 вольт.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Gudd-Head »

КРАМ писал(а):специальный источник опоры с малым падением и понизить AVcc до 4,096 вольт.

А как же Analog Supply Voltage — Vcc ± 0,3 В?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25155
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение КРАМ »

Если честно, то я у Меги конкретно не смотрел. :(
При таком требовании остается вариант с RC.
А опору уже сделать отдельно с референсного источника.
SmarTrunk
Друг Кота
Сообщения: 6014
Зарегистрирован: Чт ноя 26, 2009 11:16:50
Откуда: Москва

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение SmarTrunk »

Ну да, их обычно либо соединяют (цифровое и аналоговое питание), либо подают через свои раздельные дроссель + конденсатор (скажем, 0,1мкФ). У amd9800 стоит блокировочный конденсатор по питанию 8,8нФ - думаю, мало. Можно попробовать добавить параллельно керамике 0,1мкФ электролитический, скажем, 20мкФ.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25155
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение КРАМ »

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

Вернуться в «Разные вопросы по МК»