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

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

Сообщение Sceam73 »

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

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

Сообщение 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го ацп становилось в очередь, и выполнялось после окончания предыдущего!
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

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

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

 lcd_putchar(temp+0x30);  
Писал поздно ночью, проверять неохота было.Вы уж проверьте, ладно?

Насчет прерываний, очень хорошо все просчитайте, возмозможно все будет лишним из того, что вы говорите и достаточно будет просто увеличить частоту процессора.
Еще насчет 10мс, тут, конечно можно пересмотреть нужно ли вам вообще изменять точку входа Ацп или просто один канал Ацп измерять будет достаточно.если второй вариант, то можно паузу выбросить. И соответственно настройку и сохранение в буфер.В CVAVR есть много шаблонов обработки.
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Мучитель микросхем
Сообщения: 426
Зарегистрирован: Чт авг 09, 2012 08:57:20

Сообщение 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
здесь в операторе кейс идет считывание регистров,как мне написать так,чтобы я мог в этот регистр что-нибудь записать?
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

хотел бы спросить как осуществить запись в регистр в Verilog.
вот здесь у вас идет запись в регистр

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

4'b1001:    D <= {2'b0, IN[13:8]};
Ставим плюсы: )
Реклама
Мучитель микросхем
Сообщения: 426
Зарегистрирован: Чт авг 09, 2012 08:57:20

Сообщение Nevox »

а как написать условие в регистрах?
допустим при одном условии у нас в регистр пишется одно значение , а в другом случае пишется другое значение? внутри кейса можно это сделать?
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Пт ноя 02, 2012 21:52:47

Сообщение AlexSun »

Есть прошивка для PIC18F252 в формате HEX, она делает некие дела и шлет в RS232 "Готово". Возможно ли ее дизассемблировать и изменить это "Готово" на другую строку такой же длины?
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Конечно можно...
Можно даже не дизассемблировать, а править прямо HEX, только контрольную сумму подправить, это при условии что строчка - простая последовательность ASCII символов. Искать последовательность C3 EE F2 EE E2 EE.
Последний раз редактировалось Engineer_Keen Чт дек 20, 2012 14:53:32, всего редактировалось 1 раз.
Встал на лапы
Аватара пользователя
Сообщения: 132
Зарегистрирован: Вс сен 23, 2012 05:51:35

Сообщение black_lizard »

Есть прошивка для PIC18F252 в формате HEX, она делает некие дела и выводит на экран "текст". Возможно ли ее дизассемблировать и изменить этот "текст"?
Любым HEX редактором.
Собираю самопальный мини-компьютер
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Пт ноя 02, 2012 21:52:47

Сообщение AlexSun »

Engineer_Keen, где находится контрольная сумма и как ее узнать для отредактированного кода?
"Готово" так и будет написано подряд в HEX редакторе? (в 16 системе естественно)
В коде программы знаю было printf("Готово");
Друг Кота
Аватара пользователя
Сообщения: 20132
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

AlexSun писал(а):"Готово" так и будет написано подряд в HEX редакторе?
Не факт. Может чередоваться вызовами функций вывода на дисплей.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

AlexSun писал(а):где находится контрольная сумма и как ее узнать для отредактированного кода?
контрольная сумма - последний байт в каждой строке HEX-файла. Считается как сумма всех байт в строке по модулю 256, отнятая от 256.
AlexSun писал(а):"Готово" так и будет написано подряд в HEX редакторе? (в 16 системе естественно)
HEX редактор не нужен, HEX файл можно редактировать простым блокнотом, там просто последовательности 16-х чисел.
Будет ли там так написано, зависит от компилятора и структуры программы, если будет, то повезло. Меняем на то что надо и пересчитываем контрольные суммы для строк в которых менялись дынные.
На всякий случай - описание формата Intel HEX
Gudd-Head писал(а):Не факт. Может чередоваться вызовами функций вывода на дисплей.
Ну раз там printf("Готово"), скорее всего все таки последовательность .db "Готово", причем или рядом с процедурой ее вызывающей или где-то в конце кода.
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Пт ноя 02, 2012 21:52:47

Сообщение AlexSun »

Engineer_Keen писал(а):контрольная сумма - последний байт в каждой строке HEX-файла. Считается как сумма всех байт в строке по модулю 256, отнятая от 256.
То есть 256 - (сумма байтов % 256), я правильно понял?
Engineer_Keen писал(а):Будет ли там так написано, зависит от компилятора и структуры программы, если будет, то повезло.
Компилятор CCS PIC C, строка выводится вся сразу.

Спасибо за информацию, отпишу потом о результатах.
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

AlexSun писал(а):То есть 256 - (сумма байтов % 256), я правильно понял?
Если % это сумма по модулю 256, то да. Или CRC=256 - (сумма байтов AND 255), тоже самое.
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Пт ноя 02, 2012 21:52:47

Сообщение AlexSun »

CC научился считать...

"Готово" нашел в первых строках прошивки. Заканчивается нулем. А строку другой длины невозможно туда вписать? Адреса придется править?
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

AlexSun писал(а):CC научился считать...
Можете себя проверить, сравнив последние числа в строках HEX файле с тем что получится если посчитать вручную.
AlexSun писал(а):А строку другой длины невозможно туда вписать? Адреса придется править?
Как минимум адреса и только после дизассемблера, тут уже без этого никак.
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Пт ноя 02, 2012 21:52:47

Сообщение AlexSun »

После дизассемблера в PIC C я не нахожу там в коде "Готово", не целиком, не отдельные символы. Чем тогда дизассемблерировать и чем потом собрать HEX?
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Дизассемблер не скажет что там лежит слово "готово" прямо в виде .db "Готово", он только может сказать что по такому-то адресу какие-то данные или неверная команда, а может и за последовательность команд принять. Посмотрите по HEX файлу, с какого адреса начинается слово, и найдите это место в дизассемблированной программе.
Мучитель микросхем
Сообщения: 426
Зарегистрирован: Чт авг 09, 2012 08:57: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;
Ответить

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