Mega2560 чтение одного байта из eeprom с адреса > 255

Тема в разделе "Arduino & Shields", создана пользователем Vovka, 8 ноя 2020.

Метки:
  1. parovoZZ

    parovoZZ Гуру

    что он начал объяснять? Он только вопросы задаёт. Про прерывания рассказывать не буду. Оффтоп.
     
  2. parovoZZ

    parovoZZ Гуру

    и что же я должен проверить?
     
  3. akl

    akl Гуру

    наверно SREG надо сохранить перед запретом прерывания. а потом не разрешить прерывания, а вернуть сохраненный SREG.
    в ардуине так делается везде где на время запрещают прерывания.
    А ваще я делал почти такие же функции для еепром, только без запрета прерываний. А нужен ли ваще этот запрет в данном случае?
     
  4. akl

    akl Гуру

    а если по теме - я солидаризируюсь с ТС в непонимании того почему эти функции (вернее объявления функций) сделаны именно так, а не как-то иначе. Я так понимаю это даже и не функции, а что-то типа переходов в ассемблерные штуки, но почему там указатели на адрес ячейки разного размера. или это указатель на что-то другое?
     
  5. parovoZZ

    parovoZZ Гуру

    можно поинтересоваться - зачем это делать в данном случае?

    Разрешены ли прерывания или нет, определяет бит I в регистре SREG. Можно оперировать им, а можно воспользоваться функциями sei() и cli(). Если описанные мной функции вызываются из обработчика прерывания, в которых I бит снимается и устанавливается аппаратно, то sei() и cli() необходимо исключить. cli() запретит и без того запрещённое, что не страшно, а sei() может привести к вложенности прерываний, что не рекомендуется делать без контроля стека.

    это вызов функций из объектного файла, исходники которого не разглашаются.
     
  6. Vovka

    Vovka Гик

    В Ардуине такое возможно???
    Попробую объяснить на жизненном примере...
    К примеру ты снял мойку на кухне. Краны (торчат из стены) закрыты, но вода в них есть
    Приходит твоя жена на кухню и:
    Код (C++):
    //... Запись в EEPROM
    void EEPROM_write(uint16_t ucAddress, uint8_t ucData)
    {
        while(EECR & (1<<EEPE));      //.. ЖДЕТ КОГДА ТЫ УЙДЕШЬ С КУХНИ (надеюсь помнишь, что бывает когда долго висим)  Ждем завершения
    предыдущей операции с памятью

    ТЫ УШЕЛ С КУХНИ
        cli();  - ОНА ЗАКРЫВАЕТ ЗАКРЫТЫЕ КРАНЫ
     
        EECR = (0<<EEPM1)|(0<<EEPM0);            //.. Установим режим работы - стирание и запись за одну операцию длительностью 3.4 мс (Atomic Operation)
     
        EEAR = ucAddress;                //.. Запишем адрес ячейки и данные в регистры
        EEDR = ucData;

        EECR |= (1<<EEMPE);                //.. Установим мастер бит EEMPE
     
        EECR |= (1<<EEPE);                //.. и произведём запись в EEPROM

        sei();   - ОНА ОТКРЫВАЕТ ЗАКРЫТЫЕ КРАНЫ

    ДОВОЛЬНАЯ УХОДИТ....
    }
     
  7. akl

    akl Гуру

    ну типа sei() разрешает прерывания. а вдруг до этого они были запрещены чем-то другим и должны остаться запрещенными? если вместо sei() возвращать сохраненное значение SREG, то все станет как прежде и никаких проблем. те кто ардуино делали всеж не совсем дураки
     
  8. akl

    akl Гуру

    пусть так. Но почему указатель на адрес указывает то на один байт, то на два, а то и на все четыре? доколе??!!1
     
  9. SergeiL

    SergeiL Оракул Модератор

    Есть значение по указателю.
    Сколько там должно быть байт? 1, 2, 4 8? Сколько считать? Как инкрементировать указатель?
    Указатель на байт - указывает на 1 байт, считывается 1 байт, инкрементируется на 1 байт.
    Указатель на 2 байта - указывает на два байта, считываются 2 байта из памяти по этому указателю. И инкрементируется данный указатель не на байт, а сразу на два.
    Ну и так далее. 4, 8 ... ;)
     
    parovoZZ нравится это.
  10. akl

    akl Гуру

    дак адрес яичкаячейки еепром то всегда двухбайтовый. или нет?

    или по этому размеру там функция определяет на сколько байтов сдвинуть указатель? То есть там передается указатель на адрес, который всегда два байта, но одновременно через размер того на что указывает указатель передается и объем данных. сложно
     
  11. parovoZZ

    parovoZZ Гуру

    я вроде написал абсолютно по-русски:
    у меня таких ситуаций не бывает. Я полностью контролирую выполнение кода. А попасть в эту функцию из обработчика прерывания невозможно - я её оттуда не вызываю.

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

    И что бывает? Я прекрасно знаю, что на запись уходит 3.3 мс. А если запись делается первый раз, то на эту проверку уходит 2-3 такта.
     
  12. parovoZZ

    parovoZZ Гуру

    всегда. Регистр под адрес ячейки EEAR 2-х байтный. Но на тех МК, где адресуется не более 256 байт, старший байт не пишется - он всегда 0 и зарезервирован.
     
  13. SergeiL

    SergeiL Оракул Модератор

    Не, даже указатель на указатель, на float, не заставят меня перейти на АСМ после Си. ;)
     
  14. Asper Daffy

    Asper Daffy Иксперд

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

    Хотя, если главный аргумент ...
    То вперёд и спеснЯми! Каждый сам себе злобный Буратино.
     
    Andrey12 нравится это.
  15. Asper Daffy

    Asper Daffy Иксперд

    Всегда? Ой ...
     
    Andrey12 нравится это.
  16. parovoZZ

    parovoZZ Гуру

    Адресуется всегда ОДИН байт. В любых системах с любой разрядностью. Но в системах, где разрядность шины данных более одного байта, за раз можно передать столько же байт. Для этого достаточно указать адрес первого байта и выбрать соответствующую команду процессора. Разумеется, что в таких системах много нюансов, но в общем виде оно выглядит примерно так.
     
  17. parovoZZ

    parovoZZ Гуру

    Блин...где там-то?
     
  18. Nekto_nikto

    Nekto_nikto Гик

    И сегментация есть и страничная адресация, а вот указатели там от разрядности процессора зависят, и именно поэтому на 32 битную систему можно поставить гораздо меньше RAM, чем на 64 битную, изза максимального указателя в физической памяти, но в то же время есть far и near переходы в коде, видимо вы об этом хотели написать.
     
  19. Nekto_nikto

    Nekto_nikto Гик

    Для передачи больших блоков данных система использует DMA механизм у которого свой контроллер, призванный разгрузить процессор, при пересылке данных.
     
  20. SergeiL

    SergeiL Оракул Модератор

    Не нужно путать физическое обращение к памяти и разрядность указателя Си.
    Не всегда обращение осуществляется по абсолютному адресу, указатель может содержать относительный адрес.
     
    parovoZZ нравится это.