Как принимать данные с массива с Uart

Тема в разделе "Микроконтроллеры AVR", создана пользователем Yerabdi, 18 май 2018.

  1. Yerabdi

    Yerabdi Гик

    Код (C++):
    ISR(USART_RX_vect)         //завершение приема
    {  a=UDR0;//забираем принятые данные
        b=a;
        c=0;
        if ((a>=48) && (a<=57)) {// преоброзование с символа на чисел
          c = c * 10 +  (a - 48);
        }
        for (int i;i < 10;i++)
        {Danie1[i]=c;
        }    
    }
    //*****uart********    
    ISR (USART_UDRE_vect)//регистр данных на передачю пуст
    {   if (Temp < 10)
        {UDR0 = Danie1[Temp];
             Temp++;     }
         else                    
          {  UCSR0B &=~(1 << UDRIE0);  //прерывания по опусташение регистра данных на передачю зап
                  }  
    }
    Принимаемые данные повторяются
     

    Вложения:

    • uart.jpg
      uart.jpg
      Размер файла:
      335,6 КБ
      Просмотров:
      644
  2. b707

    b707 Гуру

    код бредятина.
    Если вам надо передать числа - так и передавайте числа сразу! Зачем вы их сначала в символы переводите, а потом в приемнике - обратно?
    Глупо передавать число 128 как три символа "1", "2" и "8" - когда можно отправить всего 1 байт. И принимать так же.
     
  3. parovoZZ

    parovoZZ Гуру

    ну точно. Терминалку же можно настроить, чтоб числа слала, а не их представления из ASCII таблицы .
     
  4. Yerabdi

    Yerabdi Гик

    Здравствуйте а как можно настроить терминал чтоб числа отправлял заранее спасибо
     
  5. b707

    b707 Гуру

    использовать функцию Serial.write() вместо Serial.print
     
  6. parovoZZ

    parovoZZ Гуру

    Вопрос про программу.
     
  7. Mitrandir

    Mitrandir Гуру

    Альт + код символа не прокатывает?
    Т.е зажать альт и на нумпаде набрать 128
     
  8. Un_ka

    Un_ka Гуру

    слышал есть библиотеки sleep и avr/power в которых можно отключать перефирию МК . Конкретно интересует отключение АЦП англ ADC , короче говоря аналогово-цифрового преобразователя.
     
  9. parovoZZ

    parovoZZ Гуру

  10. Belkin

    Belkin Гик

    Если изначально в программе периферия не включалась, то соответствующие выводы - обычные GPIO (вход/выход) и ничего отключать не надо.
    Исключения для Reset и еще некоторых.

    Пример:
    Как только будет в программе $baud = 9600 - будет включен UART.
    Если этой команды нет - ножки Rxt и Txd - обычные GPIO.
     
  11. parovoZZ

    parovoZZ Гуру

    Как это не надо? Оно же тактируется и кушает электричество.
    Чтобы выключить абсолютно всё, есть макрос
    Код (C++):
    power_all_disable();
     
  12. Belkin

    Belkin Гик

    Вот счетчик-то намотает... :eek: ;)
     
  13. parovoZZ

    parovoZZ Гуру

    Счетчик это одно, а батарейка емкостью 200 мА/ч - другое.
     
  14. Belkin

    Belkin Гик

    Тогда можно без библиотек обойтись, достаточно записи в регистр.
    Вот из ДШ ATMega128:
     
  15. parovoZZ

    parovoZZ Гуру

    ну так а я про что?

    Физически АЦП никуда не отключается. Отключается тактирование.
     
  16. Belkin

    Belkin Гик

    Только после старта МК в ADEN - всегда "0", как и во всем ADCSRA, а если не было в программе разрешений на работу АЦП, то и отключать-то уже нечего... ;)
     
    Последнее редактирование: 23 июн 2018
  17. parovoZZ

    parovoZZ Гуру

    Честно - 128 не изучал. Но бит ADEN - это разрешение работы АЦП, а не управление тактированием. В других мк для этого есть регистр PRR и все его биты при сбросе в единице. 128 мега - она же не picopower?
     
  18. Belkin

    Belkin Гик

    Я привел для примера 128-ю, т.к. на этот МК есть грамотный перевод ДШ.
    http://kazus.ru/forums/attachment.php?attachmentid=2518&d=1259869371

    Для других МК достаточно сопоставить разделы ДШ, чтоб выявить разницу или внести поправки.

    Если есть необходимость использовать другой регистр, то (см. выше) опять же нет необходимости в библиотеках. ;)
     
    parovoZZ нравится это.
  19. parovoZZ

    parovoZZ Гуру

    Ну я чтение даташита всегда начинаю с таблицы регистров. А уже потом углубляюсь в нюансы. Английский ни разу не останавливал.