Jump to content

Recommended Posts

Уважаемый. А давайте Вы перепишете весь код.

Там просто нечего анализировать. ВСЕ не так.

Принципы построения.

В прерывании программа должна находиться как выстрел - мгновение. Все должно выполняться в main по флагам (не по флагам прерываний, а по ВАШИМ программным флагам, которые устанавливаются в прерывании.

То есть заведите в своей программе в разделе объявления переменных СТРУКТУРУ вида:

struct flags {
unsigned <имя флага 1>: 1;
unsigned <имя флага 2>: 1;
unsigned <имя флага 3>: 1;
//.......................
//столько - сколько нужно
unsigned <имя флага N>: 1;
} flagsbits;

Обращение к элементам структуры (в данном случае они однобитные)

// сбросить флаг
flagsbits.<имя флагаN> = 0;
// установить флаг
flagsbits.<имя флагаN> = 1;
// если флаг установлен
if (flagsbits.<имя флагаN>)
{
}
// если флаг сброшен
if (! flagsbits.<имя флагаN>)
{
}
//
если одновременно установлено два флага
if (flagsbits.<имя флагаN> && flagsbits.<имя флагаK>)
{
}
// если установлен один или два флага
if (flagsbits.<имя флагаN> || flagsbits.<имя флагаK>)
{
}

В прерывании эти флаги взводят как требование их исполнить в main, а при исполнении в main их сбрасывают.

В прерывании снимают данные с регистров CCPR, TMR, ADRES и прочих, максимум вычисляют простые (максимум unsigned int) суммы - разности и тут же выходят. Всякие расчеты вывода, сам вывод на индикаторы , деления-умножения и прочую долгоиграющую лабуду - ВСЕ В ГЛАВНЫЙ ЦИКЛ.

Не нужно при выводе запрещать прерывания. У Вас вообще это делается в прерывании, что при запрете бессмысленно, ибо и так запрещены, а при разрешении приводит к вложенным вызовам, что разрушает сохраненный компилятором контекст и ПОЛНОСТЬЮ РАЗРУШАЕТ АЛГОРИТМ.

Прерывание не может разрушить переменные, которые оно не модифицирует в своем теле. Если Вы объявите переменную как volatile, компилятор никогда не будет пользоваться такой переменной для вычисления непосредственно, а создаст ее копию ОДНОЙ ИНСТРУКЦИЕЙ, либо сам запретит прерывания на время создания копии. То есть все глобальные переменные которые модифицируются в прерывании нужно объявлять с квалификатором volatile.

Еще раз. Не обижайтесь. Написана полная чушь. Исправлять бессмысленно.

И еще. При работе с симулятором не нужно ничего выводить на индикацию. Все можно посмотреть в Watch в режиме отладки. Поставили точку останова в нужном месте - посмотрели что в переменных. Если нужно прошли по шагам.

Это в железе в этом контроллере нет блока отладки (дебаггера), а в модели симулятора все можно дебажить (отлаживать).

Edited by my504

Share this post


Link to post
Share on other sites

подаю 19,5 мсек тоесть 19500 микросек, тоесть я должен увидеть хотя бы 500, а я вижу 0

Вот, в программе convert, если tm>999, то оно не попадает в условия и не происходит разложение на сотни-десятки-единицы. При этом в LED[0], LED[1], LED[2] просто записывается какой-то мусор. А у Вас как раз 19500 > 999.

Поставьте ещё условие, мол, если tm>999, то tm=999. И все большие значения будут отображаться как "999", например.

Или сначала отсеките тысячи tm=tm%1000, оставьте от числа только младшую часть, потом уже преобразуйте. Тогда увидите "500" от "19500".

Вот ещё одна неувязка - вычисление скорости:

tm = (2.032/((period/1000000)*5))*3.6;

У Вас величина периода меньше миллиона, поэтому первое деление period/1000000 даст результат меньше 1, а в целых числах это просто ноль.

Преобразуйте вычисление, просто перемножьте все коэффициенты сами вручную и получится

tm = 1463040/period;

Вот это уже гораздо лучше выглядит. Вот так я бы использовал в программе для вычисления скорости. Лучше потому, что нет дробных переменных, а просто целочисленное деление. И выполняется быстрее процессором и памяти меньше жрёт.

Edited by Yurkin2015

Share this post


Link to post
Share on other sites

Металл-композит как альтернатива ферриту: дроссели Panasonic семейства ETQP

Современные электронные устройства требуют все более компактных и эффективных компонентов. Новые металл-композитные дроссели обладают рядом преимуществ перед дросселями с ферритовым сердечником. Они не имеют ярко выраженного насыщения, обладают отличными частотными свойствами и способны работать при температурах до 150°C и выше. Все это делает их альтернативой стандартным дросселям с ферритовым сердечником в широком спектре автомобильных и промышленных приложений.

Подробнее

Еще раз. Не обижайтесь. Написана полная чушь. Исправлять бессмысленно.

А я и не обижаюсь, все что у меня написано в коде это все по советам в этой ветке =) Так что нужно обижаться им.

А я изначально все спрашивал как грамотно и тд и тп.

Буду пробывать по вашему варианту. вчитываться и вдумываться.

Share this post


Link to post
Share on other sites

Прочитайте басню Михалкова "Слон-живописец".

:crazy:

Чтобы задавать вопрос, нужно на 80% знать на него ответ. Иначе проку от ответа не будет.

Так и получилось. Вы сбросили причудливую кучу самые разнородные ответы, каждый из которых ОТДЕЛЬНО вполне справедлив. Но ВМЕСТЕ получилась галиматья.

Вам надлежит построить в голове не только ЧТО делает алгоритм, но и КОГДА он это делает.

То есть вместе с блок-схемой необходимо нарисовать ВРЕМЕННУЮ ДИАГРАММУ этого алгоритма.

Edited by my504

Share this post


Link to post
Share on other sites
                     

Новые литиевые ХИТы Fanso работают даже при +150ºС!

Когда приходится учитывать работу в экстремальных условиях, к выбору электронных компонентов подходишь с особой тщательностью. Высокие температуры, большие перепады давления, труднодоступность – все это требует специальной продукции. Склад КОМПЭЛ пополнился новыми литиевыми ХИТами Fanso, стабильно работающими даже при температуре до 150 ºС. Батарейки имеют номинальное напряжение 3,6 В, обладают ёмкостью от 700 до 14000 мАч, работоспособны в широком температурном диапазоне -20…150ºС и имеют низкий саморазряд (не более 3% в год в нормальных условиях хранения).

Подробнее о высокотемпературной линейке

Позже вернусь к выше написанному а пока что следующий вопрос по пику.

мне нужно слать по кан шине пакет с данными.

Планирую сооружать вот по такой схеме:

wGJC0iz9Djc.jpg

Есть пару вопросов, во-первых обязательно ли нужен кварцевый резонатор на 8Mhz для MCP2510?

Как я понимаю мне надо сконфигурировать МК и сконфигурировать MCP2510, я примеры программ видел но не очень понял. Понимаю что МК общается с MCP2510 по SPI, тоесть я пишу программу для МК и в ней пишу конфигурацию для MCP2510 и шлю эти конфигурационные данные по SPI? Если да то почему я не нашел этого места в коде? Или я чего то не понимаю?

Share this post


Link to post
Share on other sites

1. Кварц обязателен. Все асинхронные интерфейсы требуют стабильной и определенной частоты, иначе обеспечить прием длинных слов невозможно.

2. В каком виде Вы ожидали увидеть инициализацию КАН в коде? Скорее всего это вывод из таблицы. Адресация SPI может быть и косвенной, поэтому увидеть адрес регистра SPI может и не получиться. Вообще, разбор стеков протоколов даже в исходниках программ достаточно сложное занятие. А уж разобрать этот стек через дизасм чужого кода - полагаю невозможным В ПРИНЦИПЕ для Вашего уровня квалификации. Подобная задача является мазохизмом в кубе. Гораздо проще написать свой код с нуля. И по любому требует точного знания и свободного владения самим разбираемым протоколом.

Share this post


Link to post
Share on other sites

Да не я аж с комментариями код разбирал http://pro-diod.ru/article/mcp2515-can-kontroller.html

Хотя вот щас поглядел еще раз и как понимаю создана функция которая вызывает функцию по SPI и по сути по SPI Шлет инфу конфигурации в MCP, я правильно понял?

Ну вот к примеру

mcp_write(CANINTE,0x00);

тоесть конфигурация MCP осуществляется записью в определенные регистры данных по SPI

Share this post


Link to post
Share on other sites

Доброго времени суток.Второй день бьюсь с DS18B20,не могу понять почему не работает,на индикатор выводит только -00,06 и все.В архиве проект в микроС и протеус.

PS дело оказалось в кварце.Вопрос закрыт.Всем спасибо.

Edited by P32L

Share this post


Link to post
Share on other sites

Блин с элементарной вещью разобраться не могу, че у меня порты не горят а моргают?

PIC16F819

Уже всю программу закомментил и осталось вот что:

void init(void)
{
INTCON =0b00000000;
PORTA = 0; //îáíóëÿåì ïîðòû à
PORTB = 0;
TRISA = 0b00000000; //âñå ïîðòû RA íà âûõîä
TRISB = 0b00000000;

void main(){
init(); //âûçûâàåòñÿ ôóíêöèÿ init
while(1)
{
RA0_bit=1;
RA1_bit=1;
RA2_bit=1;
RA3_bit=1;
RA4_bit=1;
RA6_bit=1;
RA7_bit=1;

RB0_bit=1;
RB1_bit=1;
RB2_bit=1;
RB3_bit=1;
RB4_bit=1;
RB5_bit=1;
RB6_bit=1;
RB7_bit=1;
}
}

Порты RA0-RA3 моргают а не горят

где я накосячил?

Среда microC и кстати как кодировку нормальную поставить чтобы копировались комментарии?

Share this post


Link to post
Share on other sites

Кодировку не надо ставить, просто переключайтесь НА РУССКИЙ язык когда копируете что-то в буфер обмена. Проблеме 100 лет в винде с неюникодовыми полями ввода/вывода текста... так и не решили.

Кстати, а что скрывается под конструкцией вида RA0_bit? Может в этом проблема...

Это явно не родная часть языка, это какой-то макрос.

Edited by Alexeyslav

Учение - изучение правил. Опыт - изучение исключений.

Share this post


Link to post
Share on other sites

Да как я понял это опять проблемы протеуса. на реальной плате все работает.

Share this post


Link to post
Share on other sites

Dobroe vremya sutok . mojete podskazat kak mojno sbrosit prosessor na HI-TECH v programme ;

if (usloviya) sbros prosessora;

Share this post


Link to post
Share on other sites

очень просто. Если условие выполнено, запускаешь watchdog и сразу после него ставишь бесконечный цикл. Первая инструкция в программе должна отключать watchdog. Будет сброс по требованию.


Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Share this post


Link to post
Share on other sites

mail_robot вы опять бред пишите... собака в пиках отключается только на уровне железа, отключить/включить ее программно не возможно...

можно только сбросить....

batir74 чем вызвана необходимость программного сброса МК?

if (usloviya) asm("GOTO 0x000");

Share this post


Link to post
Share on other sites

Программно сбросить контроллер невозможно, только физически отдельной ножкой порта дёрнуть ножку сброса...

Или, программно запретить прерывания и перейти по вектору RESET, чтобы программа повторно прошла процесс инициализации периферии. Но тут есть засада, это не настоящий аппаратный сброс и состояние некоторой периферии, которая не инициализируется в начале программы может оказаться не в начальном состоянии, поэтому чтобы возможно было реализовать такой финт ушами в начальной инициализации НЕОБХОДИМО задать состояние всей периферии без исключения и состояние всех переменных.


Учение - изучение правил. Опыт - изучение исключений.

Share this post


Link to post
Share on other sites

v kompilyatore CCS mojno sbrosit prossesor reset_cpu(); , na HI-TECH kak eto mojno sdelat ?

я вам уже написал , что не понятно

if (usloviya) asm("GOTO 0x000");

поэтому чтобы возможно было реализовать такой финт ушами в начальной инициализации НЕОБХОДИМО задать состояние всей периферии без исключения и состояние всех переменных.

хайтек для этого формирует старт.файл или нет?

Share this post


Link to post
Share on other sites

А посмотри сам, это ведь не сложно? Главное, чтобы перед переходом прерывания были запрещены.


Учение - изучение правил. Опыт - изучение исключений.

Share this post


Link to post
Share on other sites

Кстати, собаку же можно включить постоянно, просто зациклив прогу, не сбрасывать её. Получится тот же сброс, но долгий. Зато правильный.

А гоуту 0х00 ... хм... даже и не знаю, на что можно напороться с такими финтами...

Можно ногой дёргать внешний сброс, тоже вариант.

Но, скорее всего, человеку это всё без надобности. Частенько такие вопросы задают новички. Ещё любимый вопрос "Как выйти из прерывания в другую функцию". Это всё говорит о неправильном алгоритме программы. Можно обойтись и без всего этого.

Share this post


Link to post
Share on other sites
mail_robot вы опять бред пишите

пардон. Уже отвык от этого хлама. В STM такой финт делается без проблем

но я честно говоря ситуаций требующих такого насилия над камнем даже придумать не могу

Edited by mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Share this post


Link to post
Share on other sites
хм... даже и не знаю, на что можно напороться с такими финтами...

на активное прерывание, если забыть его запретить перед переходом, на неинициализированные регистр периферии который будет хранить прежнее состояние... необнулённую переменную, которая полагалась равной нулю при аппаратном сбросе. В таймере предделитель может остаться не сброшенным.


Учение - изучение правил. Опыт - изучение исключений.

Share this post


Link to post
Share on other sites

DOBROE VREMYA SUTOK . HOTEL IZMERIT DLINU IMPULSA PO VHODU INT ;

if (INTF) {

INTF=0;//SBROS FLAGA

INTEDG=0;//PEREKLUCHAEM PRERIV. PO ZADNEMU FRONTU

TMR1ON=1;//VKLUCHAEM TMR1

TMR1L=0;

TMR1H=0;//OBNULAEM TMR1

}

if(INTF){

INTF=0;//SBROS FLAGA PRERIV.

INTEDG=1;//PEREKLUCHAEM PRERIVANIYA PO PEREDNEMU FRONTU

TMR1ON=0;//VIKLUCHIM TMR1

tamer=(TMR1H<<8)+TMR1L;//ZAPISIVAEM ZNACHENIYA TMR1

}

PRAVILNO TAKOY PODHOD DLYA IZMERENIE DLINU IMPULSA?

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Similar Content

    • By LemonTV
      Есть картинка из сайта с фьюзами, есть программа avrdude_prog3.3 Как выставить правильно фьюзы чтобы не испортить мк? Незнаю как это сделать есть прямые и инверсные фьюзы, ГДЕ СТАВИТЬ ГАЛОЧКИ И КРУЖОЧЕК НА ПРЯМЫХ ИЛИ ИНВЕРСНЫХ?


    • By dron92
      Подскажите как вернуть к жизни контролер или в утиль!
      Решил собрать программатор AVRISP mkII купил микросхему собрал подключил а устройств нет в диспетчере и  Flip не видит его!
      Начал искать косяки в сборке не нашел решил спаять Отладочная плату
      тот же результат, попробовал подключить через ISP не отвечает !
      Решил пойти на крайние меры  подключил через FuseDoctor сигнатуру он не видел вел 1e9482 вроде увидел но результата сбросить не проучилось но теперь он начал видится в таком формате фото внизу




    • By Sl653
      Доброй ночи. Продам Segnetics SMH4 новый в упаковке. 14 т.р. и УПП Siemens Sirius 3RW4036 29т.р. тоже новый. Если кого заинтересовало то пишите на почту sl.s@inbox.ru
       
       


    • By Jesterary
      Здравствуйте. Подскажите, был ли у кого-то опыт отправки изображений с камеры (подключенной через UART или bluetooth-камеры) через GPRS (у меня модуль SIM800L, но в целом это не принципиально) на удаленный сервер? Средствами управляющего микроконтроллера, пусть даже ардуины какой-нибудь, но не малины. Возможно ли это вообще? Хотелось бы, конечно, использовать в проекте беспроводную камеру и общаться с ней, ибо камеры, подключаемые напрямую так себе качество дают. 
      Сразу скажу, что важна именно такая связь. Микроконтроллер + модуль связи + камера находятся в коробке и путешествуют по городу, в это время человек сидя дома на диване может смотреть фото с этой камеры. Смартфон для моих целей не подойдет, суть именно в микроконтроллере с модулями.
      Если у кого-то такое получалось - поделитесь, пожалуйста :)
      А то нахожусь в некоторой прострации и даже не знаю, в какую сторону думать.
    • By Николай кол
      Привет, у меня есть вопрос, как передать данных с микроконтроллера pic через блютуз модуль HC-05 на телефон в виде графика.Не могли бы вы показать скрипт или статю.Про Arduino много а про pic не (нужно передать данные с микроконтроллера на телефон а не на оборот).У же есть приложение на app inventor 2.Нужно примерно как тут https://www.youtube.com/watch?v=WzoCQ2fRsRQ
×
×
  • Create New...