Страница 388 из 628
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Вт дек 18, 2012 14:06:41
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;
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Вт дек 18, 2012 14:59:27
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
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Вт дек 18, 2012 20:25:49
FreshMan
вопрос по Atmega8
если я делаю аппаратный TWI то 4 и 5 пины порта С конфигурировать на выход или оставить все по нулям DDRC=0x00;
PORTC=0x00; ?
http://rghost.ru/42342241.view
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Вт дек 18, 2012 21:09:34
Sceam73
cvavr ругаеться на itoa ...undefined symbol
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Вт дек 18, 2012 23:54:48
black_lizard
cvavr ругаеться на itoa ...undefined symbol
#include <stdlib.h>
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Ср дек 19, 2012 00:26:53
black_lizard
Никогда не думал, что работа с файловой системой флешки, а именно фат настолько геморна и будет самым проблемным местом моего проекта.
Кое как научил мк бегать по папкам командами dir и cd, как в досе.
Но есть пара вопросов, дабы не плодить тем, ответы на которые в инете я не нашёл.
Как высчитывается смещение до корневой директории?
Где записан размер кластера?
Где находится пресловутая таблица файлов, когда начало флешки просто забито сплошными FF? Вроде как, она должна располагаться в начале.
Размер кластера(или сектора, так и не понял) - 0х2000, выяснен экспериментальным путём. Как тогда корневая директория может быть в 0x5B200? Я могу понять, что первые 0x200 это данные ФС, которых кот наплакал, но как прибавляя 0x2000 можно получить 5B200 для меня осталось загадкой. Разве размер кластера не фиксирован?
Думал, что fat простой, потому что древний. Зря я так думал.
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Ср дек 19, 2012 00:30:55
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);
}
}
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Ср дек 19, 2012 08:51:21
a_skr
а ничего, что 1<<8 = 0x100 = 256 и в однобайтовый регистр не влезет?
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Ср дек 19, 2012 09:21:10
Gudd-Head
FreshMan писал(а):если я делаю аппаратный TWI то 4 и 5 пины порта С конфигурировать на выход или оставить все по нулям DDRC=0x00
Насколько я помню, при включении периферии она перехватывает пины, и на них уже никак не повлиять. Т.е. конфигурировать их специально не надо.
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Ср дек 19, 2012 13:39:31
Sceam73
a_skr писал(а):а ничего, что 1<<8 = 0x100 = 256 и в однобайтовый регистр не влезет?
я об этом думал... но это 1<<8 ни на что не повлияет, еденица просто уйдет.....
Это не столь важно, меня больше интересует, почему у меня моя программа не работает ? Я уже себе весь мозг поломал!
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Ср дек 19, 2012 15:34:32
a_skr
ADMUX = (1 << 1)|(1 << 2)|(0 << 4)|(0 << 5)|(0 << 6)|(0 << 7) ;
= 0x06 - зачем выбирать вход PC6, если используется PC0?
выбран внешний источник опорного напряжения, а оно не подведено!
и еще математику проверьте. не будет ли переполнения при суммировании результатов.
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Ср дек 19, 2012 18:52:40
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х!
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Ср дек 19, 2012 20:20:21
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 то напряжение, что нужно узнать.
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Ср дек 19, 2012 20:55:20
Sceam73
Да, делителем пользуюсь, 1 и 10 Ком, и подстроечный на 5 ком! Вычитал что AVCC это как бы точка сравнения, и кинул ее на +5, как это делают в самых простых схемах! без всяких конденцаторов! Результат ? Работает! контроллер вываливает мне на экранн данные ацп 8ми битные! Если не ошибаюсь, в 8ми битном режиме, 255 должно показывань на 25.5 вольтах, при условии делителя 1:10! у меня на 12 показывает 50, Дело за малым, просчитать все хорошенько, и выводить на здоровье себе напряжение:) главное то что я заставил его работать

Пока что все, буду переходить к следующему шагу!
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Ср дек 19, 2012 21:13:26
vitalik_1984
Блин не успел отредактировать.Формулу расчета решил привести.
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Ср дек 19, 2012 22:50:54
Sceam73
Разве мой вариант ошибочный ? В реализации моего варианта, показания по сравнению с самым дешевым китайским брехометром, розходятся в одну-2 десятки вольта!
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Ср дек 19, 2012 22:54:41
Sceam73
Я немного не понял вопроса с временной переменной, и запятой.... Можно по подробнее?
Так, дальше вопрос немного глобальнее!
Если вызываеться прерывание, и процессор уходит в его обработку, то в это время другое прерывание выполниться лишь после завершения предыдущего?
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Чт дек 20, 2012 00:34:08
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 писал(а):Если вызываеться прерывание, и процессор уходит в его обработку, то в это время другое прерывание выполниться лишь после завершения предыдущего?
Не совсем.
Когда происходит событие, вызывающее прерывание, аппаратно выставляется флаг прерывания.
Далее, если флагов стоит несколько, то первым в обработку вступает то прерывание, приоритет которого выше, то есть то, которое выше в таблице векторов прерываний.
При этом аппаратно отключаются все остальные прерывания, даже если их приоритет выше.
Только программист по мере нужды может разрешить вложенные прерывания, но тут, опять же, есть подводные камни.
После выполнения процедуры обработки приходит очередь следующего прерывания, снова по таблице роста.
Но не ранее, чем одно выполнение команды основного цикла( это один или два такта в зависимости от команды)
Ну и на сам переход к обработке прерывания занимает около четырех тактов.
Плюс, если это си, то обязательно все необходимые регистры сохраняются в стеке.
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Чт дек 20, 2012 01:16:08
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го ацп становилось в очередь, и выполнялось после окончания предыдущего!
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Чт дек 20, 2012 04:10:17
vitalik_1984
ошибочка вышла- вот так надо было
Писал поздно ночью, проверять неохота было.Вы уж проверьте, ладно?
Насчет прерываний, очень хорошо все просчитайте, возмозможно все будет лишним из того, что вы говорите и достаточно будет просто увеличить частоту процессора.
Еще насчет 10мс, тут, конечно можно пересмотреть нужно ли вам вообще изменять точку входа Ацп или просто один канал Ацп измерять будет достаточно.если второй вариант, то можно паузу выбросить. И соответственно настройку и сохранение в буфер.В CVAVR есть много шаблонов обработки.