- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
//Given a number, turns on those segments
//If number == 10, then turn off number
void lightNumber(int numberToDisplay) {
#define SEGMENT_ON LOW
#define SEGMENT_OFF HIGH
switch (numberToDisplay){
case 0:
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_ON);
digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_OFF);
break;
case 1:
digitalWrite(segA, SEGMENT_OFF);
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_OFF);
digitalWrite(segE, SEGMENT_OFF);
digitalWrite(segF, SEGMENT_OFF);
digitalWrite(segG, SEGMENT_OFF);
break;
; и т. д.
case 9:
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_OFF);
digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_ON);
break;
case 10:
digitalWrite(segA, SEGMENT_OFF);
digitalWrite(segB, SEGMENT_OFF);
digitalWrite(segC, SEGMENT_OFF);
digitalWrite(segD, SEGMENT_OFF);
digitalWrite(segE, SEGMENT_OFF);
digitalWrite(segF, SEGMENT_OFF);
digitalWrite(segG, SEGMENT_OFF);
break;
}
}
в ГК, инструкции записи в порт будут одна за одной (если segA/etc константы, и digitalWrite() просто mmio макро).
в твоем коде инструкции записи в порт будут перемешаны с сравнениями/переходами.
когда речь идёт о вводе/выводе, без реальной железки можно только спекулировать почему и как.
ЗЫ пример двух-недельной давности. в драйвере одной встроеной железки, в USB дровах, нашел msleep(10) в одной ветке обработчика прерывания. коммент: не трогайте этот слип, иначе WinXP железку не будет распознавать. теория vs. практика.
борманд там меня снизу просвятил.
А я жаловался что u-boot линухов код прёт без разбора. Лучше б спёрли.
P.S. Вот характеристики: http://arduino.cc/en/Products.Compare
на этой неделе читал сырцы busybox - просто офигительный контраст.
На тиньках и мегах, емнип, всего пару тактов задержка между записью в порт и переключением ноги. И никаких кешей и конвейеров на этом контроллере нету. Так что эти функции на порядок медленнее самого i/o...
Почему я и писал, что лучше бы подключить все сегменты на один порт, и переключать за одну запись.
P.S. Хотя для переключения светодиодов just for fun и так сойдёт. Да и никто не юзает ардуино для управления чем-то мало-мальски серьезным...
С Ардуиной проблема в том, что линии нумеруются последовательно. Откуда новичку знать, что к линиям 1-3 одновременный доступ возможен, а к 7-9 - нет? Впрочем, это типичная беда ардуины - скрытие особенностей железа.
Хех, так они там доабстрагировались до того, что вообще отобрали возможность переключать ноги не по одной за вызов?
Хотя прямой доступ должен был сохраниться, но он не правильный с точки зрения идеологии ардуины.
То есть, наверное, можно написать PORTB=50; но на какие digitalWire это выведено на самом деле - надо искать в документации.
С другой стороны, ардуина и позиционируется как "контроллеры для самых маленьких" и странно ожидать от нее большего, как делают фанатики.
Но некоторые люди используют только железную часть со всеми шильдиками и рюшечками. А код пишут в своей любимой среде - хоть cvavr, хоть Студия, хоть бейсик какой-нибудь. Довольно разумный подход, я считаю.