Проблема с функцией shiftIn

Тема в разделе "Микроконтроллеры AVR", создана пользователем elarm, 25 дек 2016.

  1. elarm

    elarm Нуб

    Задача. Организовать с одной ардуины на другую несколько последовательных каналов передачи данных. Предположим, передатчик реализуется при помощи известной функции siftOut(dataPIN, clockPIN, ORDER, data).
    С передачей-то всё понятно. На осциллографе чётко виден последовательный код на ножке dataPIN и синхро-пакет на ноге clockPIN.
    А вот с приёмом возникли проблемы. Казалось бы, что функция shiftIn(dataPIN, clockPIN, ORDER), возвращающая значение byte, предназначена именно для этого.
    Однако реальное её применение показало, что возвращает она всё, что угодно, но только не то, что передаётся при помощи siftOut.
    Поэтому возникает вопрос. Существуют-ли в природе реально работающие примеры скетча приёмника последовательного кода, сгенерённого функцией siftOut?
     
  2. mcureenab

    mcureenab Гуру

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

    Если угодно, siftOut должна передать данные в регистр типа 74HC595 на ножку Ds, перевести clockPIN в режим INPUT и за тем сообщить о готовности партнеру. Партнер функцией shiftIn может считать данные из 74HC595 с пина Q7’ и перевести clockPin в режим INPUT.
     
    elarm нравится это.
  3. elarm

    elarm Нуб

    Получается, что пины в setup() для shiftIn(dataPIN, clockPIN, ORDER) следует описывать так:
    Код (Text):

    pinMode(dataPIN, INPUT);
    pinMode(clockPIN, OUTPUT);
     
    -- Это в приёмнике. А в передатчике, тогда:
    Код (Text):
    pinMode(dataPIN, OUTPUT);
    pinMode(clockPIN, INPUT);
     
    Так?
     
  4. rkit

    rkit Гуру

    Есть куча готовых последовательных каналов - USART, Twi, spi. Нет нужды пытаться изобретать велосипед из вещей, для этого не предназначенных.
     
  5. mcureenab

    mcureenab Гуру

    Лучше везде
    Код (C++):
    pinMode(clockPIN, INPUT);
    чтобы случайно КЗ не устроить. На всякий случай clockPIN с обеих МК подключайте через резистор 220Ом, чтобы в случае ошибки ограничить ток через пин.

    Еще нужен пин для синхронизации - сообщить, что регистр готов для чтения и наоборот, готов для записи.
    Можно синхронизацию через dataPIN сделать. Но придется или один бит пожертвовать или перед shiftOut один бит толкнуть в регистр.

    В общем сдается мне, что это изврат.
     
    elarm нравится это.
  6. mcureenab

    mcureenab Гуру

    Мультиплексируйте один канал физический. Нужно только протокол подходящий найти.
     
  7. elarm

    elarm Нуб

    То есть, так?:
    Передатчик:
    Код (Text):

    pinMode(dataPIN, OUTPUT);
    pinMode(clockPIN, INPUT);
     
    Приёмник:
    Код (Text):

    pinMode(dataPIN, INPUT);
    pinMode(clockPIN, INPUT);
     
    Еще! Я так понял, что регистр на 74HC595 служит своеобразным буфером обмена, хранящим передаваемое число. именно поэтому его надо постоянно гонять из режима "прослушивание" в режим "передачи"(хранения) и обратно. Так?
     
  8. vvr

    vvr Инженерище

     
  9. elarm

    elarm Нуб

    Я не изобретаю велосипед мне нужно просто передать целое число из одного корпуса атмеги в другой. Тупо: с одного пина корпуса А на пин корпуса В. Задача проще некуда. Атмега на это способна или нет? На VHDL(например, для SPARTAN-ов) эта задачка решается влёт. Возможно-ли её решить в рамках проекта на Ардуине(с помощью микроконтроллера AVR)?
    Поэтому. Просьба тех, кто не знает ответа не флудить тут.
     
    Последнее редактирование: 25 дек 2016
  10. rkit

    rkit Гуру

    Изобретаете.

    Я вам перечислил неполный список средств.

    Если задача такая простая, то почему трудности?

    И зачем же вы тогда пытаетесь велосипедить с методом передачи, использующим два пина? По одному пину можно широтной модуляцией, например.

    Вам ответ был дан. Только вы его решили прочитать не тем местом, к сожалению.
     
  11. mcureenab

    mcureenab Гуру

    Да. Он хранит 8 бит, которые в него загрузили через пин Ds. Если на SHcp подать еще 8 тактовых импульсов, эти 8 бит будут последовательно вытолкнуты на пин Q7'. Приемник их считывает. Т.е. в данном случае регистр служит 8 битным буфером с доступом типа FIFO.

    Но еще раз отмечу, что это баловство. Интересно только для общего развития. Используйте объект Serial. https://www.arduino.cc/en/Reference/Serial
     
    elarm нравится это.
  12. elarm

    elarm Нуб

    Спасибо! Всё понятно. Использование такого буфера необходимо из-за того, что разные корпуса AVR работают на частотах не синхронизированных по фазе. Другими словами, цикл обработки состояний loop{...} в разных корпусах не синхронизирован. Поэтому корпус передатчика фиксирует в буфере(74HC595) число, а приёмник его считывает, запуская буфер(74HC595) уже своей синхросерией. Так?
     
  13. elarm

    elarm Нуб

    Пожалуйста! Приведите пример в виде двух скетчей для передатчика и приёмника, который транслирует число, например -- 65532 из одного корпуса на другой. Корпуса ATMEGA 328P.
    С уважением, Львов Г. ;-)
     
  14. rkit

    rkit Гуру

    Серьезно?
    Serial.println(x);
    int x = Serial.parseInt();
     
    elarm нравится это.
  15. elarm

    elarm Нуб

    Неплохо! Диалог завязался. Как объекту Serial объяснить по какому пину передавать число? Ну и по какому пину слушать?
     
  16. mcureenab

    mcureenab Гуру

    Да. Это специфика работы функций shiftIn и shiftOut. Они обе ведущие и обе в процессе обмена порождают сигналы синхронизации, поэтому одновременно не могут работать с одним каналом.

    В случае с интерфейсом UART один МК отправляет, а другой МК одновременно принимает данные во встроенный буфер МК. Функциям Serial не нужен внешний буфер. Они пользуются тем что встроен в МК. Кроме того есть библиотека программного UART. Она требует больше ресурсов процессора, но позволяет создавать множество физических последовательных каналов на любых пинах GPIO.
    Рекомендую использовать встроенный UART контроллер. Он решит вашу задачу гораздо проще без лишних компонентов и программирования.
     
    elarm нравится это.
  17. rkit

    rkit Гуру

    Диалог с гуглом завязывайте. Вам дали уже тысячу направлений куда копать. Вперед. никто за вас это делать не будет.
     
  18. mcureenab

    mcureenab Гуру

    Какой смысл 100500 раз обсуждать решенные задачи?

    http://robotic-controls.com/learn/arduino/arduino-arduino-serial-communication
     
    elarm нравится это.
  19. elarm

    elarm Нуб

    Спасибо!!! Понятно всё. За наводку на UART, отдельно --- это реально просветлило. Попробую.
     
  20. elarm

    elarm Нуб

    Спасибо! Я из другой вселенной сюда залез. Логика тут иная. Здесь много готовых решений, а я привык на низком уровне возиться. Потому и скользко тут мне.

    ATMEGA хорошо работает с внешней средой, чем и привлекла. Но на серьёзную числовую обработку, похоже не заточена. Видимо её предстоит выдать замуж за SPARTAN.
     
    Последнее редактирование: 26 дек 2016