большие массивы данных и 1 кб динамической памяти

Тема в разделе "Arduino & Shields", создана пользователем Unikolai, 12 мар 2018.

  1. Unikolai

    Unikolai Гик

    Код (C++):
    volatile uint8_t &g = PORTB;
    uint8_t t[]  = {g, g, g, g, g, g, g };
    void setup() {
      DDRB = 0b1111111;
    }

    void loop() {
      t[1] = 0b11111111;
      delay(500);
      t[1] = 0b00000000;
      delay(500);
    }
    вообще мне это нужно, чтобы сделать что-то в этом роде, чтобы брать номер порта из массива, но все арвно не работает
     
  2. DetSimen

    DetSimen Гуру

    uint8_t& t[]={g, g, g, g, g, g, g };

    и не забудь порты на вывод настроить.
     
  3. Unikolai

    Unikolai Гик

    да, если просто поставить byte вместо uint_8t; то не работает. Век живи, век учись)
     
  4. Unikolai

    Unikolai Гик

    если поставить такой массив, то такая ошибка
    Код (C++):

    sketch_mar13b.ino:2:12: error: declaration of 't' as array of references
    sketch_mar13b.ino: In function 'void loop()':
    sketch_mar13b.ino:8:3: error: 't' was not declared in this scope
    declaration of 't' as array of references
     
  5. DetSimen

    DetSimen Гуру

    Да. чота в С массив ссылок использовать нельзя.
     
  6. Unikolai

    Unikolai Гик

    то есть подобным образом не получится ничего сделать? МОжет можно как-то напрямую сделать массив {PORTD,PORTD,PORTC...} Я пробовал, у меня ничего не вышло, не ясно что за размерность у массива.
     
  7. DetSimen

    DetSimen Гуру

    можно использовать не ссылки, а указатели.
    вот так
    Код (C++):
    using TPortAddress = volatile byte *;

    TPortAddress PortArray[] = { &PORTB, &PORTD, &PORTC };
     
    использовать потом
    Код (C++):
        *(PortArray[0]) = 0b11110000;  // запись в PORTB
    *(PortArray[1]) = 0b00001111;  // запись в PORTD
     
    и еще раз повторюсь, DDRх порты должны быть настроены на вывод, иначе ничего не появица.
     
    Последнее редактирование: 13 мар 2018
  8. Unikolai

    Unikolai Гик

    Код (C++):
    using PortAddress = volatile byte *;
    PortAddress PortArray[] = { &PORTB, &PORTD, &PORTC };


    void setup() {
      DDRB = 0b1111111;
    }

    void loop() {
      *(PortArray[0]) = 0b11111111;
      delay(500);
      *(PortArray[0]) = 0b00000000;
      delay(500);
    }
    теперь выдает вот это
    Код (C++):
    sketch_mar13b.ino:1:7: error: expected nested-name-specifier before 'PortAddress'
    sketch_mar13b.ino:1:7: error: 'PortAddress' has not been declared
    sketch_mar13b.ino:1:19: error: expected ';' before '=' token
    sketch_mar13b.ino:1:19: error: expected unqualified-id before '=' token
    sketch_mar13b.ino:2:1: error: 'PortAddress' does not name a type
    sketch_mar13b.ino: In function 'void loop()':
    sketch_mar13b.ino:10:5: error: 'PortArray' was not declared in this scope
    expected nested-name-specifier before 'PortAddress'
     
     
  9. DetSimen

    DetSimen Гуру

    ну так напиши до всего этого

    using byte = uint8_t;
     
  10. Unikolai

    Unikolai Гик

    прошу прощения, но не выходит
    Код (C++):
    using byte = uint8_t;
    using TPortAddress = volatile byte *;
    TPortAddress PortArray[] = { &PORTB, &PORTD, &PORTC };


    void setup() {
      DDRB = 0b1111111;
    }

    void loop() {
      *(PortArray[0]) = 0b11111111;
      delay(500);
      *(PortArray[0]) = 0b00000000;
      delay(500);
    }
    а на выход порт B я настраиваю "DDRB = 0b1111111;"
     
  11. DetSimen

    DetSimen Гуру

    это весь текст программы?
    мошт, надо #include "Arduino.h" вставить в начало?
     
  12. Unikolai

    Unikolai Гик

    Именно этой да. Всегда проще написать маленькую программку и разобрать неясности на ней, чем сразу все пихать в основную.
    Код (C++):
    #include "Arduino.h"
    using byte = uint8_t;
    using TPortAddress = volatile byte *;
    TPortAddress PortArray[] = { &PORTB, &PORTD, &PORTC };


    void setup() {
      DDRB = 0b1111111;
    }

    void loop() {
      *(PortArray[0]) = 0b11111111;
      delay(500);
      *(PortArray[0]) = 0b00000000;
      delay(500);
    }
    Вставил, но ошибка та же
    можно все это сделать и через кейсы, но как мне кажется если есть возможность сделать все через массив, то жизнь стала бы куда проще)
     
  13. DetSimen

    DetSimen Гуру

    mar13.jpg

    у меня IDE 1.6.13
    и плата выбрана Arduino\Genuino Uno

    Ошибок, как видишь, нет.

    мои советы на этом закончились
     
  14. Unikolai

    Unikolai Гик

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

    Вложения:

  15. Unikolai

    Unikolai Гик

    в последней ардуине все скомпилировалось))я рад) теперь буду разбираться с этимы указателями, ссылками..лес для меня это еще тот)
     
    DetSimen нравится это.
  16. DetSimen

    DetSimen Гуру

    Нууу... нальешь при случае.
     
    Последнее редактирование: 13 мар 2018
    Unikolai нравится это.