Тебя че, в детстве недолюбили? Ты дома родственникам своим хами.
Вам, батенька, к психиатру надо, с такими взрывами на ровном месте.
Не очень понимаю. Простите. Ну при сборке программы это возможно имеет смысл, когда компилятору требуется время на поиски и сопоставления. Но в итоговом машинном коде, уже загруженному в контроллер разве не четкие указание конкретного порта и бита?
З.Ы.Какую литературу на эту тему почитать можно?
Тебе туда же. Рядом посидишь.
Нет никаких поисков и сопоставлений. Компилятор выполняет программу построчно, как написано. Умнее программиста он себя не ставит
Нет, компилятор переставляет строки, когда это не меняет исхода.
Исходный код для digitalWrite().
Это нужно было сделать ДО того, как хамить на форуме.
Не будут хамить мне, не буду хамить и я.
Ну удачи! Не забывай.
С таким подходом вы здесь ничего не будете
На такую позицию ты пока права не имеешь. Это форум, пространство чисто информационное, следовательно ценность имеет только информация, знания. Никакого априорного уважения “как к человеку” ждать не советую.
Будь благодарен за то, что хотя бы не прогоняют ;).
Я не буду ни у кого спрашивать прав на вежливое отношение как минимум. В свою очередь, я кажется никому не нахамил, никого не оскорбил, общался на “Вы”. Просто задал вопрос с надеждой, что есть кто-то кто подскажет. Видимо ошибся. Вместо объяснений, мне посоветовали написать свой компилятор. Если на этом ресурсе принято самоутверждаться над новичками, то сразу можете мой аккаунт банить. Унижаться и терпеть скотское отношение в свой адрес я не буду. А читая темы в песочнице, я смотрю тут это модно. Второй раз задаю вопросы, второй раз меня высокомерно мордой в грязь тыкают.
З.Ы. За сим откланиваюсь. Больше к вашему комьюнити у меня вопросов нет.
Молодец!
ЗЫ: Читай больше книг, а не конспекты с роликов делай. Книги развивают память, мышление и воображение. Последнее (лично мне) очень сильно пригождалось ранее и сейчас в ардуино-тематике. Пока.
я предлагаю, по аналогии с “вопрос решен”, дать возможность уходящему с форума обвинить кого-то. А то не ясно кому чайничек на клаве рисовать, за “сбитого” новичка?
Легче было самому посмотреть ArduinoCore-avr/cores/arduino/wiring_digital.c at master · arduino/ArduinoCore-avr · GitHub
Для начала Кернигана/Ритчи. Потом дэйташит. Ну а потом исходники из комплекта ArduinoIde.
void digitalWrite(uint8_t pin, uint8_t val)
{
uint8_t timer = digitalPinToTimer(pin);
uint8_t bit = digitalPinToBitMask(pin);
uint8_t port = digitalPinToPort(pin);
volatile uint8_t *out;
if (port == NOT_A_PIN) return;
// If the pin that support PWM output, we need to turn it off
// before doing a digital write.
if (timer != NOT_ON_TIMER) turnOffPWM(timer);
out = portOutputRegister(port);
uint8_t oldSREG = SREG;
cli();
if (val == LOW) {
*out &= ~bit;
} else {
*out |= bit;
}
SREG = oldSREG;
}
и обратите внимание, что из digitalWrite вызывается еще с полдюжины других функций.
По сути дела процитированной Вами команде соответствует одна единственная 20-я строчка исходника. Вы всерьез считаете, что остальные не нужны? Ведь значения (PORT)N, m и n еще надо вычислить, а также учесть, что именно мы собираемся выставлять (0 или 1), а также проверить входные значения на допустимый диапазон (а также на то, не используется ли этот пин в данный момент для ШИМ).
Здравствуйте!
Может кому пригодится, но для отлавливания переднего фронта я пришел к такому алгоритму:
bool finit; задание на инициализацию ловушки
bool trigger;
bool flag;
bool w0; // признак того, что надо зафиксировать низкий (0) // уровень trigger
bool w1; // признак того, что надо зафиксировать высокий
// (1) уровень trigger
int st; // счетчик;
unsigned long time1;
void setup()
{
time1=0;
flag=0;
trigger=0;
st=0;
w0=0;
w1=0;
finit=0;
}
woid loop()
{
//...
//...
//...
// здесь работает мультивибратор
if (millis()>=time1)
{
time1=millis()+1000;
trigger=!trigger;
}
//...
//...
//...
// крутимся в loop, никого не трогаем
//...
//...
//...
// и вдруг надо запустить ловушку
// при каком-то событии finit=1;
if (finit)
{
flag=1; // инициировали ловушку
w1=1; // дали сигнал ловушке ждать передний фронт триггера
w0=0; // запретили ловушке реагировать на задний фронт
finit=0;
}
// ловушка фронта триггера
// и выдача трех импульсов по переднему фронту
if (flag)
{
if (trigger)
{
if (w1)
{
// передний фронт пойман
// отсюда идет ТОЛЬКО ОДНА команда подать сигнал для
// отправки RAW-массива на ИК-диод сплит-системы
w0=1;
w1=0;
d13=1; // мигаем родным диодом
st++;
}
}
else
{
if (w0)
{
w0=0;
w1=1;
d13=0; // мигаем родным диодом
// а дальше при появлении заднего фронта после третьего // переднего, ловушку выключаем
if (st>=3) flag=0;
}
}
}
}
это не фронт
Для определения фронта нужно прерывание, или capture mode в таймере.
Ещё можно while использовать, ожидая изменения…
while мне не подходит, так как программа помимо этого должна выполнять еще и другие действия.
да и с прерываниями мне как то жутко пока разбираться, так как надо сначала отладить мой проект, а потом совершенствовать.