Страница 389 из 628
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 есть много шаблонов обработки.
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Чт дек 20, 2012 09:53:16
Nevox
Здравствуйте.попытка номер 2.
хотел бы спросить как осуществить запись в регистр в Verilog.
вот код
Код: Выделить всё
module SN_DVV_14_220V (IN,INT,WR,RD,CS,RESET,DAT,A);
input wire [3:0] A;
input wire [13:0]IN;
input wire WR, RD, CS, RESET,INT;
inout [7:0] DAT;
reg [7:0] D;
assign DAT[7:0]=(!CS&!RD)?D[7:0]:8'bz;
always @(negedge RD)
case (A)
4'b0000: D = 8'b00010000;
4'b0001: D = 8'b00100011;
4'b0010: D = 8'b00001110;
4'b0011: D = 8'b00001000;
4'b1000: D = IN[7:0];
4'b1001: D <= {2'b0, IN[13:8]};
default: D = 8'b00000000;
endcase
endmodule
здесь в операторе кейс идет считывание регистров,как мне написать так,чтобы я мог в этот регистр что-нибудь записать?
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Чт дек 20, 2012 12:22:59
ibiza11
хотел бы спросить как осуществить запись в регистр в Verilog.
вот здесь у вас идет запись в регистр
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Чт дек 20, 2012 12:50:40
Nevox
а как написать условие в регистрах?
допустим при одном условии у нас в регистр пишется одно значение , а в другом случае пишется другое значение? внутри кейса можно это сделать?
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Чт дек 20, 2012 14:32:32
AlexSun
Есть прошивка для PIC18F252 в формате HEX, она делает некие дела и шлет в RS232 "Готово". Возможно ли ее дизассемблировать и изменить это "Готово" на другую строку такой же длины?
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Чт дек 20, 2012 14:44:26
Engineer_Keen
Конечно можно...
Можно даже не дизассемблировать, а править прямо HEX, только контрольную сумму подправить, это при условии что строчка - простая последовательность ASCII символов. Искать последовательность C3 EE F2 EE E2 EE.
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Чт дек 20, 2012 14:52:00
black_lizard
Есть прошивка для PIC18F252 в формате HEX, она делает некие дела и выводит на экран "текст". Возможно ли ее дизассемблировать и изменить этот "текст"?
Любым HEX редактором.
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Чт дек 20, 2012 14:58:12
AlexSun
Engineer_Keen, где находится контрольная сумма и как ее узнать для отредактированного кода?
"Готово" так и будет написано подряд в HEX редакторе? (в 16 системе естественно)
В коде программы знаю было printf("Готово");
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Чт дек 20, 2012 15:01:42
Gudd-Head
AlexSun писал(а):"Готово" так и будет написано подряд в HEX редакторе?
Не факт. Может чередоваться вызовами функций вывода на дисплей.
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Чт дек 20, 2012 15:19:26
Engineer_Keen
AlexSun писал(а):где находится контрольная сумма и как ее узнать для отредактированного кода?
контрольная сумма - последний байт в каждой строке HEX-файла. Считается как сумма всех байт в строке по модулю 256, отнятая от 256.
AlexSun писал(а):"Готово" так и будет написано подряд в HEX редакторе? (в 16 системе естественно)
HEX редактор не нужен, HEX файл можно редактировать простым блокнотом, там просто последовательности 16-х чисел.
Будет ли там так написано, зависит от компилятора и структуры программы, если будет, то повезло. Меняем на то что надо и пересчитываем контрольные суммы для строк в которых менялись дынные.
На всякий случай -
описание формата Intel HEX
Gudd-Head писал(а):Не факт. Может чередоваться вызовами функций вывода на дисплей.
Ну раз там printf("Готово"), скорее всего все таки последовательность .db "Готово", причем или рядом с процедурой ее вызывающей или где-то в конце кода.
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Чт дек 20, 2012 15:25:24
AlexSun
Engineer_Keen писал(а):контрольная сумма - последний байт в каждой строке HEX-файла. Считается как сумма всех байт в строке по модулю 256, отнятая от 256.
То есть 256 - (сумма байтов % 256), я правильно понял?
Engineer_Keen писал(а):Будет ли там так написано, зависит от компилятора и структуры программы, если будет, то повезло.
Компилятор CCS PIC C, строка выводится вся сразу.
Спасибо за информацию, отпишу потом о результатах.
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Чт дек 20, 2012 15:30:41
Engineer_Keen
AlexSun писал(а):То есть 256 - (сумма байтов % 256), я правильно понял?
Если % это сумма по модулю 256, то да. Или CRC=256 - (сумма байтов AND 255), тоже самое.
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Чт дек 20, 2012 17:00:41
AlexSun
CC научился считать...
"Готово" нашел в первых строках прошивки. Заканчивается нулем. А строку другой длины невозможно туда вписать? Адреса придется править?
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Чт дек 20, 2012 17:48:57
Engineer_Keen
AlexSun писал(а):CC научился считать...
Можете себя проверить, сравнив последние числа в строках HEX файле с тем что получится если посчитать вручную.
AlexSun писал(а):А строку другой длины невозможно туда вписать? Адреса придется править?
Как минимум адреса и только после дизассемблера, тут уже без этого никак.
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Чт дек 20, 2012 18:09:47
AlexSun
После дизассемблера в PIC C я не нахожу там в коде "Готово", не целиком, не отдельные символы. Чем тогда дизассемблерировать и чем потом собрать HEX?
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Чт дек 20, 2012 20:14:55
Engineer_Keen
Дизассемблер не скажет что там лежит слово "готово" прямо в виде .db "Готово", он только может сказать что по такому-то адресу какие-то данные или неверная команда, а может и за последовательность команд принять. Посмотрите по HEX файлу, с какого адреса начинается слово, и найдите это место в дизассемблированной программе.
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Пт дек 21, 2012 15:23:20
Nevox
Здравствуйте.Идея такая: есть процессорный модуль,который управляет другими модулями. На подчиненных подулях стоят плисы альтера на 44 пина серии 3000А(конкретно 3064),как надо написать в прошивке плисов,чтобы процессорный модуль мог менять регистры подчиненным модулям? нужно какое-то разрешение? или как-то регистры задать?
вариант прошивки опять же вот
Код: Выделить всё
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;