регистры сдвига

bit
Offline
Зарегистрирован: 07.05.2012

Puhlyaviy пишет:

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

Я так понимаю есть 8 лампочек и 8 выключателей к этим лампочкам... причем выключатели нормально замкнутые, когда нажимаеш на выключатель то цепь разрывается и лампочка гаснет, отпускаеш выключатель, цепь замыкается и лампочка загорается...

Причем тут вообще ардуино, схемы, программы и прочий бред на 4 страницы? Такими темпами, скоро начнете на держатель туалетной бамаги сервомотор прикручивать.. Но там хоть будет смысл какой то, типа по команде голосовой бамажка отматывалась что бы..

гы гы

 

Есть такая штука как мульти руль от BMW 3 , и на нём 10 кнопок, а шлей всего 6 контактов из которых 2 на аирбег и два на сигнал, вот и скажите каким образам можно это решить без контроллера если туда нереально запихнуть ещё 10 проводов ))))

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

bit пишет:

Есть такая штука как мульти руль от BMW 3 , и на нём 10 кнопок, а шлей всего 6 контактов из которых 2 на аирбег и два на сигнал, вот и скажите каким образам можно это решить без контроллера если туда нереально запихнуть ещё 10 проводов ))))

Элементарно. нужно просто купить сразу БМВ с нужным рулем... а не пытаться из жигулей методом допила напильником сделать БМВ.

представил как вам в процесе крвиого допила бахнет подушкой в голову... :) пилите Шура, пилите.

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

bit
Offline
Зарегистрирован: 07.05.2012

Puhlyaviy пишет:

bit пишет:

Есть такая штука как мульти руль от BMW 3 , и на нём 10 кнопок, а шлей всего 6 контактов из которых 2 на аирбег и два на сигнал, вот и скажите каким образам можно это решить без контроллера если туда нереально запихнуть ещё 10 проводов ))))

Элементарно. нужно просто купить сразу БМВ с нужным рулем... а не пытаться из жигулей методом допила напильником сделать БМВ.

представил как вам в процесе крвиого допила бахнет подушкой в голову... :) пилите Шура, пилите.

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

 

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

 

Да и  подушку я не трогал она на своём шлейфе и весит , а вот всё остальное у меня  и сигнал и автомагнитолла и ещё куча функций управляется через TX –RX и всё чудесно работает хоть и на тазике с рулём от бехи)))

 

 

 

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

И смотрели черно-белые ламповые телевизоры сидя на кресле качалке ))))

 

4ERTIK
Offline
Зарегистрирован: 24.03.2013

Puhlyaviy пишет:

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

Я так понимаю есть 8 лампочек и 8 выключателей к этим лампочкам... причем выключатели нормально замкнутые, когда нажимаеш на выключатель то цепь разрывается и лампочка гаснет, отпускаеш выключатель, цепь замыкается и лампочка загорается...

Причем тут вообще ардуино, схемы, программы и прочий бред на 4 страницы? Такими темпами, скоро начнете на держатель туалетной бамаги сервомотор прикручивать.. Но там хоть будет смысл какой то, типа по команде голосовой бамажка отматывалась что бы..

гы гы

уважаемый  Puhlyaviy!

в том то и дело что Вы не правильно (как мне кажеться )все понимаете.

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

Если у Вас эти знания имеются - поделитесь с другими .

Или быть может я ошибаюсь и этот форум только для прожженых профи -програмеров и начинающим тут делать нечего?

 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

bit пишет:

Да и  подушку я не трогал она на своём шлейфе и весит , а вот всё остальное у меня  и сигнал и автомагнитолла и ещё куча функций управляется через TX –RX и всё чудесно работает хоть и на тазике с рулём от бехи)))

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

И смотрели черно-белые ламповые телевизоры сидя на кресле качалке ))))

пойду руль от лисапеда прикручу к лошади. никто не подскажет как мне тормоза передние задние запрограмировать и и переключатель для скоростей :)

 

bit
Offline
Зарегистрирован: 07.05.2012

Конец   00000001 начало

bit
Offline
Зарегистрирован: 07.05.2012

4ERTIK пишет:

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

Почему?

Когда мы нажимаем на 1 кнопку «А» регистра он выдаёт сигнал , 00000001    восемь байт и соответственно в таком же порядке он приходит к ардуино то есть получается

Конец   00000001 начало

              87654321

Вроде бы так ))  хотя я в этом деле сам то недавно

              

 

 

GothThug
GothThug аватар
Offline
Зарегистрирован: 07.09.2014

Парни, здравствуйте, у меня вопрос немного не по теме, хотя и по теме....

В общем у меня ардуино принимает сигналы от другой и при поступлении Command 7 от передатчика, начинает считывать какой из выводов здвигового регистра нужно включить (строки 120-159)

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

У меня проблема: как менять, помнить, биты в 0b00000000 , типо 0b(12345678) помогите

 





#include <VirtualWire.h>
#include <EasyTransferVirtualWire.h>
#include <EEPROM.h>

const int led_pin = 13;  // Проверка прием состояния
const int receive_pin = 50;
unsigned int unique_device_id = 0;
int BlueLed = 7;   
 
int LightLED = 6;               // включаеться по наступлению темноты
int LightSensitivity=150;       // порог чувствительности 0-999
//Здвиг регистр
int latchPin = 8;     //Пин подключен к ST_CP входу 74HC595
int clockPin = 12;    //Пин подключен к SH_CP входу 74HC595
int dataPin = 11;     //Пин подключен к DS входу 74HC595
int out0 = 0b00000000;
int out1 = 0b00000001;
int out2 = 0b00000010;
int out3 = 0b00000100;
int out4 = 0b00001000;
int out5 = 0b00010000;
int out6 = 0b00100000;
int out7 = 0b01000000;
int out8 = 0b10000000;

//create object
EasyTransferVirtualWire ET; 
char buf[120];

struct SEND_DATA_STRUCTURE{
  //наша структура данны. она должна быть определена одинаково на приёмнике и передатчике
  //кроме того, размер структуры не должен превышать 26 байт (ограничение VirtualWire)
  unsigned int device_id;
  unsigned int destination_id;  
  unsigned int packet_id;
  byte command;
  int data;
};

//переменная с данными нашей структуры
SEND_DATA_STRUCTURE mydata;

//ниже пару функций для записи данных типа unsigned int в EEPROM
void EEPROMWriteInt(int p_address, unsigned int p_value)
      {
      byte lowByte = ((p_value >> 0) & 0xFF);
      byte highByte = ((p_value >> 8) & 0xFF);

      EEPROM.write(p_address, lowByte);
      EEPROM.write(p_address + 1, highByte);
      }

unsigned int EEPROMReadInt(int p_address)
      {
      byte lowByte = EEPROM.read(p_address);
      byte highByte = EEPROM.read(p_address + 1);

      return ((lowByte << 0) & 0xFF) + ((highByte << 8) & 0xFF00);
      }

void setup()
{
    pinMode(latchPin, OUTPUT);
    pinMode(clockPin, OUTPUT);
    pinMode(dataPin, OUTPUT);
    pinMode(led_pin, OUTPUT);
    pinMode(BlueLed, OUTPUT);
    pinMode(LightLED, OUTPUT);
    
    Serial.begin(9600); // Debugging only

    ET.begin(details(mydata));
    // Initialise the IO and ISR
    vw_set_rx_pin(receive_pin);
    vw_setup(2000);      // Скорость приёма
    vw_rx_start();       // Запуск режима приёма
    
  // Device ID
  Serial.print("Getting Device ID... "); 
  unique_device_id=EEPROMReadInt(0);
  if (unique_device_id<10000 || unique_device_id>60000) {
   Serial.print("N/A, updating... "); 
   unique_device_id=random(10000, 60000);
   EEPROMWriteInt(0, unique_device_id);
  }
  Serial.println(unique_device_id);
  
}

void loop()
{
    if(ET.receiveData()) // получили пакет данных, обрабатываем
    {
        digitalWrite(led_pin, HIGH);
        Serial.print("Got: ");
        Serial.print("Device ID: ");
        Serial.print(mydata.device_id);
        Serial.print(" Destination ID: ");
        Serial.print(mydata.destination_id);        
        Serial.print(" Packet ID: ");
        Serial.print(mydata.packet_id);
        Serial.print(" Command: ");
        Serial.print(mydata.command);
        Serial.print(" Data: ");
        Serial.print(mydata.data);
        Serial.println();
        digitalWrite(led_pin, LOW);
        // проверяем команду и разбираем данные
        switch (mydata.command){
          case 3://управление реле
            for (int i = mydata.data; i>0; i++) 
            {digitalWrite(BlueLed, !digitalRead(BlueLed));}
            break;
          case 5://управление освещением
            if(mydata.data < LightSensitivity)
            {digitalWrite(LightLED, HIGH);}
            else{digitalWrite(LightLED, LOW);}
            break;
          case 7://сдвиг регистр управ реле
            switch (mydata.data){
                  case 1:
                    digitalWrite(latchPin, LOW);
                    shiftOut(dataPin, clockPin, MSBFIRST, out1);  
                    digitalWrite(latchPin, HIGH);
                  case 2:
                    digitalWrite(latchPin, LOW);
                    shiftOut(dataPin, clockPin, MSBFIRST, out2);  
                    digitalWrite(latchPin, HIGH);
                  case 3:
                    digitalWrite(latchPin, LOW);
                    shiftOut(dataPin, clockPin, MSBFIRST, out3);  
                    digitalWrite(latchPin, HIGH);
                  case 4:
                    digitalWrite(latchPin, LOW);
                    shiftOut(dataPin, clockPin, MSBFIRST, out4);  
                    digitalWrite(latchPin, HIGH);
                  case 5:
                    digitalWrite(latchPin, LOW);
                    shiftOut(dataPin, clockPin, MSBFIRST, out5);  
                    digitalWrite(latchPin, HIGH);
                    break;
                  case 6:
                    digitalWrite(latchPin, LOW);
                    shiftOut(dataPin, clockPin, MSBFIRST, out6);  
                    digitalWrite(latchPin, HIGH);
                    break;
                  case 7:
                    digitalWrite(latchPin, LOW);
                    shiftOut(dataPin, clockPin, MSBFIRST, out7);  
                    digitalWrite(latchPin, HIGH);
                  case 8:
                    digitalWrite(latchPin, LOW);
                    shiftOut(dataPin, clockPin, MSBFIRST, out8);  
                    digitalWrite(latchPin, HIGH);
                  default:
                    digitalWrite(latchPin, LOW);
                    shiftOut(dataPin, clockPin, MSBFIRST, out0);  
                    digitalWrite(latchPin, HIGH);}
        }
          }
  }

 

 

GothThug
GothThug аватар
Offline
Зарегистрирован: 07.09.2014

Разобрался!!! всё помним и меняем биты, вот исходник если интересно

#include <VirtualWire.h>
#include <EasyTransferVirtualWire.h>
#include <EEPROM.h>

const int led_pin = 13;  // Проверка прием состояния
const int receive_pin = 50;
unsigned int unique_device_id = 0;
int BlueLed = 7;   
 
int LightLED = 6;               // включаеться по наступлению темноты
int LightSensitivity=30;       // порог чувствительности 0-999
//Здвиг регистр
int latchPin = 8;     //Пин подключен к ST_CP входу 74HC595
int clockPin = 12;    //Пин подключен к SH_CP входу 74HC595
int dataPin = 11;     //Пин подключен к DS входу 74HC595
int out0 = 0b00000000;
int valBit = 0;

//create object
EasyTransferVirtualWire ET; 
char buf[120];

struct SEND_DATA_STRUCTURE{
  //наша структура данны. она должна быть определена одинаково на приёмнике и передатчике
  //кроме того, размер структуры не должен превышать 26 байт (ограничение VirtualWire)
  unsigned int device_id;
  unsigned int destination_id;  
  unsigned int packet_id;
  byte command;
  int data;
};

//переменная с данными нашей структуры
SEND_DATA_STRUCTURE mydata;

//ниже пару функций для записи данных типа unsigned int в EEPROM
void EEPROMWriteInt(int p_address, unsigned int p_value)
      {
      byte lowByte = ((p_value >> 0) & 0xFF);
      byte highByte = ((p_value >> 8) & 0xFF);

      EEPROM.write(p_address, lowByte);
      EEPROM.write(p_address + 1, highByte);
      }

unsigned int EEPROMReadInt(int p_address)
      {
      byte lowByte = EEPROM.read(p_address);
      byte highByte = EEPROM.read(p_address + 1);

      return ((lowByte << 0) & 0xFF) + ((highByte << 8) & 0xFF00);
      }

void setup()
{
    pinMode(latchPin, OUTPUT);
    pinMode(clockPin, OUTPUT);
    pinMode(dataPin, OUTPUT);
    pinMode(led_pin, OUTPUT);
    pinMode(BlueLed, OUTPUT);
    pinMode(LightLED, OUTPUT);
    
    Serial.begin(9600); // Debugging only

    ET.begin(details(mydata));
    // Initialise the IO and ISR
    vw_set_rx_pin(receive_pin);
    vw_setup(2000);      // Скорость приёма
    vw_rx_start();       // Запуск режима приёма
    
  // Device ID
  Serial.print("Getting Device ID... "); 
  unique_device_id=EEPROMReadInt(0);
  if (unique_device_id<10000 || unique_device_id>60000) {
   Serial.print("N/A, updating... "); 
   unique_device_id=random(10000, 60000);
   EEPROMWriteInt(0, unique_device_id);
  }
  Serial.println(unique_device_id);
  
}

void loop()
{
    if(ET.receiveData()) // получили пакет данных, обрабатываем
    {
        digitalWrite(led_pin, HIGH);
        Serial.print("Got: ");
        Serial.print("Device ID: ");
        Serial.print(mydata.device_id);
        Serial.print(" Destination ID: ");
        Serial.print(mydata.destination_id);        
        Serial.print(" Packet ID: ");
        Serial.print(mydata.packet_id);
        Serial.print(" Command: ");
        Serial.print(mydata.command);
        Serial.print(" Data: ");
        Serial.print(mydata.data);
        Serial.println();
        digitalWrite(led_pin, LOW);
        // проверяем команду и разбираем данные
        switch (mydata.command){
          case 3://управление реле
            for (int i = mydata.data; i>0; i++) 
            {digitalWrite(BlueLed, !digitalRead(BlueLed));}
            break;
          case 5://управление освещением
            if(mydata.data < LightSensitivity)
            {digitalWrite(LightLED, HIGH);}
            else{digitalWrite(LightLED, LOW);}
            break;
          case 7://сдвиг регистр управ реле
            switch (mydata.data){
                  case 1:
                    valBit = bitRead(out0, 0);
                    if (valBit == 0){bitWrite(out0, 0, 1);} // bitWrite(имя байта, номер бита, состояние)  
                    else {bitClear(out0, 0);} //bitClear(имя байта, номер бита)
                    break;
                  case 2:
                    valBit = bitRead(out0, 1);
                    if (valBit == 0){bitWrite(out0, 1, 1);}   
                    else {bitClear(out0, 1);}
                    break;
                  case 3:
                    valBit = bitRead(out0, 2);
                    if (valBit == 0){bitWrite(out0, 2, 1);}   
                    else {bitClear(out0, 2);} 
                    break;
                  case 4:
                    valBit = bitRead(out0, 3);
                    if (valBit == 0){bitWrite(out0, 3, 1);}  
                    else {bitClear(out0, 3);}
                    break;
                  case 5:
                    valBit = bitRead(out0, 4);
                    if (valBit == 0){bitWrite(out0, 4, 1);} 
                    else {bitClear(out0, 4);}
                    break;
                  case 6:
                    valBit = bitRead(out0, 5);
                    if (valBit == 0){bitWrite(out0, 5, 1);} 
                    else {bitClear(out0, 5);}
                    break;
                  case 7:
                    valBit = bitRead(out0, 6);
                    if (valBit == 0){bitWrite(out0, 6, 1);}  
                    else {bitClear(out0, 6);}
                    break;
                  case 8:
                    valBit = bitRead(out0, 7);
                    if (valBit == 0){bitWrite(out0, 7, 1);} 
                    else {bitClear(out0, 7);}
                    break;}
                    
           digitalWrite(latchPin, LOW);
           shiftOut(dataPin, clockPin, MSBFIRST, out0);  
           digitalWrite(latchPin, HIGH);}
         }
  }

 

MYFRIEND
MYFRIEND аватар
Offline
Зарегистрирован: 31.01.2017

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

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Нет такой команды.

MYFRIEND
MYFRIEND аватар
Offline
Зарегистрирован: 31.01.2017

andriano пишет:

Нет такой команды.

Спасибо большое! Может это сброс какой нибудь? Интересно как тогда объяснить если при нажатии в arduino ide кнопки зайти в serial port происходит сброс всех светодиодов которые горят, т.е. пины ардуино в том числе регистров подключенных к ардуино получают состояние LOW, что там может быть, знаю #13#15 это перенос строки, а там какой то ещё код поступает через USB к ардуино, так как ардуино подключаясь к ардуино ide переводит в состояние low свои пины все на момент инициализации подключения к ардуино ide. Несколько раз проверял, это не случайно. 

sadman41
Offline
Зарегистрирован: 19.10.2016

Что вы курите? Какой перенос строки, какой код от USB? Сами подумайте - откель ваш комплюктор знает, что к ардуине подключено для того, чтобы дать код на сброс?

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Конечно не случайно. При запуске сериал монитор дерганье DTR. A у большинства ардуин это приводит к ресету. Это специально так задумано.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

MYFRIEND пишет:

andriano пишет:

Нет такой команды.

Спасибо большое! Может это сброс какой нибудь? Интересно как тогда объяснить если при нажатии в arduino ide кнопки зайти в serial port происходит сброс всех светодиодов которые горят, т.е. пины ардуино в том числе регистров подключенных к ардуино получают состояние LOW, что там может быть, знаю #13#15 это перенос строки, а там какой то ещё код поступает через USB к ардуино, так как ардуино подключаясь к ардуино ide переводит в состояние low свои пины все на момент инициализации подключения к ардуино ide. Несколько раз проверял, это не случайно. 

Сброс не переводит все пины в состояние LOW, он переводит их в высокоимпедансное состояние (т.н. Z-состояние).

Самое простое (в Вашем случае) перевести все пины в состояние LOW циклом. Это займет несколько десятков мкс (сотые доли мс), тогда как глаз (наблюдающий светодиоды) имеет инерционность, исчисляемыми десятками мс (т.е. примерно в 1000 раз больше). Так что ни Вы, ни видеокамера этой "неодновременности" никак не почувствуете.

MYFRIEND
MYFRIEND аватар
Offline
Зарегистрирован: 31.01.2017

andriano пишет:

перевести все пины в состояние LOW циклом.

очень нужно их быстро перевести в такое состояние, пока дельфи программа их через serial 180 шт. отправляет циклом поочередно из combobox (там команды означают погасить пин1 пин2 и т.д. 180 шт. это очень долго. секунды 3-5, если быстрее отправлять не успевает обрабатывать mega2560 и светодиоды зависают не выключаясь. Ардуино отлавливает пришедшие команды, и гасит названные пины с ПК. Но это явно длинный способ и самый примитивный. На все светодиоды не менее 5 сек. а нужно погасить их ну хотя бы за 1 сек. было бы большим скачком. Так понимаю цикл должен быть в mega2560 самой, что  бы ей не пришлось тратить времени из serial 180 команд пришедших каждую искать и выключать. Было бы замечательно просто погасить какой нибудь одной командой, разгрузив serial от 180 команд. Ардуино ide это делает в 1 клик если нажимать serial port monitor, ардуино научена принимать слова, как ей приняв например слово "off" погасить все светодиоды разом как можно скорее. В каком направлении идти. Сделать loop так понимаю в ардуино самой вместо дельфи, но как не нагородить очередной огород. Ткните носом пожалуйста. Вот serial monitor мгновенно их гасит всегда. Только кликнуть мышкой сразу все разом гаснут. Но как так и не удалось сделать. Поштучно гасятся. Каждый день нужно их гасить, и время приходится ждать пока они гаснут. 

Гриша
Offline
Зарегистрирован: 27.04.2014

MYFRIEND пишет:

какой командой с ардуино обесточить регистры?

собрать все ноги EN (enable)  на одну ногу МК и подавать на нее такую команду.

А вообще о какой схеме речь? что в железе? я просто запутался

AlexanderNO
Offline
Зарегистрирован: 08.11.2018

MYFRIEND, а так пробовали?

http://arduino.ru/forum/programmirovanie/programmnyi-reset

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

MYFRIEND пишет:

andriano пишет:

перевести все пины в состояние LOW циклом.

Ткните носом пожалуйста. Вот serial monitor мгновенно их гасит всегда. Только кликнуть мышкой сразу все разом гаснут. Но как так и не удалось сделать. Поштучно гасятся. Каждый день нужно их гасить, и время приходится ждать пока они гаснут. 

Повторяю еще раз, сериал монитор просто устраивает ардуине полный сброс и программа там начинает выполняться с 0 заново. Если вас такой вариант гашения светодиодов устраивает, то посмотрите как из Дельфи манипулировать сигналом DTR на используемом вами сериал порте. И будет вам счастье.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

MYFRIEND пишет:

очень нужно их быстро перевести в такое состояние, пока дельфи программа их через serial 180 шт. отправляет циклом поочередно из combobox (там команды означают погасить пин1 пин2 и т.д. 180 шт. это очень долго. секунды 3-5, если быстрее отправлять не успевает обрабатывать mega2560 и светодиоды зависают не выключаясь. Ардуино отлавливает пришедшие команды, и гасит названные пины с ПК. Но это явно длинный способ и самый примитивный. На все светодиоды не менее 5 сек. а нужно погасить их ну хотя бы за 1 сек. было бы большим скачком. Так понимаю цикл должен быть в mega2560 самой, что  бы ей не пришлось тратить времени из serial 180 команд пришедших каждую искать и выключать. Было бы замечательно просто погасить какой нибудь одной командой, разгрузив serial от 180 команд. Ардуино ide это делает в 1 клик если нажимать serial port monitor, ардуино научена принимать слова, как ей приняв например слово "off" погасить все светодиоды разом как можно скорее. В каком направлении идти. Сделать loop так понимаю в ардуино самой вместо дельфи, но как не нагородить очередной огород. Ткните носом пожалуйста. Вот serial monitor мгновенно их гасит всегда. Только кликнуть мышкой сразу все разом гаснут. Но как так и не удалось сделать. Поштучно гасятся. Каждый день нужно их гасить, и время приходится ждать пока они гаснут. 

МОЙДРУГ, это просто какой-то ужас!

1. Откуда вдруг взялась Делфи? Раньше о ней речь не шла.

2. Откуда взялось 180 пинов? Ни в одном контроллере Ардуино такого количества отродясь не было. Максимум - 70.

3. "быстро" и "очень долго" оставьте для художестенных произведений, в технике должны быть конкретные цифры. Но для конкретных цифр нужно конкретное схемное решение. А оно неизвестно (см. п. 2)

Идем дальше.

Чтобы с ПК (персонального компьютера) управлять светодиодами, подключенными к Ардуино, нужно 3 вещи:

1. Программа на ПК (например, на Делфи), которая будет посылать нужные команды Ардуино.

2. Скетч (программа) на Ардуино, которая будет принимать и выполнять команды.

3. Протокол обмена, по которому будут передаваться команды от ПК к Ардуино и, возможно, какая-то информация в обратном направлении, т.е. от Ардуино в ПК.

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

Так что, думаю, в каком направлении идти, теперь стало понятно.

Поскольку от Вас никакой конкретики не поступало, больше по этому поводу ничего сказать нельзя.

Могу дать очень грубую оценку для случая, если светодиоды подключены через 595 регистры - даже при самой неоптимальной реализации гашения через shiftOut() это не должно занимать более 0.005с.

-NMi-
Offline
Зарегистрирован: 20.08.2018

MYFRIEND пишет:

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

Придётся тебе "напрячь" мозг и изучить Ассемблер. Уотт тогда возможно даже казалось-бы невозможное, вытворяй "штохошЪ" с дурдуиной )))

-NMi-
Offline
Зарегистрирован: 20.08.2018

andriano пишет:

Нет такой команды.

"датыШо)))" Шлёшь в порт ОДИН БАЙТ за ОДИН такт и "фсёсдюжит" )))  Чё, показать пример?  Ссылки на сторонние форумы приветствуются? Не копипаста, МОЁ, личное.   )))))

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

-NMi- пишет:

andriano пишет:

Нет такой команды.

"датыШо)))" Шлёшь в порт ОДИН БАЙТ за ОДИН такт и "фсёсдюжит" )))  Чё, показать пример?  Ссылки на сторонние форумы приветствуются? Не копипаста, МОЁ, личное.   )))))

Ну здесь возможны два варианта:

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

2. Ардуина не имеет прошивки (прошит только загрузчик) либо прошита произвольным скетчем, который мы изменить не в силах, - вот для этого варианта и приведите, пожалуйста, пример.

MYFRIEND
MYFRIEND аватар
Offline
Зарегистрирован: 31.01.2017

andriano пишет:

если светодиоды подключены через 595 регистры - даже при самой неоптимальной реализации гашения через shiftOut() это не должно занимать более 0.005с.

Спасибо большое! Всё как вы сказали, 595 регистры высылают shiftOut поштучно каждому светодиоду и кроме 595 регистров все ножки задействованы mega2560 в том числе и аналоговые, несколько секунд гаснут светодиоды. Я бы сказал медленно. Неужели нельзя их быстро потушить какой нибудь командой регистрам и ножкам mega2560. 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

MYFRIEND пишет:

andriano пишет:

если светодиоды подключены через 595 регистры - даже при самой неоптимальной реализации гашения через shiftOut() это не должно занимать более 0.005с.

Спасибо большое! Всё как вы сказали, 595 регистры высылают shiftOut поштучно каждому светодиоду и кроме 595 регистров все ножки задействованы mega2560 в том числе и аналоговые, несколько секунд гаснут светодиоды. Я бы сказал медленно. Неужели нельзя их быстро потушить какой нибудь командой регистрам и ножкам mega2560. 

Еще раз: если светодиоды подключены к сдвиговым регистрам, а не к "регистрам и ножкам mega2560", то никакой "командой регистрам и ножкам mega2560" их погасить нельзя. Должна быть достаточно длинная последовательность переключений ножек контроллера, чтобы передать необходимые данные всем светодиодам (по последовательному интерфейсу). 

Но, если контроллер работает на частоте 16 МГц, то 200 светодиодов даже при неоптимальном программировании можно поргасить за тысячные доли секунды.

Что Вам непонятно то?

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

andriano пишет:

Еще раз: если светодиоды подключены к сдвиговым регистрам, а не к "регистрам и ножкам mega2560", то никакой "командой регистрам и ножкам mega2560" их погасить нельзя. Должна быть достаточно длинная последовательность переключений ножек контроллера, чтобы передать необходимые данные всем светодиодам 

У 74HC595 есть такая ножка как "Output Enable" и при подаче туда высокого уровня все выходы регистра переводятся high-impedance state. Таким образом погасить светодиоды одной командой вполне возможно. 

sadman41
Offline
Зарегистрирован: 19.10.2016

Происходит это ежели  в прошивке и подключении заложено... А не при любом случайном ребуте МК, как втирает нам Майфренд.

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

sadman41 пишет:

Происходит это ежели  в прошивке и подключении заложено... А не при любом случайном ребуте МК, как втирает нам Майфренд.

Ну, при соответсвующем подключении (ОЕ заведена на выход ардуины и есть подтяжка) любой ресет будет "гасить" и без поддержки в прошивке

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Я не великий специалист, конечно, но AVR разве не сам свои ноги в Hi-Z ставит на старте? На них высокий уровень возникает без дополнительных манипуляций?

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Да, после ресета выводы ставятся в Hi-Z, но это не высокий уровень, а "плавающий". Как это будет воспринято другим входом подключенным к выводу в HI-Z зависит от массы факторов. 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

asam пишет:

У 74HC595 есть такая ножка как "Output Enable" и при подаче туда высокого уровня все выходы регистра переводятся high-impedance state. Таким образом погасить светодиоды одной командой вполне возможно. 

Ну так напишите конкретно, как выглядит эта команда для такой (достаточно стандартной) схемы:

PS. Проблему ТС я вижу исключительно в том, что он умудрился написать код, который работает примерно в 1000 раз медленнее, чем средний неоптимизированный код для Ардуины, но вместо того, чтобы внести исправления в свой код, ищет "волшебную команду".

MYFRIEND
MYFRIEND аватар
Offline
Зарегистрирован: 31.01.2017

andriano пишет:

можно поргасить за тысячные доли секунды.

спасибо большое! кажется до меня дошло! 

время mega2560 уходило на то что бы для 200 светодиодов кадому при получении команды из serial перекапывать из 200 вариантов ножек одну, по вашему совету отправлю ка в serial такую команду "alloff" 

и увидя данную команду mega2560 одним махом выключит их, ничего нигде не переискивая получив команду сразу отключит все ножки разом. До этого ардуино получив из serial 200 команд !!! каждую из 200 искала среди 200!!! Фууухх.. Сколько ардуино пришлось пережить из за кривой оптимизации кода так понимаю. Теперь ардуино получит лишь одну команду, получив которую она пойдёт выключать все 200 светодиодов. А не искать из 200 полученных команд для каждой решение из 200 вариантов. 

Большое вам спасибо многоуважаемый andriano просто нет слов отблагодарить вас. Вы помогли найти решение как помогают на передаче Жди меня. Вы как ведущий ардуино версии передачи "Жди меня" Люблю все ваши ответы !!! Это Большой скачок ваши ответы. 

sadman41
Offline
Зарегистрирован: 19.10.2016

Опять веб-погроммист прокрался на форум...

b707
Онлайн
Зарегистрирован: 26.05.2017

sadman41 пишет:

Опять веб-погроммист прокрался на форум...

причем тут "веб-программист"? - тут клиника в медицинском смысле...

 

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

andriano пишет:

asam пишет:

У 74HC595 есть такая ножка как "Output Enable" и при подаче туда высокого уровня все выходы регистра переводятся high-impedance state. Таким образом погасить светодиоды одной командой вполне возможно

Ну так напишите конкретно, как выглядит эта команда для такой (достаточно стандартной) схемы:

 

  

Скажите, сэр, вы дурак или демагог?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

asam пишет:

Скажите, сэр, вы дурак или демагог?

Из такой формулировки вопроса я делаю однозначный вывод, что Вы - хам.

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

andriano пишет:

asam пишет:

Скажите, сэр, вы дурак или демагог?

Из такой формулировки вопроса я делаю однозначный вывод, что Вы - хам.

Если вам удобнее так считать, то не буду спорить. Но вы все же скажите - 

Вы не пониманимаете значение выражения "подать высокий уровень" или не разбираетесь в принципиальных схемах?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

asam, в типовой схеме включения 595 регистра (к Ардуино) пин OE сидит на земле. Если Вы в этом сомневаетесь, наберите в Гугле "Ардуино 74HC595", переключите в режим картинок и подведите статистику.

И такое включение, надо сказать, вполне оправдано, ибо сдвиговые регистры обычно используют, когда не хватает пинов, поэтому для управлением регистром задействуют минимально возможное число пинов контроллера. Пин ОЕ в число этих пинов явно не попадает.

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

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

А Ваш выпад в сообщении №185 вообще в рамках здравого смысла необъясним.

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Позволю себе процитировать ваш пост с которого все началось:

andriano пишет:

Еще раз: если светодиоды подключены к сдвиговым регистрам, а не к "регистрам и ножкам mega2560", то никакой "командой регистрам и ножкам mega2560" их погасить нельзя. Должна быть достаточно длинная последовательность переключений ножек контроллера, чтобы передать необходимые данные всем светодиодам (по последовательному интерфейсу). 

Как видете, речь идет о сдвиговых регистрах per se и ни "типовые" ни какие другие  схемы подключения не упоминаются. А как только я казал, вам, что сдвиговый регистр может  "погасить все светодиоды" если подать высокий уровень на OE, вы начали тыкать мне схемой где ОЕ заземлен.

Myfriend тоже не упоминал схему включения. И откуда вы знаете есть ли у него свободная ножка для управления ОЕ, если понадобится, или нет. То есть ваше предложение "Ну так напишите конкретно, как выглядит эта команда для такой (достаточно стандартной) схемы" было чистой воды демагогией. А у меня на нее аллергия.

SLKH
Offline
Зарегистрирован: 17.08.2015

asam пишет:

Myfriend тоже не упоминал схему включения. И откуда вы знаете есть ли у него свободная ножка для управления ОЕ, если понадобится, или нет. 

MYFRIEND пишет:
...и кроме 595 регистров все ножки задействованы mega2560 в том числе и аналоговые,
(см #174)

Гриша
Offline
Зарегистрирован: 27.04.2014

SLKH пишет:

asam пишет:

Myfriend тоже не упоминал схему включения. И откуда вы знаете есть ли у него свободная ножка для управления ОЕ, если понадобится, или нет. 

MYFRIEND пишет:
...и кроме 595 регистров все ножки задействованы mega2560 в том числе и аналоговые,
(см #174)

и ничего не понятно, точной схемы для понимания так и нет (#167) ...

MYFRIEND
MYFRIEND аватар
Offline
Зарегистрирован: 31.01.2017

andriano пишет:

можно погасить за тысячные доли секунды.

Восхищаюсь советами andriano, вы для меня самый опытный и я свой голос отдаю вам! 

Ваши советы настолько уникальны все, и успешно удалось за тысячные секунды погасить 200 светодиодов, отправив лишь одну команду по вашему совету светодиодам, при получении команды "off" через сериал порт ардуино все команды выполнила как одну, а не получала 200 команд для каждого светодиода. Казалось бы просто и самому уже понимая механизм разобраться, но без вас никогда бы не дойти до этого. Очень вам благодарен, низкий вам поклон, вы старались давать много ответов, уделяли ваше внимание. Нет слов отблагодарить вас. Вы такая умница! Спасибо вам andriano! Тысячи спасибо! Спасибо за каждый ваш ответ. Я с нетерпением ждал каждого вашего ответа. Вы столько помогли! Спасибо ещё раз и ещё раз! andriano вы большая умница! 

 

Green
Онлайн
Зарегистрирован: 01.10.2015

Под столом! Это что. Мне тут один товарищ схему прислал. Ардуино, I2c расширитель + пара hc595 к 27с512 и всё. Можно читать BIOS и эмулировать ПК... А вы о каком то тривиальном гашении светодиодов одной командой.)))

MYFRIEND
MYFRIEND аватар
Offline
Зарегистрирован: 31.01.2017

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