Valerius_San

Простые вопросы новичка.

134 сообщения в этой теме

Wawchuk    0

 Вот так правильно:

for (i=0;i<16;i++)  //
     {
      if(i<=7){
          DATA_595=(reg2 >> i) & 0x01; //
          clock();
//         
          }
       if(i>7){
          DATA_595=(reg1 >> i) & 0x01; //
          clock();
 
          }
     }
strobe(); //
 };

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
IMXO    1 405

синтаксис правильный, но делать так не надо.

и почему вы  байт выводите младшим битом в перед? наку зачем?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Wawchuk    0

ну перевернуть наверное не сложно:

for(i=16;i>=0;i--)

в целом ясно.Есть еще мысль в загажнике  -),но надо ее сформулировать ,я поработаю над другим вариантом.

спс

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    559
3 часа назад, Wawchuk сказал:

for(i=16;i>=0;i--)

Аккуратнее с такой конструкцией. У неё есть вариант, при котором она превратится в бесконечный цикл.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Wawchuk    0

 

 вопрос по Вашему варианту функции, с поста выше:

//****************************************** //* запись в регистры 74HC595 //******************************************

void read_74HC595 (unsigned char reg8,unsigned char reg7, unsigned char reg6,

                                 unsigned char reg5, unsigned char reg4,unsigned char reg3,

                                 unsigned char reg2,unsigned char reg1, unsigned char reg0)

 

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

 

int out_595 [8] = {0,0,0,0,0,0,0,1};  

int i; 

while(1)  
{

        for (i=0; i<8; i++)  
        {
        read_74HC595 (0,0,0,0.0.0,0,1) = out_595 ;  
        }

 в ней же перебирать надо не биты ,а байты? или ткните где в языке есть применение(использование) таких функций

Изменено пользователем Wawchuk
ошибсяread_74HC595 (0,0,0,0.0.0,0,1) = out_595 [i];  

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ARV    493

Зачем учить новичка тому, что считается ужасным стилем программирования?! Ведь проблем это породит больше, чем пользы.

Вот и первые ласточки:

10 часов назад, Wawchuk сказал:

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

 

10 часов назад, Wawchuk сказал:

ткните где в языке есть применение(использование) таких функций

Я бы ткнул в эту функцию носом и сказал бы "не делай так, не делай так, не делай!" - как котенка в лужу.

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

У нас есть несколько регистров, которые надо заполнять данными. Значит, надо иметь функцию, которая выводит в ОДИН регистр данные, и повторять вызов этой функции столько раз, сколько регистров. Так как данных несколько, это массив, сколько регистров, столько и элементов массива. Значит, надо в цикле перебирать элементы массива и передавать их в ту самую функцию вывода в регистр. Ну а после этого надо дать строб на обновление выходных защелок регистров - вот и все решение задачи.

#define REG_CNT	8 /* количество регистров */
void write_reg595(unsigned char d); // функция вывода байта в регистр
void strobe(void); // функция выдачи строба для обновления защелок (может быть макросом)

unsigned char reg_data[REG_CNT]; // массив с данными для вывода

// функция обновления содержимого всех регистров
// data - указатель на данные
void update_all_regs(unsigned char *data){
  unsigned char i;
  for(i=0; i<REG_CNT; i++)
    write_reg595(data[i]);
  strobe(); // выдача импульса обновления защелок
}

// там, где надо обновить содержимое регистров, всего-навсего вызываем эту функцию так:
update_all_regs(reg_data);

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

 

З.Ы. Прошу пардону: не заметил, что тут все ЧИТАЮТ регистры, а не ЗАПИСЫВАЮТ. Но подход тот же самый: функция чтения одного, цикл перебора массива, куда заносятся считанные данные. Строб только надо делать ДО начала цикла, а не после, т.к. защелки в регистрах (кстати, они 597-е!) "с другой стороны" :) 

10 часов назад, Wawchuk сказал:

ошибся read_74HC595 (0,0,0,0.0.0,0,1) = out_595 

Да тут ошибок едва ли не столько  же, сколько символов!

1. Если read_74HC595 это функция, то присваивать ей значение недопустимо.

2. В перечислении параметров тоже ошибочка: часть запятых замменена на точки

3. 595-е регистры читать нет смысла, т.к. они предназначены для ВЫВОДА данных. Читать можно 597-е регистры, которые предназначены для ВВОДА данных.

Изменено пользователем ARV

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
IMXO    1 405
13 часа назад, ARV сказал:

Зачем учить новичка тому, что считается ужасным стилем программирования?!

@ARV  встречный вопрос (в свете того что ТС пользует эту функцию в 16пыхе в прерывании ) какой код выполнится быстрей с ужасным стилем  или  ваш причесанный по учебнику?

ЗЫ представляю что будет, если показать конечный вариант на асм-вставках :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ARV    493
9 часов назад, IMXO сказал:

встречный вопрос (в свете того что ТС пользует эту функцию в 16пыхе в прерывании ) какой код выполнится быстрей

Еще ни разу не встречал любительского проекта, где эта проблема на самом деле имела бы высокую важность. 207 микросекунд будет выполняться код или 307 - совершенно никакой разницы не будет. И еще боооооольшой вопрос, действительно ли будет какой-то заметный выигрыш в скорости при ужасном стиле, а вот что проигрыш в стиле УЖЕ ЕСТЬ - доказывать не надо. И этот проигрыш обязательно аукнется попозже.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Wawchuk    0

Посмотрите пожалуйста такой вариант,компилируется,но не работает почему-то.

new 1.c

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ваша публикация должна быть проверена модератором

Гость
Вы не авторизованы. Если у вас есть аккаунт, пожалуйста, войдите.
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Восстановить форматирование

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Загрузка...

  • Сообщения

    • Вот только вся проблема в том, что у меня, как и у других юзеров, все все собирается НОРМАЛЬНО и никаких глюков нет. А собрал я там далеко не один проект и не только под stm32. Ибо все, что делает кряк - генерирует код для лицензии. Он вообще не лезет в файлы Keil. Ну а Keil ничего не собирает, компиляторы на него ставятся сторонние и к сборке бинарника сам Keil отношения не имеет. Так что либо у тебя Keil скачан с первого попавшегося подзаборного сайта, либо руки не такие, как у всех. Третьего не дано.
    • Подруга, которая в Таиланд возила, кинула?))
    • @Syuubav Да ладно перегар-амброзия да и только в сравнении когда баба на себя ведро духов выльет.Глаза режет,а ей хоть бы хрен по....
    • Вопрос в том по какому уровню, и вопрос второй что в 1971 году означало 14000 по ВЧ., при тех источниках сигнала. Ко мне в те годы подъезжал один музыкант из Москвы, послушал и обалдел. спросил откуда такие верха. я ему показал откуда. так он по приезде домой накупил этих 28-х но верхов почему то не получил. Начал жаловаться , что дины оказались переклеенные.
    • Столкнулся лично. Одно дело когда разработку оплачивает большая компания, обеспечивает рабочим местом, доступом к железу, транспортом и так далее. И совершенно другое - когда комп твой личный домашний, при этом щедрость компании на него не распространяется. А мысля, она ведь и дома может сработать.  Проект одной ревизии собирается в два немного отличающихся бинарника, причём отличие всегда случайно!!!