arduino i analog "digitalWrite"
- Войдите на сайт для отправки комментариев
Втр, 14/11/2017 - 18:14
Доброго дня 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 }
я отсюда черпал знание
http://codius.ru/articles/%D0%A2%D1%8E%D0%BD%D0%B8%D0%BD%D0%B3_Arduino_%...
26 октября 2016
Тюнинг Arduino или ускоряем работу платы
и вот часть кода вывода на семи сегментный индикатор с ШИМ регулировкой яркости
Через IF я могу, хотелось с массива, чтоб сразу за ногу дергать :-). Вопрос открыт.
п.с. А если задействовать первые два пина порта D, то и вообще все просто. но эти два пользуются для RX,TX штатной библиотекой. Вот и горожу огород, да еще и без опыта :-)
Похоже о структурном программировании , а так же Си++ ТС не знает, или ему религия не позволяет.
Похоже о структурном программировании , а так же Си++ ТС не знает, или ему религия не позволяет.
очередной "электронщик" небось, "20 лет за паяльником", презирает wiring, а так же "все ваши массивы и обьекты"...
Вот только почему-то "электронщики 20 лет за пяяльником" не собирают из дискретных элементов микросхемы. Не нравится wiring пиши "свой wiring". Но когда простое действие- вывести 0 или 1 превращается в "простыню" и все должны искать где ТС накосячил(горе-от-умачил), то зачем мне в этот процесс влезать.
афтар, есди не хочешь digitalWrite - вместо digitalWrite(8,(numberg[i1])) пиши PORTB |=(numberg[i1])
да и вообще, в коде полно бредятины... если вы пишете несколько бит в один порт - нафига писать каждый бит отдельно? - выставляйте все за раз...
Код выглядит так, как будто вы решили нарочно себе ампутировать ногу старой ржавой пилой, потому что не доверяете доктору Вайрингу :)
потому что не доверяете доктору Вайрингу :)
потому, что дохтора залечивают людёв до смерти. О_О
травки, корения, огурцы в жопу - наше всё.
Ну вот. Понеслась :-) всем "нападателям"->:
Лучшая защита, нападение... главное втоптать... "20 лет.. паяльник..религия.." Человек сел учиться, вопросы появились. Вы чё, все родились вумными? Сразу, с садика на асме ваяли, или может сразу готовый хекс рождали? Да мусор в коде, да можно выставить все за раз. Да я понимаю, что это раздражает тех кто привык писать правильно и красиво. Вот только это был мой первый пост, и первый вопрос. :-) Тут осилить бы, да разобраться как, а остальное доделаем.
По делу: b707,andycat- А за контсруктив,Спасибо.
Вы чё, все родились вумными?
ну, я родился умным - сцуко, с рождения умный.
если ты родился дураком, то жалуйся родителям за бракованный генетический материал, а не тута плакай, как тебя-дурака обижают.
Ну вот рад я за тебя. ))
На родителей я не жалуюсь, ни на iq ни на генетику. Просто есть вещи, которых не знаю... пока. Ну и признаю это без проблем )). А ты, если не знаешь, или не можешь, или не хочешь помогать, ну так просто не пиши, да и все на этом. А форум для всех...
А форум для всех...
дык, писать/не писать или форум для всех дураков(с)? О_О
слушай, Калапуцый, если можешь, давай по делу. А если тебе просто нечем себя занять, то наводи "лоск..". ;-)
слушай, Калапуцый, если можешь, давай по делу.
по какому делу?
Не проверял, да и надо расставить правильно регистры на нужные пины
А если я не знаю, или не могу, или не хочу помогать, но при этом хочу таки чёнить писать! Как быть?
Ведь, как Вы изволили выразиться
Так всё-таки "для всех" или только "для Вас и для тех, кто знает, может и хочет Вам помогать"?
Ву уж определитесь и сообщите нам, чтобы мы знали.
Мил-человек!
Поясни залу, в каком месте тебе не хватает скорости digutalWrite()? Тогда мы поскажем, как именно, в этом месте лучше поступить.
Пока что случаев, где нужна такая оперативность, почти не встречается. Зато встречается "Авторитетное мнение" про ужастно медленный digitalWrite().
Спасибо 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. А искать полез когда увидел как порт работает, а как дигиталврайт.
П.С. ув. Евгений, для вас, поясняю мои слова. Да, форум для всех. Писать могут, все. Вам никогда не приходилось тратить своё время на то, чтобы среди тонн флейма, прочитать ответы\обсуждение по теме? Я не думаю что у Вас много лишнего времени. У Вас права водителя есть? Вы Правила соблюдаете? А зачем? Да чтоб порядок был. "Оперируют в операционой..обедают в столовой" - проф. Преображенский "Собачье сердце"
пс.пс пишите. ) Только читать долго и нудно когда много и не по теме. я об этом.
О каких правилах речь? Здесь вроде не операциооная. Какой именно правило запрещает Клапауцию писать Вам что-то? Ну, или мне?
А если комуто хватает стандартных digitalwrite, итд.,
Уважаемый!
Ты как-то странно все понял. Я намного опытнее и грамотнее тебя. Это не обида, а просто так, как есть.
Я увидел твой вопрос и твой уровень по примеру кода.
Ты не решаешь задачу, где нужна прямая работа с регистрами.
Если хочешь учиться просто для самообразования - велком.
Но тогда и вопрос задавай тот, что интересен. Потому как в твоем примере работа с регистрами - просто не нужна.
---------------------
твой вопрос такой ведь: Как можно, не используюя digitalWrite(), обращаться к пину с заранее не известным номером?
Такой вопрос?
И я тебе отвечу: сильно зависит от задачи.Если абстрактно к любому пину, то лишь чуть быстрее, выкинув проверки.
А если группы ног установить надо, то их можно подбирать под регистр. Но это уже зависитот задачи, как я и сказал.
Wdrakula, согласен с вами и с вашим опытом. Потому я и задал вопрос, и теперь вижу и от вас ответ. Обида, а смысл? Ну а переходить на эпитеты "ну, я родился умным - сцуко, с рождения умный. если ты родился дураком, то жалуйся родителям за бракованный генетический материал, а не тута плакай, как тебя-дурака обижают." Это не по теме, как минимум. )
С моей стороны была попытка отсеять флейм. А "код", это скорей лишь попытка обьяснить ALL, суть вопроса. Для наглядности. Да, криво, сумбурно, но уж пардон. Самообразование?- можно и так сказать. Не углубляясь в филосоию, итд.. если человек перестал учиться, это нехорошо. А то что я занялся "дерганьем ног порта", это не остновной мой хлеб.
Суть вопроса была в том, как с минимальным лагом по времени дернуть 6 ног порта D (2-7, не трогая 0 и1) и ногу 0 Порта B. стандартную дигиталврайт, оставим за скобками.
Суть вопроса была в том, как с минимальным лагом по времени дернуть 6 ног порта D (2-7, не трогая 0 и1) и ногу 0 Порта B. стандартную дигиталврайт, оставим за скобками.
т.е. ошибки в твоём ДНК настолько серьёзны, что не поддаются коррекции. мало того - ты лелеешь свою ущербность и не позволяешь окружающим сделать себя чуть лучше.
*писать код в ассемблере и забыть о Дуино ИДЕ.
Суть вопроса была в том, как с минимальным лагом по времени дернуть 6 ног порта D (2-7, не трогая 0 и1) и ногу 0 Порта B. стандартную дигиталврайт, оставим за скобками.
А я еще раз повторяю, что без привязки к конкретной задаче это вопрос типа:
- Интересуюсь, Симочка. Скоки стоит океянский пароход?
То есть вопрос бессмысленный и демагогический.
Для индикатора - достаточно стандартной функции. Для выгрузки данных куда-то вовне по параллельному интерфейсу нужно разложить исходное 7-ми битовое число на две маски 6 бит и 1 бит (И и сдвиг - для каждого - примерно 4 операции) и записать в порт каждую маску одним оператором (+ еще две операции). Это кратчайший способ. Про сдвиги важно помнить, что в АВР нет команды сдвига на несколько позиций за такт, то есть сдвиг на 4 это четыре такта.
И вот эти все такты имеет смысл считать при критичной работе с параллельным ЦАП при генерации сигнала сложной формы или для работы с памятью, при вычислениях, но тогда берут контроллер мощнее.
Суть вопроса была в том, как с минимальным лагом по времени дернуть 6 ног порта D (2-7, не трогая 0 и1) и ногу 0 Порта B. стандартную дигиталврайт, оставим за скобками.
wdrakula правильно написал, ну посиотрите еще здесь ( http://arduino.ru/forum/programmirovanie/proshu-pomoshchi-v-dorabotke-ko... )- может будет более понятно, там управление теми же пинами.
Спасибо.
".удар кувалдой стоит доллар, а за то что я знаю куда бить плюс 10к."
Спасибо.
".удар кувалдой стоит доллар, а за то что я знаю куда бить плюс 10к."
Кстати разбивка не самая удобная, на уно и нано разбивать нужно на PD4-7 и PB0-3, тогда проще формировать выводы.Сдвигов вообще нет.
Все еще непонятно? ;)
Спасибо.
".удар кувалдой стоит доллар, а за то что я знаю куда бить плюс 10к."
Для работы программиста кувалда доллар, инструкция по пользованию кувалдой 1к , курсы для тех кто не читает инструкции 10к и еще 50к за общение с клиентом, которого облизываешь как только можешь, а он скатина еще и бабки зажимает и его должны любить за то что он "работу дает".
wdrakula, я сказал спасибо ), но не написал что я вас услышал. Прошу пардону, занят очень был. Конец года, работы.. Понадеялся что поймёте ).
п.с. а про кувалду, это старый анекдот. там смысл был в том, что построили вентиляцию, но так и не могли понять почему вентиляционные короба входят в резонанс, пригласили спеца... тот ходил, смотрел, слушал. Попросил кувалду, ударил 1 раз и всё успокоилось. когда спросили сколько вам за работу, ответил 10к+1 и расшифровал, "удар кувалдой стоит доллар, а за то что я знаю куда бить плюс 10к."
Наврядли в мире есть хоть один человек, который не знает одну из версий даннного анекдота.
Только к чему он был?
) Ну есть всякие, думаю и такие что не знают. Просто люди живут в разных "мирах" и информационных потоках.
а был он к тому, что знание сила. В смысле, что как в любой науке, иногда человеку нужно по мелочи помочь, а потом и все "пазлы складываться" начинают. При желании обучаться, ясен факт. )
Ладно, это все уже не по теме.