Перейти к содержанию
    

VladimirYU

Свой
  • Постов

    426
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные VladimirYU


  1. хотелось бы в идеале, чтобы адреса распределял ведущий контроллер. Хотя я не представляю, как это возможно.

    Это возможно при поочередном подключению к сети ведомых устройств, по умолчанию настроенных на default-адрес, например 127. Мастер опрашивает этот адрес, если есть ответ, то назначает специальной инструкцией устройству адрес, которого в сети еще нет (например по возрастанию, запоминая первый свободный адрес в своем ЕЕПРОМ). Устройство принимает этот адрес и запоминает его также в ЕЕПРОМ и далее откликается только на него. Способ не идеальный но на практике используется.

  2. Здравствуйте.

    Есть у меня несколько atmega128, обьединённых через RS-485 интерфейс, построенный на UARTе. Одна из них ведущая, все остальные - ведомые.

    Подскажите пожалуйста, какие есть методы распределения адресов ведомых устройств на такой шине?

    В данный момент адреса каждой из ведомых atmegа128 задаются джамперами на плате, подключенными к порту.

    А что не устраивает а вашем способе, или чего хотелось бы?

  3. Спасибо за ответы и просмотры. Решение найдено, пока полет нормальный :)

    Все таки поделитесь с народом, в чем была проблема и как разрешилась. Получется, что топик затеяли и все?

  4. Нет, не на плате расширения. С питанием нормально - ровно 5 вольт подаеться (мерял мультиметром). Про результаты программирования напишу после обеда.

    Проверьте доходит ли ресет от прграмматора до ноги МК.

  5. Добрый день... Начал пробовать программировать на С++, переделываю старый поект написанный на С и сталкнулся с проблемой, у классов обьявленных как глобальные не вызываються конструкторы. Есть предположение что это фишка IAR. В чём может быть проблема? Где можно почитать про использование C++ и в частности ООП для программирования контроллеров? Заранее благодарен.

    Нет. примерчик покажите.

  6. Да я так и сделал. А теперь ищу, что именно подойдет, чтобы "не дорого и со вкусом". :)

    Может кто подскажет, что лучше выбрать?

     

    Дорогие - это по 15-20$

    А хотелось бы за 8-10$.

    Очень уж ограничен финансово!

    Я имею ввиду амплитуду.

     

    Выбрал АЦП ADS8320EB Техаса. Стоит 10$. Так как всетаки по SPI с ним общаться?

    Точнее как правильно настроить SPI контроллера МЕГА16. Программирую :biggrin: в CVAVR.

     

    Внимательно посмотрите на временные диаграммы АЦП (он Слэйвом у вас будет) (фазировка SCK, порядок передачи битов, ...) не забудьте про SS ( CS не знаю как он в Вашем АЦП называется) и сравните их и Fig. 67, 68 из DS на мегу 16. Выбирите нужную, а далее раберетесь как правильно запрограммировать SPI меги.

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

  7. Нужно мерять синусоиду амплитудой до 50 мВ(буду усиливать до 2.5В). Точность - 0,01мВ (т.е. после усиления - 0,5мВ). Частота сигнала 10 кГц. Подсчитал, что нужно 13 разрядов.

    Что вы вкладываете в слова "мерять синусоиду"? Какой(ие) параметр(ы)?

  8. Как правильно сделать?

    Имеется следующий код

    class TMyclass

    {

     

    ......

    public:

     

    .......

    int foo; // член класса указатель, но который хочу пердать в функцию

    ........

    void Func ( int* ptr = &foo);

    };

     

    Error[Pe245]: a nonstatic member reference must be relative to a specific object

    Хочется, чобы Func получала указатель на foo,

    как значение параметра по умолчанию.

  9. Вот что Atmel думает об этом:

    software reset

    Я думаю также будет полезно прочитать FAQ#30 в avr-libc-user-manual:

    How do I perform a software reset of the AVR?

     

    Анатолий.

     

    +1000.

    Пора, уже понять и "принять к исполнению", тот факт, что у AVR нет иного "правильного" программного сброса, кроме как с использованием WDT. Все остальное от лукавого.

  10. регистр PIN в студии служит для имитации ВНЕШНЕГО уровня, т.е. то, что вы там зададите - то и будет. автоматом с "подтяжек" на PIN единичка не приходит.

     

    это не баг, а фича - к ней просто надо привыкнуть :)

     

    В симуляторе SPY от IAR аналогично.

  11. С одной стороны ARM (SPI Master), с другой ATMega8535L. (Тактируется внутренним RC - 8Мгц)

    Частота SPI - 1МГц.

     

     

    /* Wait for reception complete */

    while(!(SPSR & (1<<SPIF))) {}; // <<< --- Такое ощущение, что здесь }[/code]

     

    Что я делаю не так ? Есть какие то идеи ?

     

    У меня один раз было на двух мегах 128-ых из одной партии:

    После выхода из while у SLAVE в SPDR проскакивала всякая хрень, ошибка была в бите который мастер выталкивал последним. Посмотрел осциллом передачу от Мастера и ох...ел, 7 битов вытакивались равномероно с частотой клоков, как положено, а последний бит выталкивался (и последний 8-ой клок) после паузы примерно на время передачи байта, а следующий байт сообщения от Мастера шел сразу за последним битом. У слэйва крыша съезжала. Обошел следующим образом: вставил задержку у мастера между посылками байтов - помогло. Потом в следующей версии ПО передачу от мастера сделал по прераванию от SPIF и подобной прооблемы не было. В последующих приборах проверял обе версии ПО для Мастера, больше этот косяк не всплывал. В итоге списал все на глюк в конкретной меге.

  12. ..... язык С скучный, хочу вот паскаль освоить...

    Спасибо.

    Язык С объективно лучше учитывает суть и особенности программировани встроенных систем,

    ПАСКАЛЬ же язык изучения основ программирования для школьников и начинающих студентов (корни его именно оттуда).

    ИМХО, конечно, Вы найдете и освоите компилятор ПАСКАЛя, но это будет потерянное время и усилия на освоение инструмента, предназначенного изначально для других задач.

  13. Может где-то отвалилась volatile-ность __io_memory

    Такой глюк был в версии IAR3.20C, регистры I/O оптимизатор глазом не моргнув кэшировал. Но потом в начиная с 3.20D вроде его исправили.

    Попробую просто с обычной переменной.

    9 int main()

    \ main:

    10 {

    11

    12 volatile unsigned char vol_var;

    13 vol_var;

    14 return 0;

    \ 00000000 E000 LDI R16, 0

    \ 00000002 E010 LDI R17, 0

    \ 00000004 9508 RET

    15 }

    То же самое

     

    9 int main()

    \ main:

    10 {

    \ 00000000 9721 SBIW R29:R28, 1

    11

    12 volatile unsigned char vol_var;

    13 unsigned char novol_var = vol_var;

    \ 00000002 8108 LD R16, Y

    \ 00000004 2F20 MOV R18, R16

    14 return 0;

    \ 00000006 E000 LDI R16, 0

    \ 00000008 E010 LDI R17, 0

    \ 0000000A 9621 ADIW R29:R28, 1

    \ 0000000C 9508 RET

    15 }

  14. Они там описаны как __io union, никаких volatile в помине нет.

     

    __io Controls the storage of data objects in I/O memory space, alternatively data memory

    space.

    The __io memory attribute implies that objects are __no_init and volatile, and allows

    objects to be accessed by use of the special I/O instructions in the AVR microcontroller.

    Your application may access the AVR I/O system by using the memory-mapped internal

    special function registers (SFRs). To access the AVR I/O system efficiently, the __io

    memory attribute should be included in the code.

    Address range Max object size Pointer size Memory space

    0-0x3F 4 bytes (32 bits) Pointers not allowed I/O

    0x60-0xFF 4 bytes (32 bits) Pointers not allowed Data

    Table 64: I/O address ranges

  15. Они там описаны как __io union, никаких volatile в помине нет.

     

    Разочарую Вас. Сорри, но не умею выделять в окошке кодов:

    __io Controls the storage of data objects in I/O memory space, alternatively data memory

    space.

    The __io memory attribute implies that objects are __no_init and volatile, and allows

    objects to be accessed by use of the special I/O instructions in the AVR microcontroller.

    Your application may access the AVR I/O system by using the memory-mapped internal

    special function registers (SFRs). To access the AVR I/O system efficiently, the __io

    memory attribute should be included in the code.

    Address range Max object size Pointer size Memory space

    0-0x3F 4 bytes (32 bits) Pointers not allowed I/O

    0x60-0xFF 4 bytes (32 bits) Pointers not allowed Data

    Table 64: I/O address ranges

  16. Это вообще просто "C" - начиная с K&R. Совершенно переносимо.

    Только если выражение после ? не пустое.

    Therefore, the expression

     

    x ? : y

     

    has the value of x if that is nonzero; otherwise, the value of y.

     

    This example is perfectly equivalent to

     

    x ? x : y

    Евгений абсолютно прав.

  17. Листинг посмотреть можно?

     

    Если "тупо"

         10          {
         11            char tmp = SPCR; 
       \   00000000   B10D               [b]IN      R16, 0x0D[/b]
       \   00000002   2F20               MOV     R18, R16
         12            
         13            return; 
       \   00000004   E000               LDI     R16, 0
       \   00000006   E010               LDI     R17, 0
       \   00000008   9508               RET
       \   0000000A                      REQUIRE _A_SPCR
         14          }

     

    Если с "изыском"

          9          int main()
       \                     main:
         10          {
         11            SPCR; 
         12            
         13            return; 
       \   00000000   E000               LDI     R16, 0
       \   00000002   E010               LDI     R17, 0
       \   00000004   9508               RET
         14          }

     

     

     

    Листинг посмотреть можно?

    Еще один из обсуждавшихся вариантов:

          9          int main()
       \                     main:
         10          {
         11            [b](void)SPCR;[/b] 
         12            
         13            return; 
       \   00000000   E000               LDI     R16, 0
       \   00000002   E010               LDI     R17, 0
       \   00000004   9508               RET
         14          }

    То же самое. Чтения нет.

  18. Значит SPSR не volatile, или используется старый плюсовый IAR. По-моему, дискуссия пошла на второй круг.

    SPSR это регистр статуса SPI, все I/O регистры описаны в .h как VOLATILE

    компилятор отнюдь не старый, проверил на IAR AVR 5.10 то же самое.

    Может быть из-за моей неграмотности, но я так и не понял это все же баг

    компилятора, или если данная форма отдана стандартом на реализацию, тогда фитча.

×
×
  • Создать...