arduino i analog "digitalWrite"

nvitek
Offline
Зарегистрирован: 15.12.2016

Доброго дня ALL! подскажите начинающему.

делал программу для показометра, на семисегментном индикаторе.

вот кусок кода, который работает и выводит в принципе все как и должен, но пришлось пользоваться digitalwrite.  Никак у меня не получается использовать массив с `PORTB |= _BV(PB0)` и `PORTB &= ~_BV(PB0)` .Digitalwrite берет 1 и 0 из массива и все в ажуре, но вот PORT работает быстрее чем Digital write, но... дальше лыжи пока не едут :-). Осталась только помощь зала. )

// #define LEDg_OFF() PORTB |= _BV(PB0)
// #define LEDg_ON() PORTB &= ~_BV(PB0)

 /*                                                 /````\ 
PD1    d1-1 |````````````````|30   vin         /```\\_A__//```\
PD0    d0-2 |                |29   gnd        | F |       | B  |
      rst-3 |                |28   RST  PC6   |   |       |    |
      gnd-4 |                |27   +5          \__//`````\\__/
PD2<   d2-5 |                |26   A7          /```\\ _G_//```\
PD3<   d3-6 |                |25   A6         |  E |      | C  |
PD4<   d4-7 |                |24   A5  PC5    |    |      |    |
PD5<   d5-8 |                |23   A4  PC4     \__/ /````\\__/
PD6<   d6-9 |                |22   A3      PC3      \_D_ /
PD7<  d7-10|                |21   A2      PC2
Pb0<   d8-11|                |20   A1      PC1
PB1  * d9-12|                |19   A0      PC0
PB2 *d10-13|                |18   AREF
PB3 *d11-14|                |17   3v3
PB4 *d12-15| _______         |16   d13     PB5
 */
//  d1=9,d2=10,d3=11,d4=12
// a,b,c,d,e,f,g is 2,3,4,5,6,7,8
byte numbers[10] = { B00000000, B11100100, B10010000, B11000000, B01100100, B01001000, B00001000, B11100000, B00000000, B01100000}; // numbers 0,1,2-9,
byte numberg[10] = { 1,1,0,0,0,0,0,1,0,0};  // segment G 0=on or off (0,1,2,..8,9)

void setup()
{

  DDRD=B11111100; 	// DDRD=0xfc; // all pins 0-7 OUTPUTs all pins 2-7 OUTPUTs or d2-d8
  DDRB=B00011111;	// DDRB=0x3f all pins 8-12 OUTPUTs even though we only use pins 8-12
  PORTD=0x00; 		// make pins 0-7 LOWs
  PORTB=0x00; 		// make pins 8-12 LOWs
//timer.setHertz(200); 
//timer.restart();
}
int i1 = 1;
 
 void loop() {

//if(timer.onRestart()) {    // events fired here are close to 200Hz
    // light up first digit only

  PORTB &= ~(1<<2); 	//Write(portd 2,LOW);
  PORTB &= ~(1<<3); 	//Write(portd 3,LOW);
  PORTB &= ~(1<<4); 	//Write(port d4,LOW);
  PORTB |= 1<<1; 	//Write(port d1,HIGH); // light up segments of first digit, display number #1, segments bc
    
	PORTD = numbers[i1]; 
	digitalWrite(8,(numberg[i1])); 

delay(2);
  // light up second digit only
  PORTB &= ~(1<<1); //digitalWrite(d1,LOW);
  PORTB &= ~(1<<3); //digitalWrite(d3,LOW);
  PORTB &= ~(1<<4); //digitalWrite(d4,LOW);
  PORTB |= 1<<2; //digitalWrite(d2,HIGH);// light up segments of second digit, display #2, segments abdeg

     PORTD = numbers[5]; 
     //   digitalWrite(8,(numberg[5])); // segment g is on
    PORTB &= ~(1<<0); //digitalWrite(8,LOW); // segment g is on
delay(2);
  // light up third digit only
  PORTB &= ~(1<<1); //digitalWrite(d1,LOW);
  PORTB &= ~(1<<2); //digitalWrite(d2,LOW);
  PORTB &= ~(1<<4); //digitalWrite(d4,LOW);
  PORTB |= 1<<3; //digitalWrite(d3,HIGH);
    // light up segments of third digit, display #3
    PORTD = numbers[3]; 
     digitalWrite(8,(numberg[3])); 
delay(3);

 light up fourth digit only
  //PORTB &= ~(1<<1); //digitalWrite(d1,LOW);
  //PORTB &= ~(1<<2); //digitalWrite(d2,LOW);
  //PORTB &= ~(1<<3); //digitalWrite(d3,LOW);
  //PORTB |= 1<<4; //digitalWrite(d4,HIGH);
      // light up segments of fourth digit only, display #4
    //PORTD=B01100111; //B10011000; // only pins 3,4 and 7 on
    //PORTB &= ~(1<<0); //digitalWrite(8,LOW); // segment g on
// delay(2);
}
// here is program code

}

 

andycat
Offline
Зарегистрирован: 07.09.2017

я отсюда черпал знание

http://codius.ru/articles/%D0%A2%D1%8E%D0%BD%D0%B8%D0%BD%D0%B3_Arduino_%...

 
 

26 октября 2016

Кравченко Виктор

Тюнинг Arduino или ускоряем работу платы

и вот часть кода вывода на семи сегментный индикатор с ШИМ регулировкой яркости


#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif

#define PB2_HIGH sbi(PORTB,PB2);
#define PB2_LOW cbi(PORTB,PB2);
#define PB3_HIGH sbi(PORTB,PB3);
#define PB3_LOW cbi(PORTB,PB3);
#define PB4_HIGH sbi(PORTB,PB4);
#define PB4_LOW cbi(PORTB,PB4);

void showLedBuf() {
  for (byte lp = 0; lp <= LED_PWM; ++lp) {
    for (byte i = 0; i <= 7; i++) {
      //unsigned long tms = micros();
      PB3_LOW;
      //tms = micros() - tms;
      for (byte j = 0; j <= 7; j++) {
        if (bitRead(LED_BUF[i], (7 - j))) {
          PB4_HIGH;
        } else {
          PB4_LOW;
        }
        PB2_HIGH;
        PB2_LOW;
      }
      for (byte j = 0; j <= 7; j++) {
        if (bitRead(LED_NU[i], (7 - j))) {
          PB4_HIGH;
        } else {
          PB4_LOW;
        }
        PB2_HIGH;
        PB2_LOW;
      }
      PB3_HIGH;
    }
    //tms = micros() - tms;
  }
  for (byte lp = 0; lp < (7 - LED_PWM); ++lp) {
    PB3_LOW;
    PB4_HIGH;
    for (byte j = 0; j <= 15; j++) {
      PB2_HIGH;
      PB2_LOW;
    }
    PB3_HIGH;
    delayMicroseconds(350);
  }
}

 

andycat
Offline
Зарегистрирован: 07.09.2017
byte LED_0F[33] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E, 0xC2, 0x89, 0xF9, 0xF1, 0xC3, 0xA9, 0xC0, 0x8C, 0x98, 0x92, 0xC1, 0x91, 0xFE, 0xBF, 0xFF, 0x9C, 0xAB};
// 0123456789AbCdEFGHIJLnOPqSUY_- (null) (degree) (mm)
byte LED_NU[8] = {16, 32, 64, 128, 1, 2, 4, 8};
byte LED_BUF[8] = {30, 30, 30, 30, 30, 30, 30, 30};
byte LED_PWM = 3; // level light 7 = MAX 0 = MIN

 

nvitek
Offline
Зарегистрирован: 15.12.2016

Через IF я могу, хотелось с массива, чтоб сразу за ногу дергать :-). Вопрос открыт.

п.с. А если задействовать первые два пина порта D, то и вообще все просто. но эти два пользуются для RX,TX штатной библиотекой. Вот и горожу огород, да еще и без опыта :-)

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

Похоже о структурном программировании , а так же Си++ ТС не знает, или ему религия не позволяет.

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

qwone пишет:

Похоже о структурном программировании , а так же Си++ ТС не знает, или ему религия не позволяет.

очередной  "электронщик" небось, "20 лет за паяльником", презирает wiring, а так же "все ваши массивы и обьекты"...

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

Вот только почему-то "электронщики 20 лет за пяяльником" не собирают из дискретных элементов микросхемы. Не нравится wiring пиши "свой wiring". Но когда простое действие- вывести 0 или 1 превращается в "простыню" и все должны искать где ТС накосячил(горе-от-умачил), то зачем мне в этот процесс влезать.

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

афтар, есди не хочешь digitalWrite - вместо digitalWrite(8,(numberg[i1])) пиши PORTB |=(numberg[i1])

да и вообще, в коде полно бредятины... если вы пишете несколько бит в  один порт - нафига писать каждый бит отдельно? - выставляйте все за раз...

Код выглядит так, как будто вы решили нарочно себе ампутировать ногу старой ржавой пилой, потому что не доверяете доктору Вайрингу :)

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

b707 пишет:

потому что не доверяете доктору Вайрингу :)

потому, что дохтора залечивают людёв до смерти. О_О

травки, корения, огурцы в жопу - наше всё.

nvitek
Offline
Зарегистрирован: 15.12.2016

Ну вот. Понеслась :-) всем "нападателям"->:

Лучшая защита, нападение... главное втоптать... "20 лет.. паяльник..религия.." Человек сел учиться, вопросы появились. Вы чё, все родились вумными?  Сразу, с садика на асме ваяли, или может сразу готовый хекс рождали? Да мусор в коде, да можно выставить все за раз. Да я понимаю, что это раздражает тех кто привык писать правильно и красиво. Вот только это был мой первый пост, и первый вопрос. :-) Тут осилить бы, да разобраться как, а остальное доделаем.

По делу:  b707,andycat- А за контсруктив,Спасибо. 

 

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

nvitek пишет:

Вы чё, все родились вумными? 

ну, я родился умным - сцуко, с рождения умный.

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

nvitek
Offline
Зарегистрирован: 15.12.2016

Ну вот рад я за тебя. ))

На родителей я не жалуюсь, ни на iq ни на генетику. Просто есть вещи, которых не знаю... пока. Ну и признаю это без проблем )). А ты, если не знаешь, или не можешь, или не хочешь помогать, ну так просто не пиши, да и все на этом. А форум для всех...

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

nvitek пишет:

А форум для всех...

дык, писать/не писать или форум для всех дураков(с)? О_О

nvitek
Offline
Зарегистрирован: 15.12.2016

слушай, Калапуцый, если можешь, давай по делу. А если тебе просто нечем себя занять, то наводи "лоск..". ;-)  

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

nvitek пишет:

слушай, Калапуцый, если можешь, давай по делу.  

по какому делу?

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

Не проверял, да и надо расставить правильно регистры на нужные пины

/**/
//----------------------
struct pin_t {
  volatile uint8_t *reg;
  volatile uint8_t *adr;
  byte bit;
};
struct pin_t PIN[] = {
  &DDRB, &PORTB, 0, /*пин 5= A*/
  &DDRB, &PORTB, 1, /*пин 6=B*/
  &DDRB, &PORTB, 2, /*пин 7=C*/
  &DDRB, &PORTB, 3, /*пин 8=D*/
  &DDRB, &PORTB, 4, /*пин 9=E*/
  &DDRB, &PORTB, 2, /*пин 10=F*/
  &DDRB, &PORTB, 3, /*пин 11=G*/
  &DDRB, &PORTB, 4 /*пин 12=H*/
};


void setup() {
  for (byte i = 0; i < 8; ++i) {
    *(PIN[i].reg) |= (1 << PIN[i].bit) ; // pinMode(0UTPIN)
    *(PIN[i].adr) |= (1 << PIN[i].bit) ; // digitalWrite(HIGH)
  }

}

void loop() {
  delay(200);
  for (byte i = 0; i < 8; ++i) {
    *(PIN[i].adr) &= ~(1 << PIN[i].bit) ; // digitalWrite(LOW)
  }
  delay(200);
  for (byte i = 0; i < 8; ++i) {
    *(PIN[i].adr) |= (1 << PIN[i].bit) ; // digitalWrite(HIGH)
  }
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

nvitek пишет:
А ты, если не знаешь, или не можешь, или не хочешь помогать, ну так просто не пиши, да и все на этом.

А если я не знаю, или не могу, или не хочу помогать, но при этом хочу таки чёнить писать! Как быть?

Ведь, как Вы изволили выразиться

nvitek пишет:
форум для всех...

Так всё-таки "для всех" или только "для Вас и для тех, кто знает, может и хочет Вам помогать"?

Ву уж определитесь и сообщите нам, чтобы мы знали.

 

wdrakula
wdrakula аватар
Онлайн
Зарегистрирован: 15.03.2016

nvitek пишет:
вот PORT работает быстрее чем Digital write,

Мил-человек!

Поясни залу, в каком месте тебе не хватает скорости digutalWrite()? Тогда мы поскажем, как именно, в этом месте лучше поступить.

Пока что случаев, где нужна такая оперативность, почти не встречается. Зато встречается "Авторитетное мнение" про ужастно медленный digitalWrite().

nvitek
Offline
Зарегистрирован: 15.12.2016

Спасибо qwone ׂ.

andycat хорошую ссылку дал,

 http://codius.ru/articles/%D0%A2%D1%8E%D0%BD%D0%B8%D0%BD%D0%B3_Arduino_%D0%B8%D0%BB%D0%B8_%D1%83%D1%81%D0%BA%D0%BE%D1%80%D1%8F%D0%B5%D0%BC_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%83_%D0%BF%D0%BB%D0%B0%D1%82%D1%8B

там человек достаточно подробно разбирает\поясняет. будем курить ). 

А если комуто хватает стандартных digitalwrite, итд., вы в праве их использовать, равно как другие в праве поступать в этом вопросе иначе. Чужое "авторитетное"мнение, как вы сквзали про digitalwrite, услышал от вас и по ссылке andycat. А искать полез когда увидел как порт работает, а как дигиталврайт. 

П.С. ув. Евгений, для вас, поясняю мои слова. Да, форум для всех. Писать могут, все. Вам никогда не приходилось тратить своё время на то, чтобы среди тонн флейма, прочитать ответы\обсуждение по теме? Я не думаю что у Вас много лишнего времени. У Вас права водителя есть? Вы Правила соблюдаете? А зачем? Да чтоб порядок был. "Оперируют в операционой..обедают в столовой" - проф. Преображенский "Собачье сердце"

пс.пс пишите. ) Только читать долго и нудно когда много и не по теме. я об этом. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

О каких правилах речь? Здесь вроде не операциооная. Какой именно правило запрещает Клапауцию писать Вам что-то? Ну, или мне?

wdrakula
wdrakula аватар
Онлайн
Зарегистрирован: 15.03.2016

nvitek пишет:

А если комуто хватает стандартных digitalwrite, итд.,

Уважаемый!

Ты как-то странно все понял. Я  намного опытнее и грамотнее тебя. Это не обида, а просто так, как есть.

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

Ты не решаешь задачу, где нужна прямая работа с регистрами.

Если хочешь учиться просто для самообразования - велком.

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

---------------------

твой вопрос такой ведь: Как можно, не используюя digitalWrite(), обращаться к пину с заранее не известным номером? 

Такой вопрос?

И я тебе отвечу:  сильно зависит от задачи.Если абстрактно к любому пину, то лишь чуть быстрее, выкинув проверки.

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

nvitek
Offline
Зарегистрирован: 15.12.2016

Wdrakula, согласен с вами и с вашим опытом. Потому я и задал вопрос, и теперь вижу и от вас ответ. Обида, а смысл? Ну а переходить на эпитеты "ну, я родился умным - сцуко, с рождения умный. если ты родился дураком, то жалуйся родителям за бракованный генетический материал, а не тута плакай, как тебя-дурака обижают."  Это не по теме, как минимум.  ) 

С моей стороны была попытка отсеять флейм. А "код", это скорей лишь попытка обьяснить ALL, суть вопроса. Для наглядности.  Да, криво, сумбурно, но уж пардон. Самообразование?- можно и так сказать. Не углубляясь в филосоию, итд.. если человек перестал учиться, это нехорошо. А то что я занялся "дерганьем ног порта", это не остновной мой хлеб. 

Суть вопроса была в том, как с минимальным лагом по времени дернуть 6 ног порта D (2-7, не трогая 0 и1) и  ногу 0 Порта B. стандартную дигиталврайт, оставим за скобками.

 

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

nvitek пишет:

Суть вопроса была в том, как с минимальным лагом по времени дернуть 6 ног порта D (2-7, не трогая 0 и1) и  ногу 0 Порта B. стандартную дигиталврайт, оставим за скобками.

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

*писать код в ассемблере и забыть о Дуино ИДЕ.

wdrakula
wdrakula аватар
Онлайн
Зарегистрирован: 15.03.2016

nvitek пишет:

Суть вопроса была в том, как с минимальным лагом по времени дернуть 6 ног порта D (2-7, не трогая 0 и1) и  ногу 0 Порта B. стандартную дигиталврайт, оставим за скобками.

А я еще раз повторяю, что без привязки к конкретной задаче это вопрос типа:

 - Интересуюсь, Симочка. Скоки стоит океянский пароход?

То есть вопрос бессмысленный и демагогический.

Для индикатора - достаточно стандартной функции. Для выгрузки данных куда-то вовне по параллельному интерфейсу нужно разложить исходное 7-ми битовое число на две маски  6 бит и 1 бит (И и сдвиг - для каждого - примерно 4 операции) и записать в порт  каждую маску одним оператором (+ еще две операции). Это кратчайший способ. Про сдвиги важно помнить, что в АВР нет команды сдвига на несколько позиций за такт, то есть сдвиг на 4 это четыре такта.

И вот эти все такты имеет смысл считать при критичной работе с параллельным ЦАП при генерации сигнала сложной формы или для работы с памятью, при вычислениях, но тогда берут контроллер мощнее.

//пример

//byte dd - наше чисто, 6 младших бит, в том же порядке в порт D, 6-ой бит в PB0.

//длинный вариант, оптимизатор все равно сам сократит

byte maskPD = dd & 0b00111111;

byte maskPB = (dd >> 6) & 0b00000001;

PORTB = PORTB & 0b11111110 | maskPB;

PORTD = PORTD & 0b11000000 | maskPD;


 

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

nvitek пишет:

 

Суть вопроса была в том, как с минимальным лагом по времени дернуть 6 ног порта D (2-7, не трогая 0 и1) и  ногу 0 Порта B. стандартную дигиталврайт, оставим за скобками.

 

wdrakula правильно написал, ну посиотрите еще здесь ( http://arduino.ru/forum/programmirovanie/proshu-pomoshchi-v-dorabotke-ko... )- может будет более понятно, там управление теми же пинами.

nvitek
Offline
Зарегистрирован: 15.12.2016

Спасибо. 

".удар кувалдой стоит доллар, а за то что я знаю куда бить плюс 10к." 

wdrakula
wdrakula аватар
Онлайн
Зарегистрирован: 15.03.2016

nvitek пишет:

Спасибо. 

".удар кувалдой стоит доллар, а за то что я знаю куда бить плюс 10к." 

Вам все равно что-то осталось непонятно?

Кстати разбивка не самая удобная, на уно и нано разбивать нужно на PD4-7 и PB0-3, тогда проще формировать выводы.Сдвигов вообще нет.

Все еще непонятно? ;)

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

nvitek пишет:

Спасибо. 

".удар кувалдой стоит доллар, а за то что я знаю куда бить плюс 10к." 

Для работы программиста  кувалда доллар, инструкция по пользованию кувалдой 1к , курсы для тех кто не читает инструкции 10к и еще 50к за общение с клиентом, которого облизываешь как только можешь, а он скатина еще и бабки зажимает и его должны любить за то что он "работу дает".