Ответить
  • Land Клуб Самоделкиных
    офлайн
    Land Клуб Самоделкиных

    25591

    23 года на сайте
    пользователь #1470

    Профиль
    Написать сообщение

    25591
    # 5 сентября 2022 20:24
    zverjuga:

    если IF работает с байтом (то есть чаром), то он работает нормально и условия работают нормально. а вот если в IF использовать short или int, то IF перестает работать. я если честно, нигде в доках такого не встречал

    лень анализировать код, но вполне возможно, что значение в int уходит в отрицательную область. А своими сдвигами в char вы скорее всего просто переносите значения в положительную область значений. mr_need_ticks = mr_need_ticks - 1 -- если mr_need_ticks перед этим оператором было равно нулю, то оно станет равно -1. И так далее.

    Согласно теории струн Вселенная имеет дополнительные измерения, свернутые в пространство Калаби-Яу.
  • zverjuga Senior Member
    офлайн
    zverjuga Senior Member

    5061

    13 лет на сайте
    пользователь #346019

    Профиль
    Написать сообщение

    5061
    # 5 сентября 2022 21:24 Редактировалось zverjuga, 1 раз.

    если бы int уходил в отрицательную область, то это было бы слишком просто. а кот вы анализировать не можете, потому как я его и не предоставлял. для экспериментов я вообще закомменчивал рабочий кот и оставлял только самый минимум, чтобы убедиться в том, что IF не работает с интами. даже в примерах в интернетах я не нашел ни одного рабочего примера, где бы использовался IF-int в прерывании таймера, везде только char.

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

    проклятый антисутенерский закон!
  • RepoMan Senior Member
    офлайн
    RepoMan Senior Member

    948

    14 лет на сайте
    пользователь #295041

    Профиль
    Написать сообщение

    948
    # 5 сентября 2022 21:31
    zverjuga:

    чтобы убедиться в том, что IF не работает с интами. даже в примерах в интернетах я не нашел ни одного рабочего примера, где бы использовался IF-int в прерывании таймера, везде только char.

    не позорься

  • Шершень Клуб Самоделкиных
    офлайн
    Шершень Клуб Самоделкиных

    695

    11 лет на сайте
    пользователь #815596

    Профиль
    Написать сообщение

    695
    # 5 сентября 2022 22:21
    zverjuga:

    volatile int mr_need_ticks = 0;
    ISR(TIM0_COMPA_vect)
    {
    PORTB ^= _BV(PB3);

    mr_need_ticks = mr_need_ticks - 1;
    if (mr_need_ticks == 1) {
    PORTB ^= (1 << PB0);
    }
    else if (mr_need_ticks == 0) {
    PORTB ^= (1 << PB0);
    mr_need_ticks = 1000000/62/6/2;
    }
    }

    Что-то я не понял: инициализируете переменную нулём и при первом же входе в прерывание сразу отнимаете единицу?
    Как я понял счётчик должен быть 1344?
    А так оно в первый проход ~ 65к раз должно войти пока переменная до истинности условия докрутится и на 1344 сбросится?
    Это так и задумано?

  • zverjuga Senior Member
    офлайн
    zverjuga Senior Member

    5061

    13 лет на сайте
    пользователь #346019

    Профиль
    Написать сообщение

    5061
    # 6 сентября 2022 01:46 Редактировалось zverjuga, 5 раз(а).
    Шершень:

    Что-то я не понял: инициализируете переменную нулём и при первом же входе в прерывание сразу отнимаете единицу?

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

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

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

    так как счетчики интовые, то тут я и столкнулся с проблемой IF, который не работают с int, но только с char. для меня эта проблема оказалась настолько неочевидной и неожиданной, что я на поиск ее потратил двое выходных. возможно, она решается и без разложения int на 4 char, например, присваиванием префикса к константе

    if (my_int_volatile_variable == 0L) {}

    но я это еще не проверял. все таки часов в сутках не хватает.

    проклятый антисутенерский закон!
  • Land Клуб Самоделкиных
    офлайн
    Land Клуб Самоделкиных

    25591

    23 года на сайте
    пользователь #1470

    Профиль
    Написать сообщение

    25591
    # 6 сентября 2022 10:09 Редактировалось Land, 1 раз.
    Шершень:

    Что-то я не понял: инициализируете переменную нулём и при первом же входе в прерывание сразу отнимаете единицу?

    не тратьте время, оно само все знает. у него if не работает с int и вы ничего не докажете. Плюс у него какой-то кот еще используется, а вы знаете породу этого кота?

    Согласно теории струн Вселенная имеет дополнительные измерения, свернутые в пространство Калаби-Яу.
  • Land Клуб Самоделкиных
    офлайн
    Land Клуб Самоделкиных

    25591

    23 года на сайте
    пользователь #1470

    Профиль
    Написать сообщение

    25591
    # 7 сентября 2022 10:56

    просто, чтоб не быть голословным, кусок с if и int

    if(flag_Mode4){azimutstep = azimutstep - delta;
    if(digitalRead(dir_pin))targetstep_left=azimutstep-set_angle * gear_ratio * 16;
    else targetstep_right=azimutstep+set_angle * gear_ratio * 16;
    if (targetstep_right > max_angle)
    targetstep_right = max_angle; else;
    if (targetstep_left < 0)
    targetstep_left = 0; else;
    azimut_NULL = _degress; // для сброса дельты
    }

    int targetstep = 0;
    int delta_targetstep = 0;
    int targetstep_left = 0;
    int targetstep_right = 0;
    int nullstep = angle2 * gear_ratio * 16; //коррекция пропуска шага

    у меня видимо какой-то не правильный С компилятор :lol:

    Согласно теории струн Вселенная имеет дополнительные измерения, свернутые в пространство Калаби-Яу.
  • SIO Паяльник & Отвертка TEAM
    офлайн
    SIO Паяльник & Отвертка TEAM

    4106

    18 лет на сайте
    пользователь #68847

    Профиль
    Написать сообщение

    4106
    # 9 сентября 2022 12:18

    zverjuga, когда у меня if не работает, я кидаю значение переменных в уарт в каждой строчке с задержкой 1с и просматриваю выполнение программы, там сразу видно какое значение и почему условие не срабатывает. В паскале есть значение для переменной Бит, вот его для условий да или нет я и использую, а все что больше бита вечно принимает значение отличное от 0 и 1 и все перестает работать :molotok:

    Паяльник & Отвертка TEAM, MikroPascal for AVR http://forum.onliner.by/viewtopic.php?t=637523
  • ВиталийXXL Senior Member
    офлайн
    ВиталийXXL Senior Member

    9985

    22 года на сайте
    пользователь #4150

    Профиль
    Написать сообщение

    9985
    # 12 сентября 2022 13:10 Редактировалось ВиталийXXL, 1 раз.

    Не совсем про Arduino вопросик :
    Есть контроллер , например PIC16F1825 .
    На порт RA3 - выведена кнопка . По умолчанию опрашиваю нажатие - контакт на землю . Всё работает как надо .
    Теперь задача изменилась - нормальное состояние этой кнопки - НАЖАТО (то есть - контакт на землю ) .
    и опрашивать нужно именно разомкнутое состояние ( НЕ ЗЕМЛЯ ) .
    По факту в этом состоянии - порт никуда не соединен и висит в воздухе . Подтяжку через 10К на +5 делал . Не помогает .....

    Пишем в среде MPLAB на Си :)

    раба кормят бесплатно, а свободному самому за всё платить приходится...
  • Land Клуб Самоделкиных
    офлайн
    Land Клуб Самоделкиных

    25591

    23 года на сайте
    пользователь #1470

    Профиль
    Написать сообщение

    25591
    # 12 сентября 2022 14:00
    ВиталийXXL:

    Подтяжку через 10К на +5 делал . Не помогает .....

    а как порт и нога сконфигурированы? это второе. А первое, как там порт устроен? Может уже нога того, при долговременном замыкании на землю, сдохла?

    Согласно теории струн Вселенная имеет дополнительные измерения, свернутые в пространство Калаби-Яу.
  • ВиталийXXL Senior Member
    офлайн
    ВиталийXXL Senior Member

    9985

    22 года на сайте
    пользователь #4150

    Профиль
    Написать сообщение

    9985
    # 12 сентября 2022 15:51

    #define Button_pressed PORTAbits.RA3 // PORT A (RA3 )

    в Main() :
    TRISA = 0b11111111; // button detect RA3
    latcha = 0;
    PORTA = latcha;

    LED_ON();

    while (1) {
    if (Button_pressed != 0 ) {
    // Кратковременно выключаем диод , чтоб видеть сработку
    LED_OFF();
    __delay_ms(1000);
    LED_ON();

    }
    else {

    // Пустой блок
    }

    }

    Это та нога , у кого надо , нога .
    Всё норм . Живёт .

    раба кормят бесплатно, а свободному самому за всё платить приходится...
  • SIO Паяльник & Отвертка TEAM
    офлайн
    SIO Паяльник & Отвертка TEAM

    4106

    18 лет на сайте
    пользователь #68847

    Профиль
    Написать сообщение

    4106
    # 12 сентября 2022 19:31
    ВиталийXXL:

    PORTA = latcha;

    Что делает эта строчка

    Паяльник & Отвертка TEAM, MikroPascal for AVR http://forum.onliner.by/viewtopic.php?t=637523
  • Land Клуб Самоделкиных
    офлайн
    Land Клуб Самоделкиных

    25591

    23 года на сайте
    пользователь #1470

    Профиль
    Написать сообщение

    25591
    # 12 сентября 2022 20:41 Редактировалось Land, 1 раз.
    SIO:

    ВиталийXXL:

    PORTA = latcha;

    Что делает эта строчка

    в пиках есть такое извращение. Сначала во внутренний регистр LATCH записать значение, а потом из него -- в порт. Типа в порте не стразу значение устанавливается, а если вам надо его тут же знать -- вот оно, в LATCH лежит. Ну, и соответственно, когда из порта пытаемся значение ноги прочитать, там всегда должен быть ноль. Мы ж его туда записали.

    Согласно теории струн Вселенная имеет дополнительные измерения, свернутые в пространство Калаби-Яу.
  • SIO Паяльник & Отвертка TEAM
    офлайн
    SIO Паяльник & Отвертка TEAM

    4106

    18 лет на сайте
    пользователь #68847

    Профиль
    Написать сообщение

    4106
    # 13 сентября 2022 10:16

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

    Паяльник & Отвертка TEAM, MikroPascal for AVR http://forum.onliner.by/viewtopic.php?t=637523
  • hellen_1989 Member
    офлайн
    hellen_1989 Member

    231

    13 лет на сайте
    пользователь #351513

    Профиль
    Написать сообщение

    231
    # 12 декабря 2022 09:37

    Добрый день.
    Нужно изготовить устройство, которое передавало бы данные гироскопа на VR-шлем, заменяя стандартный способ передвижения с помощью джойстика, который входит в комплект VR-шлема. Т.е передвижение происходит с помощью наклона гироскопа. Если кто-либо сможет помочь, прошу ответить здесь или написать в ЛС для обсуждения условий. Спасибо.

  • pasha_1977 Senior Member
    офлайн
    pasha_1977 Senior Member

    2055

    16 лет на сайте
    пользователь #122893

    Профиль
    Написать сообщение

    2055
    # 29 декабря 2022 16:50

    подскажите в чем может быть ошибка:
    void Read_DHT11()
    {
    int chk = DHT.read11(DHT_PIN);
    }

    выдает ошибку:
    exit status 1
    expected primary-expression before '.' token

  • SIO Паяльник & Отвертка TEAM
    офлайн
    SIO Паяльник & Отвертка TEAM

    4106

    18 лет на сайте
    пользователь #68847

    Профиль
    Написать сообщение

    4106
    # 29 декабря 2022 19:11
    pasha_1977:

    подскажите в чем может быть ошибка:

    Вместо DHT_PIN должен быть номер пина куда подключен датчик.

    Паяльник & Отвертка TEAM, MikroPascal for AVR http://forum.onliner.by/viewtopic.php?t=637523
  • Andy16 Neophyte Poster
    офлайн
    Andy16 Neophyte Poster

    26

    6 лет на сайте
    пользователь #2380416

    Профиль
    Написать сообщение

    26
    # 29 декабря 2022 19:51
    pasha_1977:

    в чем может быть ошибка:

    Я этим модулем не пользовался, но, может, надо #include <dht.h>?
    И dht DHT;

  • pasha_1977 Senior Member
    офлайн
    pasha_1977 Senior Member

    2055

    16 лет на сайте
    пользователь #122893

    Профиль
    Написать сообщение

    2055
    # 30 декабря 2022 09:28

    Andy16,
    это все в скетче есть выше по тексту, только
    dht DHT
    дает ошибку, поэтому сделал
    DHT dht(DHT_PIN, DHTTYPE)

    SIO,
    хотя у меня есть строка
    #define DHT_PIN 7
    поменял
    после этого получил ошибку
    expected primary-expression before '.' token

  • RepoMan Senior Member
    офлайн
    RepoMan Senior Member

    948

    14 лет на сайте
    пользователь #295041

    Профиль
    Написать сообщение

    948
    # 30 декабря 2022 10:00

    pasha_1977,
    ну наверное потому что к объекту обращаться надо, а не к классу
    int chk = dht.read11(DHT_PIN);