ATMega162 UART

Тема в разделе "Микроконтроллеры AVR", создана пользователем Kosss, 23 сен 2016.

  1. AlexU

    AlexU Гуру

    Фишка в том, что Arduino IDE всегда использует "дудку" для прошивки плат. Только по умолчанию используется программатор типа 'arduino', но среда позволяет шить и с помощью других типов программаторов. Поэтому, если кому-то нравиться использовать внешние программаторы, то пожалуйста...
    Не знаю как в версии 1.5.5, но в последних версиях (1.6.11 и 1.6.12) есть команда "Скетч" -> "Экспорт бинарного файла". Данная команда сохранит два *.hex файла: *.standart.hex -- содержит только скетч и *.with_bootloader.standard.hex -- содержит скетч и бутлоадер. Первый шьётся программатором 'arduino' (этот программатор использует бутлоадер МК), второй любым другим. Первый так же можно прошить любым другим, но МК останется без бутлоадера.
    Навскидку:
    Код (C++):

        uint16_t regUBRR = UBRRH;
        regUBRR <<= 8;
        regUBRR |= UBRRL;
        serial.print("UBRR = 0x");
        serial.println(regUBRR, 16);
        serial.print("F_CPU = ");
        serial.println(F_CPU);
     
    последовательный порт пусть и криво, но всё-таки работает, поэтому может выдать отладочную информацию.
     
    Airbus нравится это.
  2. Kosss

    Kosss Нерд

    upload_2016-9-26_9-28-39.png

    Правда у 162 регистры иначе называются. UBRR0H и UBRR1H Зачем? или Почему так?
     
  3. ostrov

    ostrov Гуру

    В один все параметры не влезли.
     
  4. Airbus

    Airbus Радиохулиган Модератор

    Всё равно не понял-ну да ладно Человек на меня обиделся (Малышеву выложил) а мне и вправду интересно было. Наверное память на бутлоадере экономит. Сейчас тоже сделал показометр на LCD. Писать на нормальном Си не стал потому что влом плату разводить а в Wiring проще просто нацепил "нужные" выводы к "нужным" и вуаля! У Меги 8 под это дело памяти немеренно.....Вдул скетч через USB откатал. На этом вроде и всё..Прибор работает. Причём прошивку можно на ходу модифицировать особо не парясь опять же через USB. Но вот понадобилось на Форуме выложить НЕХ чтоб народ смог "голую" Мегу прошить пятью проводками например не вдаваясь в дебри Ардуино. Но конечно через Бут шить удобнее да и шанс накосячить меньше.
    Всё нашёл папку!Спасибо Вам огромное!Искал долго и мучительно но нашёл.НЕХ лежат в папке C:\Documents and Settings\Alexx\Local Settings\Temp\build4084106313691437242.tmp
     
  5. ostrov

    ostrov Гуру

    К сожалению, они лежат каждый раз в разных папках. Я пользуюсь поиском, если нужен hex, далеко не все ядра его выкладывают в папку проекта.
     
  6. AlexU

    AlexU Гуру

    Потому что в контроллере два интерфейса USART, а я это не учёл -- код брал из оф.документации, а в ней похоже ошибка. Правильней будет так:
    Код (C++):

        uint16_t regUBRR = UBRR0H; // используется USART_0, для USART_1 -- UBRR1H
        regUBRR <<= 8;
        regUBRR |= UBRR0L;  // используется USART_0, для USART_1 -- UBRR1L
        serial.print("UBRR = 0x");
        serial.println(regUBRR, 16);
        serial.print("F_CPU = ");
        serial.println(F_CPU);
        serial.print("CLKPR = "); // На всякий случай проверим реальную частоту, на которой
        serial.println(CLKPR);    // работает контроллер
     
    Только внимательно посмотрите какой USART используете...
    Пока сочинял пришёл к мысли: а Вы случайно не USART_1 используете? Тогда нужно использовать Serail1 вместо Serial:
    Код (C++):
    Serial1.begin(9600);
    Это временная папка, создается в момент компиляции (кстати содержит интересные для пользователя Arduino IDE вещи, которые много чего объясняют). После закрытия Arduino IDE папка удаляется, при запуске создаётся новая с новым именем.
     
  7. Airbus

    Airbus Радиохулиган Модератор

    Да спасибо!Я так и понял.А у Kosss я так понял "голая" мега без платы (я сначала попутал с Мегой 168 в ардуине и не мог понять почему он так шьёт теперь всё понял). Сбил меня он с толку этой фразой "В файле boards.txt стоит правильная частота 16000000L" Т-е ему нужен только НЕХ а далее всё понятно.:)
     
    Kosss нравится это.
  8. Kosss

    Kosss Нерд

    Всем огромное спасибо. В итоге я разобрался, что для моей ситуации UBRR должен быть равен 0x67. Сделал такой костыль
    Код (C++):
    void setup() {
      // put your setup code here, to run once:
    Serial.begin(9600);
    UBRR0H = 0x00;
    UBRR1H = 0x067;


    }

    void loop() {
      // put your main code here, to run repeatedly:
    Serial.write("Hello");
    delay(500);
    }
    Работает теперь нормально, правда не совсем эстетично (для ситуации, когда я собираюсь залить скетч и забыть на века, в принципе пойдет)
    Всем еще раз огромное спасибо!)
     
  9. AlexU

    AlexU Гуру

    Вы допустили ошибку -- должна быть пара регистров H и L:
    Код (C++):
    UBRR0H = 0x00;
    UBRR0L = 0x067;
    Не смотря на то, что проблема решена, но она решена не верным способом (Вам просто повезло), ситуация до конца не прояснилась -- суть проблемы не выявлена. Это может стать причиной не понятных проблем в будущем.
     
    Kosss нравится это.
  10. Kosss

    Kosss Нерд

    Решение найдено!
    Идем в папку с ардуино
    C:\Users\<username>\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.13\cores\arduino
    Там открываем HardwareSerial.cpp и находим такую вот хрень
    #if defined(__AVR_ATmega8__)
    config |= 0x80;
    #endif
    Заменяем/дописываем, без разницы, должно быть в итоге так:
    #if defined(__AVR_ATmega8__) || defined(__AVR_ATmega32__) || defined(__AVR_ATmega16__)|| defined(__AVR_ATmega162__)
    config |= 0x80;
    #endif
    Усе. Все будет огонь.
     
    AlexU нравится это.
  11. AlexU

    AlexU Гуру

    А вот это уже грамотное решение.
    Проблема в том, что регистр UBRRH и регистр UCSRC имеют один и тот же адрес, и что бы контроллер знал какой из них менять используется старший (7) бит значения -- что собственно и делает код 'config |= 0x80;' -- "1" в 7мом бите означает, что нужно менять UCSRC. До этого исправления попытка записи в регистр UCSRC в реальности изменяла UBRRH, что приводило к установке некорректной скорости.