Jump to content

Recommended Posts

Доброго времени суток.

Начнем! Есть ПК , есть atmega16 , есть переходник USB UART из аппаратуры это все.

Написана программа дла работы с ком портом , которая отлично работает.

ДАННЫЕ------->ПК------->переходник------->atmega16

в идеале загорается светодиод если данные пришли без потерь

Но в том то и дело что данные приходят иногда не приходят иногда приходят с пятого, седьмого, пятнадцатого раза

настройки соединения USART в atmega16
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0xD8;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;

Настройки в программе такиеже 8 дата 1 стоп NO PARity режим асинхронный

есть предположение что нужно соединить общий провод на переходнике и atmega16

код приема данных


// USART Receiver interrupt service routine
interrupt [uSART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;

nomer_bita++;
x[nomer_bita]=data;
if(nomer_bita==5)
{
 nomer_bita=0;
}
if((x[1]=='1') && (x[2]=='2') && (x[3]=='3') && (x[4]=='4') && (x[5]=='5'))
{
 PORTA.7=1;
}
else
{
 PORTA.7=0;
}

if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
  {
  rx_buffer[rx_wr_index++]=data;
#if RX_BUFFER_SIZE == 256
  // special case for receiver buffer size=256
  if (++rx_counter == 0)
  {
#else
  if (rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
  if (++rx_counter == RX_BUFFER_SIZE)
  {
  rx_counter=0;
#endif
  rx_buffer_overflow=1;
  }
  }
}

внимание вопрос как избежать данного бага потери данных?

Edited by IMXO

Share this post


Link to post
Share on other sites
Guest /

UART, это далеко не СОМ.

Вот если добавить преобразователь на МАХ 232, то почти .

Share this post


Link to post
Share on other sites

Изготовление 2-х слойных плат от 2$, а 4-х слойных от 5$!

Быстрое изготовление прототипа платы всего за 24 часа! Прямая доставка с нашей фабрики!

Смотрите видео о фабрике JLCPCB: https://youtu.be/_XCznQFV-Mw

Посетите первую электронную выставку JLCPCB https://jlcpcb.com/E-exhibition чтобы получить купоны и выиграть iPhone 12, 3D-принтер и так далее...

внимание вопрос как избежать данного бага потери данных?

Думаю, так:

есть предположение... нужно соединить общий провод на переходнике и atmega16

Share this post


Link to post
Share on other sites

Безмостовые ККМ для 99% КПД!

Схема коррекции коэффициента мощности (ККМ) на основе так называемого «тотемного столба» (Totem Pole) обладает минимально возможными потерями и потенциально может обеспечить самые жесткие требования к энергоэффективности источников питания. Компания Wolfspeed представляет референсную разработку – плату ККМ CRD-02AD065N на базе собственных карбид-кремниевых MOSFET и диодов с наилучшими в отрасли характеристиками.

Подробнее

массив использовать как стек , проверку стека делать по приходу контрольного символа "возврат коретки" или редко используемых символов типа "ё" или нет?

Share this post


Link to post
Share on other sites

Гибридные IGBT - сила Si и SiC в одном корпусе!

Компания Infineon представила новые гибридные IGBT-транзисторы на 650 В, которые сочетают в себе преимущества технологий TRENCHSTOP и CoolSiC. Использование SiC-диода Шоттки позволяет значительно расширить возможности IGBT и снизить уровень энергии, необходимой для включения транзистора (Eon), а также уменьшить потери на переключение.

Подробнее

проблема толи в настройках толи в проводах в протеусе виртуально все работает

Share this post


Link to post
Share on other sites

Вебинар «Параметры выше, цена ниже. Обновление в линейке AC/DC- и DC/DC-преобразователей MORNSUN» (26.01.2021)

Приглашаем 26 января на бесплатный вебинар, посвящённый преимуществам и отличиям новых источников питания и DC/DC-преобразователей Mornsun. На вебинаре будут рассмотрены изолированные и неизолированные DC/DC-преобразователи последнего, четвертого, поколения (R4) и компактные модульные источники питания второго и третьего поколений (семейства LS/R3 и LD/R2) на плату. Рассмотрим новую группу продукции – встраиваемые источники питания в кожухе.

Подробнее

в протеусе виртуально все работает

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

Share this post


Link to post
Share on other sites

я переписал на стандартные функции четчар путчар вроде лучше но потери идут где не пойму

Share this post


Link to post
Share on other sites
Написана программа дла работы с ком портом , которая отлично работает.

прога не работает....

1. нормальный прием данных с юарта возможен или через прерывания или программными методами в режиме постоянного ожидания...

о программном методе(это ваши стандартные функции четчар путчар) можете забыть сразу...вам еще кучу переферии обслуживать...

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

3. ну и при приеме с юарта пользуем стек размером кодовой посылки... а также сообщаем на ПК о готовности приема и/или ошибок при приеме посылки

Share this post


Link to post
Share on other sites

короче нужен протокол передачи нанных. Это решает часть проблем.

переписать функцию получения данных например так:

if (rx_counter>0)

{

x=getchar();

if (x=='1')

{

migalka(5);

}

putchar(x);

x=0x00;

}

это не подвесит прогу и я уже проверил в протеусе через раз работает))))

какиенибуть примеры к советам будут где чего почитать и так далее

Share this post


Link to post
Share on other sites

у вас в пост1 был вполне нормальный код нужно просто

nomer_bita++;
x[nomer_bita]=data;
if(nomer_bita==5)
{
nomer_bita=0;
}

заменить на

x[1]=x[2];
x[2]=x[3];
x[3]=x[4];
x[4]=x[5];
x[5]=data;

тем самым вы получите сдвигаемый стек... при проверке условия совпадения посылки первым проверяется x[5]=='5' , дабы не выполнять лишних проверок,

Share this post


Link to post
Share on other sites

попробуйте этот код в железе...

1234┘ - включить пин

0000┘ - выключить пин

fgk.rar

Share this post


Link to post
Share on other sites

походу работает. Я детально вчиталсяв стандартные ф-и они делают тоже самое почти. Спасибо огромное тем кто откликнулся.

В железе всеравно потери идут и ничего не работает а в протесе вроде работает

всем спасибо за мысли будем дальше работать

С вами не прощаюсь спишемся

Share this post


Link to post
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  

  • Сообщения

    • Не уверен что правильно понимаю термин "гражданское общество".  Одно понятно точно - сегодняшний день является точкой бифуркации.  И про "гражданское общество" можно будет забыть, чем бы оно не было...
    • Мне этот вариант "прочтения" запал...   И парочку чудиков, были - нет... Залипучие ролики.  
    • Сим показал КНИ=0.019%
    • нет .... разве что по вторичке прикрутить .... вопрос - зачем изначально лепить гавно, а потом из него - Фаберже и из-за этого "фаберже" - морочить наши "фаберже"?
    • Это не у меня) Коррекцию не трогал. Да и не очень страшно,  усилитель всё же устойчив. Хотел сказать что олдовый шушурин не так прост как кажется.  А то начинающие хватаются. ну что может случиться?) Одному товарищу пытался тут помочь. Тот ещё квест. Блин проще Акулиничева с ШОС собрать и настроить чем эту балалайку.
    • @Семён Лепило весьма польщен в ЭТОЙ теме присутствием Вашего Мордило ... но оно тут и НА не впАло .... так что закрой плевАло .... Реализуй себя в других темах и не в качестве соплеутиралки .... Я знаю ЧТО мне делать и КАК .... Повторяю, я НИКОГДА не буду выяснять отношения за ЗАСЛУЖЕННЫЕ минусы и бан-ы, но тупость, хитрожопость, предвзятось и т.п. - будут наказаны и у меня БЫЛ ТУТ ДОГОВОР, что сначала - я действую ОФФ методами .... а не смешиваю его с землей, не укатываю в темах, не минусую до усера и т.п. Вот я и реализую свои права и обещания. Уважаемое Мордило, Вам все понятно? Вот туда и ходите ... мимо ЭТОЙ темы.  

  • Блок питания 12В для светодиодных лент, 18-100 Вт

  • Similar Content

    • By Timofey Shilov
      Пытаюсь разобраться в программировании этого контроллера и при попытке настроить USART для приема/передачи данных возникла проблема:
      Пытаюсь принять байт и после нажатия кнопки отправить его обратно, но на выходе получается совсем не то что ожидаю.

      При отправке 0 должно вернуть 0, но возвращает вот это. В чем может быть проблема?
      ASCII                                BIN                   DEC         HEX

      Подозрения падают на настройку baud rate, но вроде всё как в мануалах.

      Полный код:
      #include "stm32f4xx.h" #include "stm32f4xx_hal_gpio.h" #include "stm32f4xx_hal_rcc.h" #include "stm32f4xx_hal_cortex.h" #include "stdint.h" #include "math.h" //define Internal RC frequencies #define XTAL 16000000UL //define busses prescalers #define AHB_PRE 1 #define APB1_PRE 2 #define APB2_PRE 1 #define SysTicksClk 10000 //calculate peripheral frequencies #define SYSCLK 84000000 #define AHB SYSCLK/AHB_PRE #define APB1 AHB/APB1_PRE #define APB1_TIM APB1*2 #define APB2 AHB/APB2_PRE #define APB2_TIM APB2*1 #define SysTicks AHB/SysTicksClk #define USART_BAUDRATE 19200 #define BUF_LEN 1 struct Data { char Msg[BUF_LEN]; } Message; void USART2_IRQHandler(void) { if (!(USART2->SR & USART_SR_TXE)) { if (Message.Msg[0] == (char)0x00) GPIOA->ODR |= 1 << 1; if (Message.Msg[0] == (char)0x01) GPIOA->ODR |= 0 << 1; } if (USART2->SR & USART_SR_RXNE) { Message.Msg[0] = USART2->DR; } } int main() { RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN | RCC_AHB1ENR_GPIOBEN; GPIOA->MODER |= 1 << 1*2; //Set GPIOA pins output mode GPIOB->MODER |= 0 << 0*2; GPIOA->MODER |= 0xA0; GPIOA->AFR[0] |= 0x7700; RCC->APB1ENR |= RCC_APB1ENR_USART2EN; USART2->CR1 |= USART_CR1_UE; //usart enable USART2->CR1 |= USART_CR1_TE; //transmitter enable USART2->CR1 |= USART_CR1_RE; //receiver enable float div = (float)APB1 /(16*(float)USART_BAUDRATE); int integer = APB1 / (16*USART_BAUDRATE); float flo = (div - (float)integer)*16; int floatt = round(flo); USART2->BRR = (( integer << 4 ) + floatt); NVIC_EnableIRQ(USART2_IRQn); USART2->CR1 |= USART_CR1_TXEIE; USART2->CR1 |= USART_CR1_RXNEIE; int i; while(1) { if (!(GPIOB->IDR & GPIO_IDR_ID0)) { i = 1; } else { if(i == 1) { USART2->DR &= Message.Msg[0]; while(!(USART2->SR & USART_SR_TC)); i = 0; } } } }  
      Сама схема:

    • By Sambler
      У меня была похожая тема,  я решил проблему установив в include util/delay.h
      Но возникла еще одна ошибка, не могу понять, что оно хочет


      p.s. Я обещал, что предыдущая - последняя тема, но я ошибся, не думал, что тут 2 разные программы будут. В этот раз 100 процентов последняя тема и пойду сдавать работы Ы)

       

    • By Sambler
      Дана следующая программа и следующая схема.
      После запуска, циклично выдает одни и те же ошибка и до такой степени, что ПК не выдерживает нагрузку и приходится принудительно закрывать программу ( когда обычно, запустил программу и она не продолжает запускаться, а сразу указывает на ошибку в коде, а тут она даже не останавливается )
      При создании проекта выбираю WINAvr!!!



      Я не могу остановить симуляцию, приходится закрывать принудительно.
      Z
    • By IgnatiusF
      Не удается проинициализировать работу UART2 на скорость 19200 бод.
      Не вызывается прервание совсем, отсылаются постоянно нули на всех скоростях, если ставить System clock switch в 01 (HSE). При работе от RC генератора выдает уже просто не то, что нужно. 
      Кварц рабочий, и вообще все работает, при использовании библиотек HAL.
      SysTick выключил потому, что были подозрения на конлфикт приоритетов.
      Внизу представлена именно та часть кода программы, которая не работает, то есть сам UART.
      Проект скоро сдавать, а использовать готовую библиотеку HAL не хочется совсем, уже несколько дней парюсь и не могу найти проблему. Попробовал разобраться что пишет в регистры HAL, однако не смог т.к. не хватает знаний, значения регистров все такие же, кроме PLL (не используется) и RCC_CR1 (в HAL почему-то полностью равен 0). Проверял передачей данных по UART. Регистр BRR не удалось считать т.к. он только для записи. У меня записано так:
      USART1->BRR = 0x412;  //20MHz/16/19200 = 65,104.
      Где искать следует ошибку?
    • By IgnatiusF
      На схеме программатора USBasp заметил подключенные порты RXD и TXD к разъему, и появился вопрос, а для чего они там? Знаю, что при помощи них можно передавать и принимать данные через UART/USART между устройствами, а можно ли используюя USBasp передавать информацию по UART от МК к компьютеру и наоборот? И если можно, то как?
×
×
  • Create New...