Помогите пожалуйста избавиться от digitalRead и digitalWrite

OdinTakoi
Offline
Зарегистрирован: 04.05.2017

Помогите пожалуйста избавиться от digitalRead () и digitalWrite () не могу понять, запутался очень.

Контроллер Arduino pro mini 328p

Код вот такой:

#include <OneWire.h>
#include <RemoteReceiver.h>
#include <Ultrasonic.h>
Ultrasonic ultrasonicNIZ(11, 10);
Ultrasonic ultrasonicVERX(12, 9);
int ledPin = 13;
const int pinPhoto = A0;
int Svet = 0;
int AAWWE = 0;
byte  PL = 2;
byte  PD = 2;
int dataPin1 = 6;
int latchPin1 = 5;
int clockPin1 = 8;
int dataPin2  = 4;
int latchPin2 = 3;
int clockPin2 = 7;
unsigned long receivedCode;
unsigned int period;
int incomingByte;
void setup() {
  RemoteReceiver::init(0, 0, showCode);
  pinMode(latchPin1, OUTPUT);
  pinMode(clockPin1, OUTPUT);
  pinMode(dataPin1, OUTPUT); 
  pinMode(ledPin, OUTPUT);
  pinMode(latchPin2, OUTPUT);
  pinMode(clockPin2, OUTPUT);
  pinMode(dataPin2, OUTPUT);
  pinMode(pinPhoto, INPUT);
  Serial.begin(115200);}
  void showCode(unsigned long receivedCode, unsigned int period) {
digitalWrite(ledPin, HIGH);
delay (100);
digitalWrite(ledPin, LOW); 
Svet = analogRead (pinPhoto);// Svet переменная света.
float dist_cm = ultrasonicNIZ.Ranging(CM);
float dist_cm2 = ultrasonicVERX.Ranging(CM);
if (PL == 1) 
{digitalWrite(latchPin2, LOW);
shiftOut(dataPin2, clockPin2, LSBFIRST, B01111111);
shiftOut(dataPin2, clockPin2, LSBFIRST, B01111111);
digitalWrite(latchPin2, HIGH);
delay(30);}

Я смог только понять вот это и то не могу поять верно или нет

DDRD = DDRD | B11111000;
DDRB = DDRB | B00100001;
DDRC = DDRC | B00000000;

 

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014
Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

// digitalWrite(ledPin, HIGH);

OdinTakoi
Offline
Зарегистрирован: 04.05.2017

А почему там 5 а не 6 ?
8-9-10-11-12-13, почему 5 ?

DDRB &= ~(1<<5); // сконфигурировать пин PB5 (D13) на вход. Равносильно pinMode(13, INPUT);
DDRB |= (1<<5); // сконфигурировать пин PB5 (D13) на выход. Равносильно pinMode(13, OUTPUT);
PORTB &= ~(1<<5); // установить на пине PB5 (D13) лог 0. Равносильно digitalWrite(13, LOW);
PORTB |= (1<<5); // установить на пине PB5 (D13) лог 1. Равносильно digitalWrite(13, HIGH);

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Потому что пин PB5 (пятый пин порта B). Читайте дальше, там есть про распиновку.

OdinTakoi
Offline
Зарегистрирован: 04.05.2017

Спасибо большое, я начинаю монимать кажется.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Вот в этой статье даже картинка есть - соответсвие пинов чипа пинам ардуины.

OdinTakoi
Offline
Зарегистрирован: 04.05.2017

Парни проверьте плиз запутался в самой прорамме как заменить шифтаут или аналог реад

#include <OneWire.h>
#include <RemoteReceiver.h>
#include <Ultrasonic.h>
Ultrasonic ultrasonicNIZ(11, 10);
Ultrasonic ultrasonicVERX(12, 9);
int ledPin = 13;//-
const int pinPhoto = A0;//-
int Svet = 0;
int AAWWE = 0;
byte  PL = 2;
byte  PD = 2;
int dataPin1 = 6;//-
int latchPin1 = 5;//-
int clockPin1 = 8;//-
int dataPin2  = 4;//-
int latchPin2 = 3;//-
int clockPin2 = 7;//-
unsigned long receivedCode;
unsigned int period;
int incomingByte;
void setup() {
  RemoteReceiver::init(0, 0, showCode);
  pinMode(latchPin1, OUTPUT);//DDRD |= (1<<5)
  pinMode(clockPin1, OUTPUT);//DDRB |= (1<<0)
  pinMode(dataPin1, OUTPUT); //DDRD |= (1<<6)
  pinMode(ledPin, OUTPUT);//DDRB |= (1<<5)
  pinMode(latchPin2, OUTPUT);//DDRD |= (1<<3)
  pinMode(clockPin2, OUTPUT);//DDRD |= (1<<7)
  pinMode(dataPin2, OUTPUT);//DDRD |= (1<<4)
  pinMode(pinPhoto, INPUT);//DDRC &=~(1<<0)
  Serial.begin(115200);}
  void showCode(unsigned long receivedCode, unsigned int period) {
digitalWrite(ledPin, HIGH);//PORTB |= (1<<5)
delay (100);
digitalWrite(ledPin, LOW);//PORTB &=~(1<<5)
void loop() {
Svet = analogRead (pinPhoto);//Svet = PINC |= (1<<0)
float dist_cm = ultrasonicNIZ.Ranging(CM);// 
float dist_cm2 = ultrasonicVERX.Ranging(CM);//
if (PL == 1)
{digitalWrite(latchPin2, LOW);//PORTD &=~(1<<3)
shiftOut(dataPin2, clockPin2, LSBFIRST, B01111111);//shiftOut(PIND |= (1<<4), PIND |= (1<<7), LSBFIRST, B01111111)
shiftOut(dataPin2, clockPin2, LSBFIRST, B01111111);
digitalWrite(latchPin2, HIGH);//PORTD |= (1<<3)
delay(30);}

 

nik182
Offline
Зарегистрирован: 04.05.2015

shiftОut нельзя заменить одной командой. В файле c:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\wiring_shift.c определяется эта команда. По образу и подобию можно написать свою c заменой digitalWrite работающую быстрее и занимающую меньше места.

analogRead заменять не имеет смысла. Она и так написана нормально.

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

OdinTakoi, зачем Вам 2 набора latchPin/dataPin/clockPin?

По-хорошему это надо делать на аппаратном SPI, если нужна скорость.

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

OdinTakoi
Offline
Зарегистрирован: 04.05.2017

Про shiftОut поня, не осилю.
Про аналогреад понял смысла нет.
2 набора потому что 4 сдвиговых регистра управляющиеся в корне по разному, 2 шт от датчика движения и 2 от света по времени.

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

OdinTakoi пишет:
2 набора потому что 4 сдвиговых регистра управляющиеся в корне по разному, 2 шт от датчика движения и 2 от света по времени.

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

- цепочка входных сдвиговых регистров,

- цепочка выходных сдвиговых регистров,

- несколько АЦП,

- цифровой сигнальный процессор.

OdinTakoi
Offline
Зарегистрирован: 04.05.2017

Афигеть ты мозг)))))))))))
я так не смогу(((((

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

OdinTakoi пишет:
Афигеть ты мозг))))))))))) я так не смогу(((((

А где.. ключевая фраза- я тобой горжусь :)

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

 

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

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

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

OdinTakoi пишет:

Помогите пожалуйста избавиться от digitalRead () и digitalWrite () не могу понять, запутался очень.

Контроллер Arduino pro mini 328p

Если тяжело - посмотрите на библиотеку CyberLib