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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Nevox
Мучитель микросхем
Сообщения: 426
Зарегистрирован: Чт авг 09, 2012 08:57:20

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

Сообщение Nevox »

Здравствуйте еще раз!

Возникла такая идея:

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

вот пример прошивки,которая есть щас,написанная на Verilog.

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

SUBDESIGN SN_DVV_14_220V
(
   RES, INT : INPUT;
   WR       : INPUT;
   RD       : INPUT;
   CS       : INPUT;
   DAT[7..0]: BIDIR;
   A[3..0]    : INPUT;
   IN[13..0]: INPUT;
)
VARIABLE

 D[7..0]     : NODE;
BEGIN
  D[7..0] = (16&(A[3..0]==0))#
          (35&(A[3..0]==1))#
          (14&(A[3..0]==2))#
          (8&(A[3..0]==3))#
          (0&(A[3..0]==4))#
          (0&(A[3..0]==5))#
          (0&(A[3..0]==6))#
          (0&(A[3..0]==7))#
          (IN[7..0]&(A[3..0]==8));
 D[5..0] =    (IN[13..8]&(A[3..0]==9));
 
   DAT0 = TRI(D0,!CS&!RD);
   DAT1 = TRI(D1,!CS&!RD);
   DAT2 = TRI(D2,!CS&!RD);
   DAT3 = TRI(D3,!CS&!RD);
   DAT4 = TRI(D4,!CS&!RD);
   DAT5 = TRI(D5,!CS&!RD);
   DAT6 = TRI(D6,!CS&!RD);
   DAT7 = TRI(D7,!CS&!RD);
   
END;
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

Я вышел с положения немного подругому! lcd_gotoxy(0,0);
lcd_putchar(display%10000/1000+0x30);

че за бред вы пишете?Я же дал ссылку на нормальный пример, itoa переводит тип int в нормальный понятный для дисплея вид, без всяких дополнительных действий с вашей стороны.если вам нужно вставить запятую между значениями то используйте временную переменную.
код

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


unsigned int I 
=123;
itoa (I,buffer);
lcd_puts(buffer); 

выведет на экран число 123
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

вопрос по Atmega8
если я делаю аппаратный TWI то 4 и 5 пины порта С конфигурировать на выход или оставить все по нулям DDRC=0x00;
PORTC=0x00; ?
http://rghost.ru/42342241.view
Tell Me The Truth
Аватара пользователя
Sceam73
Встал на лапы
Сообщения: 86
Зарегистрирован: Вт авг 28, 2012 21:07:09

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

Сообщение Sceam73 »

cvavr ругаеться на itoa ...undefined symbol
Аватара пользователя
black_lizard
Встал на лапы
Сообщения: 132
Зарегистрирован: Вс сен 23, 2012 05:51:35

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

Сообщение black_lizard »

cvavr ругаеться на itoa ...undefined symbol


#include <stdlib.h>
Собираю самопальный мини-компьютер
Аватара пользователя
black_lizard
Встал на лапы
Сообщения: 132
Зарегистрирован: Вс сен 23, 2012 05:51:35

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

Сообщение black_lizard »

Никогда не думал, что работа с файловой системой флешки, а именно фат настолько геморна и будет самым проблемным местом моего проекта.
Кое как научил мк бегать по папкам командами dir и cd, как в досе.
Но есть пара вопросов, дабы не плодить тем, ответы на которые в инете я не нашёл.

Как высчитывается смещение до корневой директории?
Где записан размер кластера?
Где находится пресловутая таблица файлов, когда начало флешки просто забито сплошными FF? Вроде как, она должна располагаться в начале.
Размер кластера(или сектора, так и не понял) - 0х2000, выяснен экспериментальным путём. Как тогда корневая директория может быть в 0x5B200? Я могу понять, что первые 0x200 это данные ФС, которых кот наплакал, но как прибавляя 0x2000 можно получить 5B200 для меня осталось загадкой. Разве размер кластера не фиксирован?

Думал, что fat простой, потому что древний. Зря я так думал.
Собираю самопальный мини-компьютер
Аватара пользователя
Sceam73
Встал на лапы
Сообщения: 86
Зарегистрирован: Вт авг 28, 2012 21:07:09

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

Сообщение Sceam73 »

с

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

ADCSRA =(1 << 1)|(1 << 2)|(1 << 3)|(1 << 5)|(1 << 6)|(1 << 7)|;
ADMUX = (1 << 1)|(1 << 2)|(0 << 4)|(0 << 5)|(0 << 6)|(0 << 7) ;

на жк появляется число постоянное и неизменное 2813! проглядите пожалуйста код... посмотрите где налажал...
Спойлерinterrupt [ADC_INT] void adc_isr(void)
{
unsigned int adc_data;
// Read the AD conversion result
adc_data=ADCW;
// Place your code here
value = value + (adc_data*11/4);
adc_counter++;

}

ADCSRA =(1 << 1)|(1 << 2)|(1 << 3)|(1 << 5)|(1 << 6)|(1 << 7);
ADMUX = (1 << 1)|(1 << 2)|(0 << 4)|(0 << 5)|(0 << 6)|(0 << 7) ;

lcd_init(16);

// Global enable interrupts
#asm("sei")

delay_ms(50);

while(1)
{
if (adc_counter > 300)
{
display = value/adc_counter;
adc_counter = 0;
value = 0;
}
delay_ms(50);
lcd_gotoxy(0,0);
lcd_clear();
itoa (display,buffer);
lcd_puts(buffer);

}
}
Последний раз редактировалось Sceam73 Ср дек 19, 2012 13:40:24, всего редактировалось 1 раз.
a_skr
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

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

Сообщение a_skr »

а ничего, что 1<<8 = 0x100 = 256 и в однобайтовый регистр не влезет?
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20091
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

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

FreshMan писал(а):если я делаю аппаратный TWI то 4 и 5 пины порта С конфигурировать на выход или оставить все по нулям DDRC=0x00

Насколько я помню, при включении периферии она перехватывает пины, и на них уже никак не повлиять. Т.е. конфигурировать их специально не надо.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Sceam73
Встал на лапы
Сообщения: 86
Зарегистрирован: Вт авг 28, 2012 21:07:09

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

Сообщение Sceam73 »

a_skr писал(а):а ничего, что 1<<8 = 0x100 = 256 и в однобайтовый регистр не влезет?
я об этом думал... но это 1<<8 ни на что не повлияет, еденица просто уйдет.....
Это не столь важно, меня больше интересует, почему у меня моя программа не работает ? Я уже себе весь мозг поломал!
a_skr
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

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

Сообщение a_skr »

ADMUX = (1 << 1)|(1 << 2)|(0 << 4)|(0 << 5)|(0 << 6)|(0 << 7) ;
= 0x06 - зачем выбирать вход PC6, если используется PC0?
выбран внешний источник опорного напряжения, а оно не подведено!
и еще математику проверьте. не будет ли переполнения при суммировании результатов.
Аватара пользователя
Sceam73
Встал на лапы
Сообщения: 86
Зарегистрирован: Вт авг 28, 2012 21:07:09

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

Сообщение Sceam73 »

Такс... щас буду с битами розбераться, видимо ошибся!
По поводу математеки, вродебы правильно посчитал, у меня как раз две области в которых я разобрался не до конца! Это собственно биты, и что как розсчитывать!


Мучался мучался, гуглил гуглил, в итоге наткнулся на готовый проект вольтметра на светодиодах! (ацп 8бит)
Немного подправил код под ЛСД!
Пока что решил опустить все танцы с бубном, и выводить просто показания ацп! Схему включения оставил старую, а код подправил...
Спойлерchar buffer[3];
// ADC interrupt service routine
interrupt [ADC_INT] void adc_isr(void)
{
static unsigned char input_index=0;
// Read the 8 most significant bits
// of the AD conversion result
adc_data[input_index]=ADCH;
// Select next ADC input
if (++input_index > (LAST_ADC_INPUT-FIRST_ADC_INPUT))
input_index=0;
ADMUX=(FIRST_ADC_INPUT | (ADC_VREF_TYPE & 0xff))+input_index;
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
}

ADMUX=FIRST_ADC_INPUT | (ADC_VREF_TYPE & 0xff);
ADCSRA=0xCC;

delay_ms(50);
lcd_gotoxy(0,0);
lcd_clear();
itoa (adc_data[0],buffer);
lcd_puts(buffer);

в результате получаю 255 на дисплее!
Я если я все правильно понимаю, то это говорит о том, что к моему пину подключено максимальные 2.5 вольта ?
но пин свободный....
То что нога подключена (pull-up), влияет ли это на работу аdc ? мог ли я запороть свой ADC ?
Уже даже фьюзы на 8 мгц выставил, вместо родных 2х!
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

Может и сожгли, смотря что на него подавали, попробуйте притянуть резистором ~.1кОм к минусу будем считать, что это нижнее плечо делителя напряжения. Вы ведь пользуетесь делителем? Должны, так как где то видел, что вход подключается к 12 вольтам.
Но работать мой вольтметр отказываеться, реакции никакой, при подключении бп на контакты (бп 12 в) показывает все те же нули!


зачем умножать каждый раз при сложении
value = value + (adc_data*11/4);
и тратить лишние такты и к тому же увеличивая почти в три раза саму переменную, норовя нарваться на переполнение, в то время как можно просто
value+ =adc_data;
if(adc_counter<300)
display = (11*value)/(4*adc_counter);}

И вообще разве так считается вольтаж?
должно быть Vin =adc_result*c_delen*(Vop/(bits^2-1));
Все, кроме результата Ацп является константой, поэтому компилятор просто посчитает нужное значение и подставит его.
bits это количество используемых бит
Vop величина опорного напряжения
c_delen это коэффициент деления делителя напряжения.
Vin то напряжение, что нужно узнать.
Последний раз редактировалось vitalik_1984 Ср дек 19, 2012 20:58:03, всего редактировалось 1 раз.
Аватара пользователя
Sceam73
Встал на лапы
Сообщения: 86
Зарегистрирован: Вт авг 28, 2012 21:07:09

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

Сообщение Sceam73 »

Да, делителем пользуюсь, 1 и 10 Ком, и подстроечный на 5 ком! Вычитал что AVCC это как бы точка сравнения, и кинул ее на +5, как это делают в самых простых схемах! без всяких конденцаторов! Результат ? Работает! контроллер вываливает мне на экранн данные ацп 8ми битные! Если не ошибаюсь, в 8ми битном режиме, 255 должно показывань на 25.5 вольтах, при условии делителя 1:10! у меня на 12 показывает 50, Дело за малым, просчитать все хорошенько, и выводить на здоровье себе напряжение:) главное то что я заставил его работать :) Пока что все, буду переходить к следующему шагу!
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

Блин не успел отредактировать.Формулу расчета решил привести.
Аватара пользователя
Sceam73
Встал на лапы
Сообщения: 86
Зарегистрирован: Вт авг 28, 2012 21:07:09

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

Сообщение Sceam73 »

Разве мой вариант ошибочный ? В реализации моего варианта, показания по сравнению с самым дешевым китайским брехометром, розходятся в одну-2 десятки вольта!
Аватара пользователя
Sceam73
Встал на лапы
Сообщения: 86
Зарегистрирован: Вт авг 28, 2012 21:07:09

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

Сообщение Sceam73 »

Я немного не понял вопроса с временной переменной, и запятой.... Можно по подробнее?
Так, дальше вопрос немного глобальнее!
Если вызываеться прерывание, и процессор уходит в его обработку, то в это время другое прерывание выполниться лишь после завершения предыдущего?
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

Sceam73 писал(а):Разве мой вариант ошибочный ? В реализации моего варианта, показания по сравнению с самым дешевым китайским брехометром, рАСходятся в одну-2 десятки вольта!

Я не знаю точных ваших коэффициентов деления и какое у вас опорное.Но то, что умножение 300 раз выполняется зря, это точно.
Sceam73 писал(а):Я немного не понял вопроса с временной переменной, и запятой.... Можно по подробнее?
Так, дальше вопрос немного глобальнее!

Чего может быть глобальнее? Если для исключения дробных чисел(вычисления которых, как мы знаем, отнимают отнимают добрые 1,5 кб флеш) вы используете формат 255 где на самом деле сохранен результат 25,5 то нужно примерно делать так:

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


unsigned char temp
;
lcd_gotoxy(0,0);
lcd_clear();
temp=display/10;
itoa (temp,buffer);
lcd_puts(buffer);
lcd_putchar(",");
temp=display%10;
lcd_putchar(temp);
 

Либо по аналогии с выводом на семисегмент

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

unsigned char temp[]={"00,0V"};
lcd_gotoxy(0,0);
temp[0]=(display%10000/1000+0x30);
temp[1]=(display%1000/100+0x30);
temp[2]=(",");  /// Это не обязательно, так как мы объявили этот элемент в начале как зпт
//но на всякий случай можно заполнить.
temp[3]=(display%1000/10+0x30);
temp[4]=("V");
lcd_puts(temp);
 

Этот код заменит использование функции itoa(), но опять же в будущем придется не раз использовать такое преобразование, так что можно первый вариант оформить в виде отдельной функции и выводить температуру, напряжение, сантиметры ... еще черт знает что.
Sceam73 писал(а):Если вызываеться прерывание, и процессор уходит в его обработку, то в это время другое прерывание выполниться лишь после завершения предыдущего?

Не совсем.
Когда происходит событие, вызывающее прерывание, аппаратно выставляется флаг прерывания.
Далее, если флагов стоит несколько, то первым в обработку вступает то прерывание, приоритет которого выше, то есть то, которое выше в таблице векторов прерываний.
При этом аппаратно отключаются все остальные прерывания, даже если их приоритет выше.
Только программист по мере нужды может разрешить вложенные прерывания, но тут, опять же, есть подводные камни.
После выполнения процедуры обработки приходит очередь следующего прерывания, снова по таблице роста.
Но не ранее, чем одно выполнение команды основного цикла( это один или два такта в зависимости от команды)
Ну и на сам переход к обработке прерывания занимает около четырех тактов.
Плюс, если это си, то обязательно все необходимые регистры сохраняются в стеке.
В поисках истины человек развивается.
Аватара пользователя
Sceam73
Встал на лапы
Сообщения: 86
Зарегистрирован: Вт авг 28, 2012 21:07:09

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

Сообщение Sceam73 »

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

unsigned char temp;
lcd_gotoxy(0,0);
lcd_clear();
temp=display/10;
itoa (temp,buffer);
lcd_puts(buffer);
lcd_putchar(",");
temp=display%10;
lcd_putchar(temp);
 


действительно просто, я как то недодумался:)

А вот по поводу прерываний!
Немного запутался.... тоесть можно разрешить контроллеру уходить в другое прерывание, пока не закончено предыдущее?
Но опять же! У меня общий код программы, на сегодняшний день имеет 3 прерывания! Первое - АЦП, Второе по спаду ИНТ0, 3е По переполнению ТСНТ1! Второе и 3е прерывание никак друг на друга не попадут, т.к. там все прощитано цифрами! А вот первое, может выскочить в очень ненужный момент! Хотя.... Сколько примерно тактов займет прерывание АЦП ? Если не больше 50, то в принцыпе пускай себе выскакивает, но вот меня смущает delay_us 10 !По каким параметрам мк отсчитывает эти 10 us ? На какой частоте кварца 10us будут являться действительно 10 us ? контролеру нужно высчитать 14 тыс/раз в минуту! И он должен открыть транзистор который даст сигнал, и все это нужно уложить хотя б в промежуток 0,00000119 сек! В принцыпе для мк впоймать этот момент времени не проблема, НО если выскочит прерывание, и займет этот промежуток времени... будит плохо! Суть проблемы в чем, что б сделать так, что б во время прерывания ацп, могло вызваться 2и 3е прерывание! А на оборот, во время 2го или 3го ацп становилось в очередь, и выполнялось после окончания предыдущего!
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

ошибочка вышла- вот так надо было

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

 lcd_putchar(temp+0x30);  

Писал поздно ночью, проверять неохота было.Вы уж проверьте, ладно?

Насчет прерываний, очень хорошо все просчитайте, возмозможно все будет лишним из того, что вы говорите и достаточно будет просто увеличить частоту процессора.
Еще насчет 10мс, тут, конечно можно пересмотреть нужно ли вам вообще изменять точку входа Ацп или просто один канал Ацп измерять будет достаточно.если второй вариант, то можно паузу выбросить. И соответственно настройку и сохранение в буфер.В CVAVR есть много шаблонов обработки.
Ответить

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