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

Обсуждаем контроллеры компании Atmel.
mas123
Потрогал лапой паяльник
Сообщения: 312
Зарегистрирован: Вс июл 29, 2012 16:25:39

Re: как вывести младший байт в порт

Сообщение mas123 »

novarobotix писал(а):я пока непонимаю как это реализовать и насколько это будет быстрее чем сейчас сделано
Ты бы почитал какие книжки по оформлению кода, по стилям программирования.
В таком сапагетти ты не то что мух, слонов не увидишь!
novarobotix писал(а): if (PINB.0==1 & temp_save==0) {n_eprom=n;nfp=n;temp_save=1;mig(2);} // записываем в память значение включения конденсаторов
if (PINB.0==0) {temp_save=0;} // nfp - значение с которого включаются кандёры X

if (PINB.4==1 & temp_save2==0) {n_eprom2=n2;nfp2=n2;temp_save2=1;mig(2);} // записываем в память значение включения конденсаторов для Y
if (PINB.4==0) {temp_save2=0;} // nfp2 - для Y
Открой для себя супер возможности оператора if-else!
Спойлер

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

    if (PINB.0 == 0) 
    { // nfp - значение с которого включаются конденсаторы X
        temp_save = 0;
    }else
    {
        if( 0 == temp_save ) 
        { // записываем в память значение включения конденсаторов
            n_eprom =  nfp = n;
            temp_save = 1;
            mig(2);
        }
    }
    if( PINB.4 == 0 ) 
    { // nfp2 - для Y
        temp_save2 = 0;
    }else
    {
        if( 0 == temp_save2 ) 
        { // записываем в память значение включения конденсаторов для Y
            n_eprom2 = nfp2 = n2;
            temp_save2 = 1;
            mig(2);
        }
    }
novarobotix писал(а): if (PINC.5==0) {dir=1;} //читаем направление
if (PINC.5==1) {dir=2;}

if (PINC.4==0) {temp_step=0;} //читем шаг
if (PINC.4==1 & temp_step==0) {
За такой код тебе должно быть стыдно. Говорю же: попробуй выполнить свою же программу, изображая процессор! Выполняя каждую инструкцию.
Зачем проверять бит на значение "0" и тут же проверять его на значение "1"?
novarobotix писал(а): if (correct>=0 || cd==0) { // шаг в одну сторону если нет коррекции
if (step==8 & dir==1) {step=1;temp=1;ob=ob+1;};
if (step<8 & dir==1 & temp==0) {
step++;temp=1;ob=ob+1;
}
}
А смысл писать 33 инструкции в одну строчку, да ещё без пробелов? У тебя ограниченное количество строк в программе? :shock:
Спойлер

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

    if (correct >= 0 || 0 == cd ) 
    {  // шаг в одну сторону если нет коррекции
        if( 1 == dir )
        {
            if( 8 == step ) 
            {
                step = 1;
                temp = 1;
                ob++;
            }else
            if( 0 == temp ) 
            { 
                step++;
                temp = 1;
                ob++;
            } 
        }
    } 
novarobotix писал(а): n=k;k=0; // обнуляем счётчик и узнаём время между импульсами n
Вот ответь на вопрос: в каких единицах ты измеряешь это самое "время между импульсами"?
Пра-а-авильно, твоя "единица времени" - это один цикл прохода цикла while. Причем длительность этой "единицы времени" всегда разная! Тебя это не смущает?
novarobotix писал(а):поэтому ловлю мух :solder:
Мой совет - переписать всё это нафиг. Причем, начать с самого нелюбимого большинством программистов - с вычерчивания алгоритма работы программы! :)))
Реклама
Аватара пользователя
novarobotix
Опытный кот
Сообщения: 759
Зарегистрирован: Пн май 12, 2014 06:13:33

Re: как вывести младший байт в порт

Сообщение novarobotix »

mas123 писал(а):Открой для себя супер возможности оператора if-else!
этот кусок кода я потом закоментирую, поэтому оптимизировать не буду, он нужен для того чтобы примерно узнать время включения кандёров.
mas123 писал(а):Зачем проверять бит на значение "0" и тут же проверять его на значение "1"?
это да, спасибо, исправил.

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

  if (PINC.5==0) {dir=1;} else dir=2; //читаем направление 

  if (PINC.4==0) {temp_step=0;}  //читем шаг
  else if (temp_step==0) { 
mas123 писал(а):А смысл писать 33 инструкции в одну строчку, да ещё без пробелов? У тебя ограниченное количество строк в программе?
мне более читабельным оказался тот вариант что есть.тут наверно дело вкуса.
mas123 писал(а):За такой код тебе должно быть стыдно.
это девушкам может быть стыдно что она не причёсана там где надо, а я парень. а парням главное чтоб работало.
mas123 писал(а):Пра-а-авильно, твоя "единица времени" - это один цикл прохода цикла while. Причем длительность этой "единицы времени" всегда разная! Тебя это не смущает?
да это не критично. плюс минус небольшой лапоть на результат не повлияет.
mas123 писал(а): Причем, начать с самого нелюбимого большинством программистов - с вычерчивания алгоритма работы программы!
алгоритм у меня в голове. программка то маленькая.
mas123 писал(а):Мой совет - переписать всё это нафиг.
да вроде нормально. простой же код.
mas123 писал(а):Ты бы почитал какие книжки по оформлению кода, по стилям программирования.
да что-то никак руки не доходят. я как-то пытался читать что-то подобное меня быстро скумарило и я бросил.
вот последний вариант исправленого кода
Спойлер

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

#include <io.h>    // Хотим использовать порты ввода/вывода
#include <delay.h>  // Хотим использовать функции задержек
#include <math.h>
#include <string.h>
#include <stdlib.h> 

int ob,corr_count,mig_count,correct; 
unsigned int  n,k,n2,k2,nfp,nfp2,temp_mig_count;
unsigned char a[9]; 
unsigned char  temp2,temp_save2,temp,temp_save,i,temp_step,temp_step2,step=1,step2=1,dir,dir2,go_step,go_step2,c0,ob_temp,cd;
unsigned int n_prev;
eeprom unsigned int n_eprom,n_eprom2,ob_eprom;

void mig(int v) {
for (i=0; i < v; i++)    {     //моргаем
PORTB.2=0; delay_us(100000);PORTB.2=1;delay_us(100000);PORTB.2=0;
   }} 

void main()

{
  DDRA=(0<<DDA7) | (0<<DDA6) | (1<<DDA5) | (1<<DDA4) | (1<<DDA3) | (1<<DDA2) | (1<<DDA1) | (1<<DDA0);
  DDRB=(1<<DDB7) | (1<<DDB6) | (1<<DDB5) | (0<<DDB4) | (0<<DDB3) | (1<<DDB2) | (1<<DDB1) | (0<<DDB0);
DDRC=(0<<DDC7) | (0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (1<<DDC3) | (1<<DDC2) | (1<<DDC1) | (1<<DDC0);
DDRD=(0<<DDD7) | (0<<DDD6) | (0<<DDD5) | (1<<DDD4) | (1<<DDD3) | (1<<DDD2) | (1<<DDD1) | (1<<DDD0);

a[1]=1;a[2]=3;a[3]=2;a[4]=6;a[5]=4;a[6]=12;a[7]=8;a[8]=9;

nfp=84; //вручную задаём момент включения кандёров

while (1)
  {
  if (mig_count>0) temp_mig_count=temp_mig_count+1;
  if (temp_mig_count==2500) {PORTB.1=0;} //моргаем число пропусков
  if (temp_mig_count==5000) {PORTB.1=1;mig_count=mig_count-1;temp_mig_count=0;}

  if (PINB.3==1){ob_temp=0;} 
  if (PINB.3==0 & ob_temp==0 & ob>100 & dir==1){
  if (c0==1){
  corr_count=ob-400; // узнаём если пропущены шаги и сколько
  if (corr_count!=0) {correct=correct+corr_count;cd=0;mig_count=abs(correct);}  //PORTB.1=1;mig_count=mig_count+abs(abs(corr_count)/2);
             }
             ob_temp=1; // флаг прихода импульса - чтобы один раз исполнился код до прихода следующего импульса
             ob=0; //сбрасываем счётчик шагов на ноль при каждом срабатывании датчика
             c0=1; //начинаем фиксировать пропущенные шаги со второго срабатывания датчика.первое срабатывание - установка на ноль
  }  
  
  if (k>100 || dir==2) cd=1;  // смотрим если менялось направление или была пауза чтобы скорректировать шаги
  
  if (PINB.0==1 & temp_save==0) {n_eprom=n;nfp=n;temp_save=1;mig(2);} // записываем в память значение включения конденсаторов
  if (PINB.0==0) {temp_save=0;}  // nfp - значение с которого включаются кандёры X
  n2=5;
  if (PINB.4==1 & temp_save2==0) {n_eprom2=n2;nfp2=n2;temp_save2=1;mig(2);} // записываем в память значение включения конденсаторов для Y
  if (PINB.4==0) {temp_save2=0;}   // nfp2 - для Y


   /////////////////////////////////////////////// канал Х ....
  if (PINC.5==0) {dir=1;} else dir=2; //читаем направление 

  if (PINC.4==0) {temp_step=0;}  //читем шаг
  else if (temp_step==0) { 
  

   if (nfp>k+2) {
   PORTD.0=0; //индицируем выключение кандёров
   PORTD.2=0; //выключаем кандёры
   } 
  
  PORTB.2=0; //индицируем отключение простоя
  //go_step=1;     // пойдём делать шаг  
  temp_step=1;  // цикл крутится один раз по фронту импульса
  n=k;k=0; // обнуляем счётчик и узнаём время между импульсами n 
  
  if (correct>=0 || cd==0) {  // шаг в одну сторону если нет коррекции
    if (dir==1) {step++;ob=ob+1;
    if (step==9) {step=1;}
  } 
                           } 
 if(dir==1 & correct<0 & cd==1) correct++; //если шаг умышлено пропустили для коректировки то счётчик коррекции увеличиваем
 
  if (correct<=0)     { // шаг в другую сторону если нет коррекции
  if (dir==2) {step--;ob=ob-1;
  if (step==0) step=8; 
  } 
                       } 
                    
 if(dir==2 & correct>0) correct--; //если шаг умышлено пропустили для коректировки то счётчик коррекции уменьшаем
  
  temp=0;
  if (ob==-400) ob=0;  
  PORTC=a[step]; //выводим на мотор   
  } 
  
    
if (  nfp<n-2 ) { 
   PORTD.0=1;  //индицируем включение кандёров 
   PORTD.2=1; //включаем кандёры
 }
  
  if (k>5000)   //режим простоя
  {   
  PORTB.2=1; //индицируем  режим простоя 
  PORTC=0; //отключаем обмотки
  }
   
if (k<10000) k=k+1;
if (k2<10000) k2=k2+1;  
 
} 
  
}
Глупый не задает вопросы. Глупый и так все знает.
Реклама
mas123
Потрогал лапой паяльник
Сообщения: 312
Зарегистрирован: Вс июл 29, 2012 16:25:39

Re: как вывести младший байт в порт

Сообщение mas123 »

novarobotix писал(а):этот кусок кода я потом закоментирую, поэтому оптимизировать не буду, он нужен для того чтобы примерно узнать
Небрежность в опытах ой как скажется на результатах опыта.
novarobotix писал(а):да это не критично. плюс минус небольшой лапоть на результат не повлияет.
А-а-а, даже так. А тогда вообще зачем был нужен этот опыт? Я и так скажу - ёмкости зарядятся за время, куда меньшее чем 1 минуту. Поэтому, этим значением можно пренебречь! :write:
novarobotix писал(а):мне более читабельным оказался тот вариант что есть.тут наверно дело вкуса.
Нет, не вкуса, а опыта. 8)
Я тоже писал код в таком безобразном стиле. И мне так же говорили о недопустимости такого.
Прозрение пришло (как и у всех) - когда я попытался разобраться в собственном коде спустя полгода после его написания. Я высказал всё о том идиоте, который так и такое написал. :)))
novarobotix писал(а):это девушкам может быть стыдно что она не причёсана там где надо, а я парень. а парням главное чтоб работало.
Понятно, "настоящий мужик должен быть волосат, небрит, вонюч". :kill:
Хе-хе, в будущем тебя могут поджидать удивительные открытия.
novarobotix писал(а):алгоритм у меня в голове. программка то маленькая...
да вроде нормально. простой же код....
да что-то никак руки не доходят. я как-то пытался читать что-то подобное меня быстро скумарило и я бросил.
Всё ясно, вопросов больше не имею.
Крайне не советую с таким мировоззрением заниматься программированием в плане профессии.
Аватара пользователя
novarobotix
Опытный кот
Сообщения: 759
Зарегистрирован: Пн май 12, 2014 06:13:33

Re: как вывести младший байт в порт

Сообщение novarobotix »

mas123 писал(а):Небрежность в опытах ой как скажется на результатах опыта.
да пока всё пучком. тут главное найти золотую середину.чтобы не погрязнуть в догмах.
mas123 писал(а):А тогда вообще зачем был нужен этот опыт?
о каком опыте идёт речь?
mas123 писал(а):Я и так скажу - ёмкости зарядятся за время, куда меньшее чем 1 минуту. Поэтому, этим значением можно пренебречь!
я думаю вы просто не знаете как работает устройство и зачем нужны конденсаторы. а нужны они чтобы когда скорость ниже полтора оборота в секунду они чтобы включались и сглаживали прямоугольные импульсы которые идут на обмотки мотора. и переменная n конечно немного гуляет но в пределах 5 процентов от точки включения конденсаторов, поэтому всё нормально отрабатывает. устройство то реально работает.
mas123 писал(а):Я тоже писал код в таком безобразном стиле. И мне так же говорили о недопустимости такого.
Прозрение пришло (как и у всех) - когда я попытался разобраться в собственном коде спустя полгода после его написания. Я высказал всё о том идиоте, который так и такое написал.
а мне трудно читать код написанный так называемыми "программистами" есть конечно правила которые действительно помогают при написании и чтения кода - их я постараюсь перенять, но остальные сектанские заморочки меня не интересуют.

поэтому код

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

if (PINC.5==0) {dir=1;} else dir=2; //читаем направление 
я думаю так оставить, а

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

if (PINC.4==0) {temp_step=0;}  //читем шаг
  else if (temp_step==0) { 
вернул обратно к виду

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

if (PINC.4==0) {temp_step=0;}  //читем шаг
if (PINC.4==1 & temp_step==0) { 
так как конструкции else ухудшают читабельность и понимание кода. а так чётко видно, что условие срабатывает когда PINC.4==1. - то есть когда пришол фронт импульса на ногу.

ну а реальный источник глюков оказался совершенно в другом месте. оказалось что на высокой скорости глючит из за того что конфиг программы LinuxCNC настроен так чтобы высокую скорость не сразу давать а постепенно(и это правильно) увеличивая,и когда я в программе пропускал шаги в начале движения чтобы скорректировать пропуски, то пропускались как раз шаги разгона и потом резко на высокой скорости шли импульсы и кручение мотора срывалось.
исправил я это следующим образом. с помощью переменной cd я узнаю если скорость низкая

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

if (n>50) cd=1; else cd=0;  // смотрим если скорость маленькая тогда раздрешаем корректировку
и тогда пропускаю корректировочные шаги

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

 if (correct<=0 || cd==0)     { // шаг в другую сторону если нет коррекции
  if (dir==2) {step--;ob=ob-1;
  if (step==0) step=8; 
  } 
                       } 
  if(dir==2 & correct>0 & cd==1) correct--; //если шаг умышлено пропустили для коректировки то счётчик коррекции уменьшаем
ну и весь код
Спойлер

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

#include <io.h>    // Хотим использовать порты ввода/вывода
#include <delay.h>  // Хотим использовать функции задержек
#include <math.h>
#include <string.h>
#include <stdlib.h> 

int ob,corr_count,mig_count,correct; 
unsigned int  n,k,n2,k2,nfp,nfp2,temp_mig_count;
unsigned char a[9]; 
unsigned char  temp2,temp_save2,temp,temp_save,i,temp_step,temp_step2,step=1,step2=1,dir,dir2,go_step,go_step2,c0,ob_temp,cd;
unsigned int n_prev;
eeprom unsigned int n_eprom,n_eprom2,ob_eprom;

void mig(int v) {
for (i=0; i < v; i++)    {     //моргаем
PORTB.2=0; delay_us(100000);PORTB.2=1;delay_us(100000);PORTB.2=0;
   }} 

void main()

{
  DDRA=(0<<DDA7) | (0<<DDA6) | (1<<DDA5) | (1<<DDA4) | (1<<DDA3) | (1<<DDA2) | (1<<DDA1) | (1<<DDA0);
  DDRB=(1<<DDB7) | (1<<DDB6) | (1<<DDB5) | (0<<DDB4) | (0<<DDB3) | (1<<DDB2) | (1<<DDB1) | (0<<DDB0);
DDRC=(0<<DDC7) | (0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (1<<DDC3) | (1<<DDC2) | (1<<DDC1) | (1<<DDC0);
DDRD=(0<<DDD7) | (0<<DDD6) | (0<<DDD5) | (1<<DDD4) | (1<<DDD3) | (1<<DDD2) | (1<<DDD1) | (1<<DDD0);

a[1]=1;a[2]=3;a[3]=2;a[4]=6;a[5]=4;a[6]=12;a[7]=8;a[8]=9;

nfp=93; //вручную задаём момент включения кандёров

while (1)
  {
  if (mig_count>0) temp_mig_count=temp_mig_count+1;
  if (temp_mig_count==2500) {PORTB.1=0;} //моргаем число пропусков
  if (temp_mig_count==5000) {PORTB.1=1;mig_count=mig_count-1;temp_mig_count=0;}

  if (PINB.3==1){ob_temp=0;} 
  if (PINB.3==0 & ob_temp==0 & ob>150 & dir==1){
  if (c0==1){
  corr_count=ob-400; // узнаём если пропущены шаги и сколько
  if (corr_count!=0) {correct=correct+corr_count;mig_count=abs(correct);}  //PORTB.1=1;mig_count=mig_count+abs(abs(corr_count)/2);
             }
             ob_temp=1; // флаг прихода импульса - чтобы один раз исполнился код до прихода следующего импульса
             ob=0; //сбрасываем счётчик шагов на ноль при каждом срабатывании датчика
             c0=1; //начинаем фиксировать пропущенные шаги со второго срабатывания датчика.первое срабатывание - установка на ноль
                                               }  
  
  if (n>50) cd=1; else cd=0;  // смотрим если скорость маленькая тогда раздрешаем корректировку
  
 /* 
  if (PINB.0==1 & temp_save==0) {n_eprom=n;nfp=n;temp_save=1;mig(2);} // записываем в память значение включения конденсаторов
  if (PINB.0==0) {temp_save=0;}  // nfp - значение с которого включаются кандёры X
  if (PINB.4==1 & temp_save2==0) {n_eprom2=n2;nfp2=n2;temp_save2=1;mig(2);} // записываем в память значение включения конденсаторов для Y
  if (PINB.4==0) {temp_save2=0;}   // nfp2 - для Y
 */

   /////////////////////////////////////////////// канал Х ....
  if (PINC.5==0) {dir=1;} else dir=2; //читаем направление 

  if (PINC.4==0) {temp_step=0;}  //читем шаг
  if (PINC.4==1 & temp_step==0) { 
  

   if (nfp>k+3) {
   PORTD.0=0; //индицируем выключение кандёров
   PORTD.2=0; //выключаем кандёры
   } 
  
  PORTB.2=0; //индицируем отключение простоя
  //go_step=1;     // пойдём делать шаг  
  temp_step=1;  // цикл крутится один раз по фронту импульса
  n=k;k=0; // обнуляем счётчик и узнаём время между импульсами n 
  
  if (correct>=0 || cd==0) {  // шаг в одну сторону если нет коррекции
    if (dir==1) {step++;ob=ob+1;
    if (step==9) {step=1;}
  } 
                           } 
 if(dir==1 & correct<0 & cd==1) correct++; //если шаг умышлено пропустили для коректировки то счётчик коррекции увеличиваем
 
  if (correct<=0 || cd==0)     { // шаг в другую сторону если нет коррекции
  if (dir==2) {step--;ob=ob-1;
  if (step==0) step=8; 
  } 
                       } 
  if(dir==2 & correct>0 & cd==1) correct--; //если шаг умышлено пропустили для коректировки то счётчик коррекции уменьшаем
  
  temp=0;
  if (ob==-400) ob=0;  
  PORTC=a[step]; //выводим на мотор   
  } 
  
    
if (  nfp<n-3 ) { 
   PORTD.0=1;  //индицируем включение кандёров 
   PORTD.2=1; //включаем кандёры
 }
  
  if (k>5000)   //режим простоя
  {   
  PORTB.2=1; //индицируем  режим простоя 
  PORTC=0; //отключаем обмотки
  }
   
if (k<30000) k=k+1;
if (k2<30000) k2=k2+1;  
 
} 
  
}
скорость выполнения кода увеличилось примерно в 3 раза после всех модификаций, при самой большой скорости мотора, между соседними импульсами цикл успевает прокрутиться примерно 15 раз, что достаточно для нормальной работы программы.
Глупый не задает вопросы. Глупый и так все знает.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
rxstart1
Вымогатель припоя
Сообщения: 508
Зарегистрирован: Пт фев 22, 2013 18:00:43
Откуда: Беларусь, г. Гомель

Re: как вывести младший байт в порт

Сообщение rxstart1 »

n_eprom=n;nfp=n;temp_save=1;mig(2);
во в этом куску Вы напрямую пишите в энегронезависимую память, а это требует процессорного времени это не то что из переменной в переменную перекинуть
Реклама
Аватара пользователя
novarobotix
Опытный кот
Сообщения: 759
Зарегистрирован: Пн май 12, 2014 06:13:33

Re: как вывести младший байт в порт

Сообщение novarobotix »

rxstart1 писал(а):n_eprom=n;nfp=n;temp_save=1;mig(2);
во в этом куску Вы напрямую пишите в энегронезависимую память, а это требует процессорного времени это не то что из переменной в переменную перекинуть
да, но это происходит только при нажатии на кнопку которая определяет частоту вращения мотора при которой нужно включить кандёры.делается это один раз и потом это число жёстко прописывается в переменную

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

nfp=93; //вручную задаём момент включения кандёров
а сам медленный код вообще стирается или комментируется. он не нужен при работе.
Глупый не задает вопросы. Глупый и так все знает.
Реклама
mas123
Потрогал лапой паяльник
Сообщения: 312
Зарегистрирован: Вс июл 29, 2012 16:25:39

Re: как вывести младший байт в порт

Сообщение mas123 »

novarobotix писал(а):о каком опыте идёт речь?
О том самом, опытный код которого ты собрался потом закомментить и не оптимизирвоать. :))
novarobotix писал(а):я думаю вы просто не знаете как работает устройство и зачем нужны конденсаторы.
Панымаешь, какая загогулина. Если ёмкости нужны и нужно опытным путём их определять - стоит опытный код тщательно проработать.
Если тебя устраивают временные характеристики "плюс-пинус лапоть", то смысл этого опыта?
novarobotix писал(а):а мне трудно читать код написанный так называемыми "программистами"
О-о-о, шикарно! Теперь самое время погнуть пАльцы.
Позвольте представиться: так называемый программист, который уже с десяток лет занимается разработкой ядра RTOS (ядро, процессы, память, сеть, драйверы всей периферии). Т.е. я работаю и с софтом и с железом.
На базе моего кода коллеги пишут более высокоуровневые задачи. Это к вопросу о читабельности кода и лёгкости "въезжание" в него.
Мы разрабатываем и выпускаем измерительную технику в области энергоучета. Наши приборы прошли все сертификационные испытания и включены в гос-реестр средств измерения. Это к вопросу о точности времени, ёмкостей и прочих замеров.
novarobotix писал(а):есть конечно правила которые действительно помогают при написании и чтения кода - их я постараюсь перенять, но остальные сектанские заморочки меня не интересуют.
Можно узнать про эти "правила"? Про "else" я уже понял. :)))
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18670
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: как вывести младший байт в порт

Сообщение ARV »

у меня просьба-оффтоп: я отслеживаю обновленные темы по дате последнего сообщения, и если оно не по сути проблемы, часто отвлекаюсь на бесполезное чтение. прошу каплю уважения: не надо авторам вопросов рассказывать, что они не правы! если автор интересуется тем, как головой забить гвоздь в стену, не нужно рассказывать, что все это делают молотком - если есть конкретные рекомендации по использованию для этой цели головы - отвечайте, если нет, не засоряйте тему лишними советами!

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

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

Мой уютный бложик... заходите!
Аватара пользователя
novarobotix
Опытный кот
Сообщения: 759
Зарегистрирован: Пн май 12, 2014 06:13:33

Re: как вывести младший байт в порт

Сообщение novarobotix »

mas123 писал(а):О том самом, опытный код которого ты собрался потом закомментить и не оптимизирвоать. :))
а, ну так тем более. на результате конечно сказывается но этим плюс минус можно пренебречь. эти 5 процентов в данном конкретном случае роли не играют.
mas123 писал(а):Панымаешь, какая загогулина. Если ёмкости нужны и нужно опытным путём их определять - стоит опытный код тщательно проработать.
в том то и дело что совершенно не нужно, если бы было нужно я бы проработал. там погрешность нужна плюс минус 20 процентов определения момента включения кандёров, а у меня погрешность момента включения определяется с точностью +- 5 процентов.
mas123 писал(а):Если тебя устраивают временные характеристики "плюс-пинус лапоть", то смысл этого опыта?
это вообще-то не опыт а код предназначенный для того чтобы примерно найти значение переменной при которой будут включаться кандёры. и он нужен длоя того чтобы вручную не подбирать это число (может быть от 10 до 100) а один раз нажал на кнопку и посмотрел во флеш что записалось.
mas123 писал(а):Можно узнать про эти "правила"? Про "else" я уже понял. :)))
да я пока только начинаю анализировать эту секту, пока нету достаточного количества обработанного материала
mas123 писал(а):Мы разрабатываем и выпускаем измерительную технику в области энергоучета. Наши приборы прошли все сертификационные испытания и включены в гос-реестр средств измерения.
мне когда встречается так называемый "профессиональный" код, я не могу в нём разобраться. сначала надо стать сектантом, а я этого не хочу 8)
ARV писал(а):постоянно в каждой второй теме вместо ответов-подсказок наталкиваюсь на то, что автору вливают клизму за то, что он не о том думает..
не обращайте внимания, это сектанты пытаются сделать себе подобного. я тоже на всех форумах это замечаю.просто нормальные люди для них сильный раздражитель :love:

поменял код

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

if (correct>=0 || cd==0) {  // шаг в одну сторону если нет коррекции
    if (dir==1) {step++;ob=ob+1;
    if (step==9) {step=1;}
  }
                           }
 if(dir==1 & correct<0 & cd==1) correct++; //если шаг умышлено пропустили для коректировки то счётчик коррекции увеличиваем
 
  if (correct<=0 || cd==0)     { // шаг в другую сторону если нет коррекции
  if (dir==2) {step--;ob=ob-1;
  if (step==0) step=8;
  }
                       }
  if(dir==2 & correct>0 & cd==1) correct--; //если шаг умышлено пропустили для коректировки то счётчик коррекции уменьшаем
на

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

if (correct>=0 || cd==0) {  // шаг в одну сторону если нет коррекции
    if (dir==1) {step++;ob=ob+1;
    if (step==9) {step=1;}
  } 
                           } 
 else if (dir==1) correct++; //если шаг умышлено пропустили для коректировки то счётчик коррекции увеличиваем
 
  if (correct<=0 || cd==0){ // шаг в другую сторону если нет коррекции
                               if (dir==2) {step--;ob=ob-1;
                                           if (step==0) step=8; 
                                           } 
                           } 
  else if(dir==2) correct--; //если шаг умышлено пропустили для коректировки то счётчик коррекции уменьшаем
скорость увеличилась примерно на 15 процентов. я в шоке. если вместо второго if написать else if то работает значительно быстрее
Глупый не задает вопросы. Глупый и так все знает.
mas123
Потрогал лапой паяльник
Сообщения: 312
Зарегистрирован: Вс июл 29, 2012 16:25:39

Re: как вывести младший байт в порт

Сообщение mas123 »

novarobotix писал(а):мне когда встречается так называемый "профессиональный" код, я не могу в нём разобраться.
Определись - "так называемый" или ты не можешь в нём разобраться. 8)
novarobotix писал(а):не обращайте внимания, это сектанты пытаются сделать себе подобного.
А что же ты поддаешься-то, начинаешь использовать опыт секты и "так называемых"?
novarobotix писал(а):скорость увеличилась примерно на 15 процентов. я в шоке. если вместо второго if написать else if то работает значительно быстрее
А зачем ты используешь "так называемый профессиональный код", в котором не можешь разобраться? Это же сплошная секта.
И совершенно неважно, то профессиональный код и занимает меньше места и работает быстрее. :))

Совершенно понятно и логично, почему стало работать быстрее. И почему замена "if" на "else-if" дала ещё прирост скорости - тоже сразу видно. Причем, я тебе уже говорил почему!
Помимо прочего, там ещё не паханное поле в плане оптимизации - скорость может ещё вырасти. Но увы - сектанты... сектанты... :)))
Аватара пользователя
novarobotix
Опытный кот
Сообщения: 759
Зарегистрирован: Пн май 12, 2014 06:13:33

Re: как вывести младший байт в порт

Сообщение novarobotix »

mas123 писал(а):А что же ты поддаешься-то, начинаешь использовать опыт секты и "так называемых"?
у каждой секты есть чему поучиться. тут важно не погрязть в этой самой секте в процессе выуживания зёрен истины.
mas123 писал(а):Помимо прочего, там ещё не паханное поле в плане оптимизации - скорость может ещё вырасти.
да, но пока в принципе достаточно. сейчас на максимальной скорости мотора цикл прокрутится примерно 20 раз между 2-мя импульсами. учитывая что таких канала будет два - код для y такой же, то 10 раз. ещё добавится канал Z но там код будет простейший - просто обычный полушаг без прибамбасов. то есть примерно 8 раз прокрутится весь код. этого я думаю достаточно будет для нормальной работы с большим запасом.
Глупый не задает вопросы. Глупый и так все знает.
Аватара пользователя
novarobotix
Опытный кот
Сообщения: 759
Зарегистрирован: Пн май 12, 2014 06:13:33

Re: как вывести младший байт в порт

Сообщение novarobotix »

а вот и весь код. все 3 канала stepdir.
Спойлер

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

#include <io.h>    // Хотим использовать порты ввода/вывода
#include <delay.h>  // Хотим использовать функции задержек
#include <math.h>
#include <string.h>
#include <stdlib.h> 

int ob,ob2,corr_count,corr_count2,mig_count,mig_count2,correct,correct2; 
unsigned int  n,n2,k,k2,k3,nfp,nfp2,temp_mig_count,temp_mig_count2;
unsigned char a[9],a2[9],a3[9]; 
unsigned char  temp2,temp_save2,temp,temp_save,i,temp_step,temp_step2,temp_step3,step=1,step2=1,step3=1,dir,dir2,dir3,c0,c02,ob_temp,ob_temp2,cd,cd2;
eeprom unsigned int n_eprom,n_eprom2;

void mig(int v) {
for (i=0; i < v; i++)    {     //моргаем
PORTB.2=0; delay_us(100000);PORTB.2=1;delay_us(100000);PORTB.2=0;
   }} 

void main()

{
  DDRA=(0<<DDA7) | (0<<DDA6) | (0<<DDA5) | (0<<DDA4) | (1<<DDA3) | (1<<DDA2) | (1<<DDA1) | (1<<DDA0);
  DDRB=(1<<DDB7) | (1<<DDB6) | (1<<DDB5) | (1<<DDB4) | (1<<DDB3) | (1<<DDB2) | (1<<DDB1) | (1<<DDB0);
DDRC=(0<<DDC7) | (0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (1<<DDC3) | (1<<DDC2) | (1<<DDC1) | (1<<DDC0);
DDRD=(0<<DDD7) | (0<<DDD6) | (0<<DDD5) | (0<<DDD4) | (1<<DDD3) | (1<<DDD2) | (1<<DDD1) | (1<<DDD0);

a[1]=1;a[2]=3;a[3]=2;a[4]=6;a[5]=4;a[6]=12;a[7]=8;a[8]=9;
a2[1]=1;a2[2]=3;a2[3]=2;a2[4]=6;a2[5]=4;a2[6]=12;a2[7]=8;a2[8]=9;
a3[1]=1;a3[2]=3;a3[3]=2;a3[4]=6;a3[5]=4;a3[6]=12;a3[7]=8;a3[8]=9;

nfp=60; //вручную задаём момент включения кандёров X
nfp2=60; //вручную задаём момент включения кандёров Y

while (1)
  { 
  
   /* 
  if (PINB.0==1 & temp_save==0) {n_eprom=n;nfp=n;temp_save=1;mig(2);} // записываем в память значение включения конденсаторов
  if (PINB.0==0) {temp_save=0;}  // nfp - значение с которого включаются кандёры X
  if (PINB.4==1 & temp_save2==0) {n_eprom2=n2;nfp2=n2;temp_save2=1;mig(2);} // записываем в память значение включения конденсаторов для Y
  if (PINB.4==0) {temp_save2=0;}   // nfp2 - для Y
 */
  /////////////////////////////////////////////// канал Х ....
  if (mig_count>0) temp_mig_count=temp_mig_count+1;
  if (temp_mig_count==2500) {PORTB.1=0;} //моргаем число пропусков
  if (temp_mig_count==5000) {PORTB.1=1;mig_count=mig_count-1;temp_mig_count=0;}

  if (PINC.7==1){ob_temp=0;} 
  if (PINC.7==0 & ob_temp==0 & ob>150 & dir==1){
  if (c0==1){
  corr_count=ob-400; // узнаём если пропущены шаги и сколько
  if (corr_count!=0) {correct=correct+corr_count;mig_count=abs(correct);}  //PORTB.1=1;mig_count=mig_count+abs(abs(corr_count)/2);
             }
             ob_temp=1; // флаг прихода импульса - чтобы один раз исполнился код до прихода следующего импульса
             ob=0; //сбрасываем счётчик шагов на ноль при каждом срабатывании датчика
             c0=1; //начинаем фиксировать пропущенные шаги со второго срабатывания датчика.первое срабатывание - установка на ноль
                                               }  
  
  if (n>50) cd=1; else cd=0;  // смотрим если скорость маленькая тогда раздрешаем корректировку
  if (PINC.5==0) {dir=1;} else dir=2; //читаем направление 
  if (PINC.4==0) {temp_step=0;}  //читем шаг
  if (PINC.4==1 & temp_step==0) { 
 
   if (nfp>k+3) {
   PORTB.3=0; //индицируем выключение кандёров
   PORTB.0=0; //выключаем кандёры
   } 
  
  PORTB.2=0; //индицируем отключение простоя
  temp_step=1;  // цикл крутится один раз по фронту импульса
  n=k;k=0; // обнуляем счётчик и узнаём время между импульсами n 
  
  if (correct>=0 || cd==0) {  // шаг в одну сторону если нет коррекции
    if (dir==1) {step++;ob=ob+1;
    if (step==9) {step=1;}
  } 
                           } 
     else if (dir==1) correct++; //если шаг умышлено пропустили для коректировки то счётчик коррекции увеличиваем
 
  if (correct<=0 || cd==0){ // шаг в другую сторону если нет коррекции
                               if (dir==2) {step--;ob=ob-1;
                                           if (step==0) step=8; 
                                           } 
                           } 
  else if(dir==2) correct--; //если шаг умышлено пропустили для коректировки то счётчик коррекции уменьшаем
  
  temp=0;
  if (ob==-400) ob=0;  
  PORTC=a[step]; //выводим на мотор   
  } 
  
    
if (  nfp<n-3 ) { 
   PORTB.3=1;  //индицируем включение кандёров 
   PORTB.0=1; //включаем кандёры
 }
  
  if (k==5000)   //режим простоя
  {   
  PORTB.2=1; //индицируем  режим простоя 
  PORTC=0; //отключаем обмотки
  } 
  
  /////////////////////////////////////////////// канал Y ....
  if (mig_count2>0) temp_mig_count2=temp_mig_count2+1;
  if (temp_mig_count2==2500) {PORTB.1=0;} //моргаем число пропусков
  if (temp_mig_count2==5000) {PORTB.1=1;mig_count2=mig_count2-1;temp_mig_count2=0;}

  if (PINA.7==1){ob_temp2=0;} 
  if (PINA.7==0 & ob_temp2==0 & ob2>150 & dir2==1){
  if (c02==1){
  corr_count2=ob2-400; // узнаём если пропущены шаги и сколько
  if (corr_count2!=0) {correct2=correct2+corr_count2;mig_count2=abs(correct2);}  //PORTB.1=1;mig_count=mig_count+abs(abs(corr_count)/2);
             }
             ob_temp2=1; // флаг прихода импульса - чтобы один раз исполнился код до прихода следующего импульса
             ob2=0; //сбрасываем счётчик шагов на ноль при каждом срабатывании датчика
             c02=1; //начинаем фиксировать пропущенные шаги со второго срабатывания датчика.первое срабатывание - установка на ноль
                                               }  
  
  if (n2>50) cd2=1; else cd2=0;  // смотрим если скорость маленькая тогда раздрешаем корректировку
  if (PINA.7==0) {dir2=1;} else dir2=2; //читаем направление 
  if (PINA.6==0) {temp_step2=0;}  //читем шаг
  if (PINA.6==1 & temp_step2==0) { 
 
   if (nfp2>k2+3) {
   PORTB.1=0; //индицируем выключение кандёров
   PORTB.4=0; //выключаем кандёры
   } 
  
  PORTB.2=0; //индицируем отключение простоя
  temp_step2=1;  // цикл крутится один раз по фронту импульса
  n2=k2;k2=0; // обнуляем счётчик и узнаём время между импульсами n 
  
  if (correct2>=0 || cd2==0) {  // шаг в одну сторону если нет коррекции
    if (dir2==1) {step2++;ob2=ob2+1;
    if (step2==9) {step2=1;}
  } 
                           } 
     else if (dir2==1) correct2++; //если шаг умышлено пропустили для коректировки то счётчик коррекции увеличиваем
 
  if (correct2<=0 || cd2==0){ // шаг в другую сторону если нет коррекции
                               if (dir2==2) {step2--;ob2=ob2-1;
                                           if (step2==0) step2=8; 
                                           } 
                           } 
  else if(dir2==2) correct2--; //если шаг умышлено пропустили для коректировки то счётчик коррекции уменьшаем
  
  temp2=0;
  if (ob2==-400) ob2=0;  
  PORTA=a2[step2]; //выводим на мотор   
  } 
  
    
if (  nfp2<n2-3 ) { 
   PORTB.1=1;  //индицируем включение кандёров 
   PORTB.4=1; //включаем кандёры
 }
  
  if (k2==5000)   //режим простоя
  {   
  PORTB.2=1; //индицируем  режим простоя 
  PORTA=0; //отключаем обмотки
  }   
  
    /////////////////////////////////////////////// канал Z .... 
    
    if (PIND.5==0) {dir3=1;} else dir3=2; //читаем направление 
  if (PIND.4==0) {temp_step3=0;}  //читем шаг
  if (PIND.4==1 & temp_step3==0) {   
  temp_step3=1; // цикл крутится один раз по фронту импульса
  PORTB.2=0; //индицируем отключение простоя 
  k3=0; // обнуляем счётчик простоя
  
     // шаг в одну сторону 
    if (dir3==1) step3++;
    if (step3==9) step3=1;
    
    // шаг в другую сторону
                               if (dir3==2) step3--;
                               if (step3==0) step3=8;
                                
        PORTD=a3[step3]; //выводим на мотор                            
  }
    
  if (k3==5000)   //режим простоя
  {   
  PORTB.2=1; //индицируем  режим простоя 
  PORTD=0; //отключаем обмотки
  }     
   
if (k<30000) k=k+1;
if (k2<30000) k2=k2+1;  
if (k3<30000) k3=k3+1; 
 
} 
  
}
Глупый не задает вопросы. Глупый и так все знает.
Ответить

Вернуться в «AVR»