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

Приём Данных С Пк По Usart.


Cherep-x-x-x-

Рекомендуемые сообщения

Привет всем тем, кто откликнулся мне помочь!

#ifndef RXB8
#define RXB8 1
#endif

#ifndef TXB8
#define TXB8 0
#endif

#ifndef UPE
#define UPE 2
#endif

#ifndef DOR
#define DOR 3
#endif

#ifndef FE
#define FE 4
#endif

#ifndef UDRE
#define UDRE 5
#endif

#ifndef RXC
#define RXC 7
#endif

#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<DOR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)

// USART Receiver buffer
#define RX_BUFFER_SIZE 8
char rx_buffer[RX_BUFFER_SIZE];

#if RX_BUFFER_SIZE <= 256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif
bit rx_buffer_overflow;
// USART Receiver interrupt service routine
interrupt [uSART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
PORTB=0x04;//начало приёма данных
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)
     {
     PORTB=0x08;//конец приёма данных
     rx_counter=0;
#endif
     rx_buffer_overflow=1;
     }
  }
}

#ifndef _DEBUG_TERMINAL_IO_
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index++];
#if RX_BUFFER_SIZE != 256
if (rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#endif
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif

Собственно сама проблема заключается в готовом устройстве, при приёме бит с ПК горит светодиод что идёт приём

PORTB=0x04;//начало приёма данных

после приёма должен загораться другой светодиод, говорящий что приём окончен

PORTB=0x08;//конец приёма данных

,но ЭТОГО НЕ ПРОИСХОДИТ!

Подскажите в чём проблема и направте на путь истенный.Пожалуйста.

Отправляю с помощью Терминала в CVAVR.

Перед тем как собрать устройство, тестировал в Proteus (без ошибок и замечаний),в нём всё работает.

Не знаешь закона Ома, сиди дома!!!)))

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

PORTB=0x04;//начало приёма данных

PORTB=0x08;//конец приёма данных

,но ЭТОГО НЕ ПРОИСХОДИТ!

Подскажите в чём проблема и направте на путь истИнный.Пожалуйста.

Отправляю с помощью Терминала в CVAVR.

Перед тем как собрать устройство, тестировал в Proteus (без ошибок и замечаний),в нём всё работает.

Лучше использовать

#define Led_TX 2 //Ваш СД подключен к биту 2
#define _BV(1<<(x)) //макрос
#define Flash_led_TX   _BV(Led_TX) //макрос для сетодиода 

PORTB|= Flash_led_TX; //Зажечь светодиод
PORTB&= ~Flash_led_TX;//Потушить светодиод

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

На самом деле он тухнет. Но при приеме следующего байта зажигается. Т.к. зажигается при приеме первого байта в массив, а тухнет при приеме последнего байта, то время негорения очень мало, незаметно на глаз. Попробуйте отправить 8 байт, что соответствует размерности массива, увидите.

Или делаем так:

{

PORTB=0x08;//конец приёма данных

while(1);

rx_counter=0;

#endif

rx_buffer_overflow=1;

}

Изменено пользователем солар

Я не раздаю удочки. Я продаю рыбу.

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Спасибо,вот ещё тогда такой кусок кода.

      
      zv=rx_buffer[0];
      switch (zv-49) 
      {
      case 0: 
      {
      PORTC=0xff;
      delay_ms(3000);
      PORTC=0x00;
      rx_buffer[0]=0;
      };
      break;
      case 1:
      {
      PORTC=0xff;
      delay_ms(10000);
      PORTC=0x00;
      rx_buffer[0]=0;
      };
      break;
      };

После приёма в буфере если нулевой бит равен 1 ,то на PORTC в течении 3 секунд присутствует 5В...

если нулевой бит равен 2 ,то на PORTC в течении 10 секунд присутствует 5В.

Но этого не происходит в чём может быть проблема?

Не знаешь закона Ома, сиди дома!!!)))

Ссылка на комментарий
Поделиться на другие сайты

rx_buffer[0]

ну вот в этой строчке берется 0 бит из буфера,а сам буфер размером в байт,правильно я понимаю?

А насчёт битовых операций не понял,прошу прощения за непонимание.

Не знаешь закона Ома, сиди дома!!!)))

Ссылка на комментарий
Поделиться на другие сайты

Нет неправильно взгляните на картинку и все поймете.

834344.gif

Вот же у вас написано

// USART Receiver buffer
#define RX_BUFFER_SIZE 8
char rx_buffer[RX_BUFFER_SIZE];

Тип чар занимает 1 байт в памяти.

Это значит что вы создаете массив из 8 байт.

чтобы выбрать нулевой бит из массива нужно делать:

zv=rx_buffer[0]&0x01;

Может вам и не нужен массив если всего 8 бит?

Тут вы пишете

// USART Receiver interrupt service routine
interrupt [uSART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
PORTB=0x04;//начало приёма данных
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
  {
  rx_buffer[rx_wr_index++]=data;

Зачем вообще переменные data и status ?Когда можно вот так:

// USART Receiver interrupt service routine
interrupt [uSART_RXC] void usart_rx_isr(void)
{
PORTB=0x04;//начало приёма данных
if ((UCSRA & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
  {
  rx_buffer[rx_wr_index++]=UDR;

Изменено пользователем vitalik_1984
Ссылка на комментарий
Поделиться на другие сайты

Пытаюсь разобраться с работой амтеги32 с uart'ом. Для теста хочу лишь чтобы мк ответил в боле менее приличном виде. Однако на самый простой код (хотя я не совсем понял зачем нужен файл uart.h) в терминале вижу сообщение в шестнадцатеричном виде причем, только если в программе ставлю на си ставлю цифры. На два нуля в качестве ответа (Send_char) и пустой символ получаю нули в терминале(00 00 00 00 00), а на цифры 1 2 и пустой символ вижу (80 00 00 00 00). Если поставить в коде программы послать буквы, то в терминале будут кракозябры. Скорость 9600 бод при частоте мк в 8 МГц. За разъяснения по коду или более простой код буду благодарен(просто комменты по всему коду поподробнее, если кто может).

main.txt

usartc.txt

usarth.txt

Ссылка на комментарий
Поделиться на другие сайты

Если поставить в коде программы послать буквы, то в терминале будут кракозябры

пробуйте отправлять английские буквы.

а файл usart.h должен содержать прототипы функций.

он вообще то не совсем правильно составлен.

Изменено пользователем vitalik_1984
Ссылка на комментарий
Поделиться на другие сайты

А подскажи как надо или подкинь простой код для работы по uart. Ладно попробую английские буквы передать, только как я понимаю почему-то скорости разные. Может потому, что код я брал для атмеги8515 и переделал немного для амтеги32. Хотя вроде логику проверял.

Ссылка на комментарий
Поделиться на другие сайты

Зачем Вы ходили на кладбище - переписывали с 8515 :D ?

Там могло измениться расположение битов в регистрах и пр. хрень. У Атмела это бывает. Сам напарывался.

Вы эти аспекты проконтролировали?

CvAVR генерит абсолютно адекватный код для USART. Меня он никогда на подводил. Сгенерите его для меги32 и тестируйте.

По железу:

1. Надеюсь, у Вас между мегой и COM-портом стоит MAX232 или что-то родственное?

2. COM-порт какой - интегрированный, USB переходник, ...? Я лично сталкивался - связка какой-то меги c MAX232 идеально работала на интегрированном порту, а на доп. PCI контроллере с 2-мя COM портами наблюдались жуткие глюки.

Изменено пользователем hd44780
Ссылка на комментарий
Поделиться на другие сайты

вообще такие биты

#define RXCIE 7  
#define RXEN  4
#define TXEN  3
#define URSEL 7
#define UCSZ1 2
#define UCSZ0 1

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

если не определены,возможно их и Нет :)

У вас там случайно предупреждения не было о переназначении битов?

Изменено пользователем vitalik_1984
Ссылка на комментарий
Поделиться на другие сайты

Ну поигрался со скоростью поставил 1200 и ура он стал выдавать адекватные буквы, вот только если я посылаю на комп abc в терминале выдается два раза abcabc. А вот зачем контролировать фьюзы? Я поставил все фьюзы по 1, т.е. не установлены. Тактирую от внешнего кварца на 8Мгц. Подскажите каким образом нужно контролировать фьюзы в данном случае и нужно ли вообще.

По железу у меня переходник bm8051 от masterkit кинул RXD TXD и землю на мк.

Изменено пользователем kruftin
Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

#include <mega8.h>
#include <delay.h>
#include <stdio.h>
#include <sleep.h>
volatile char zv;
interrupt [EXT_INT0] void ext_int0_isr(void)
{
PORTB=0x02;
DDRB=0x02;
PORTC=0x00;
DDRC=0x00;
PORTD=0x0C;
DDRD=0x00;
sleep_enable();
delay_ms(30);
powerdown();
}
interrupt [EXT_INT1] void ext_int1_isr(void)
{
sleep_disable();
delay_ms(30);
PORTB=0x08;
DDRB=0xFF;
PORTC=0x00;
DDRC=0x7F;
PORTD=0x1F;
DDRD=0xE2;
}

#ifndef RXB8
#define RXB8 1
#endif

#ifndef TXB8
#define TXB8 0
#endif

#ifndef UPE
#define UPE 2
#endif

#ifndef DOR
#define DOR 3
#endif

#ifndef FE
#define FE 4
#endif

#ifndef UDRE
#define UDRE 5
#endif

#ifndef RXC
#define RXC 7
#endif

#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<DOR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)

// USART Receiver buffer
#define RX_BUFFER_SIZE 8
char rx_buffer[RX_BUFFER_SIZE];

#if RX_BUFFER_SIZE <= 256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif
bit rx_buffer_overflow;
// USART Receiver interrupt service routine
interrupt [uSART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
zv=data;
PORTB=0x04;//начало приёма данных
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)
     {
     PORTB=0x08;//конец приёма данных
     rx_counter=0;
#endif
     rx_buffer_overflow=1;
     }
  }
}

#ifndef _DEBUG_TERMINAL_IO_
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index++];
#if RX_BUFFER_SIZE != 256
if (rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#endif
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif
void main(void)
{
PORTB=0x08;
DDRB=0xFF;
PORTC=0x00;
DDRC=0x7F;
PORTD=0x1F;
DDRD=0xE2;
GICR|=0xC0;
MCUCR=0x00;
GIFR=0xC0;
UCSRA=0x00;
UCSRB=0x98;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x06;
#asm("sei")

while (1)
     {
     if(zv==0x31){PORTC=0xff;delay_ms(3000);PORTC=0x00;zv=0;};
     if(zv==0x32){PORTC=0xff;delay_ms(10000);PORTC=0x00;zv=0;};   
     if (!(PIND&(1<<PIND4))){PORTC=0xff;delay_ms(3000);PORTC=0x00;}; 
     }
}

МК стал вроде принимать данные это видно по светодиодам,но вот с условием опять что то не понимаю,байты приходят на мк но желаемого результата один фиг не получаю,не хочет работать в реальном устройстве но в симуляции на пк всё просто превосходно...

Файлы Proteus.rar

Изменено пользователем Cherep-x-x-x-

Не знаешь закона Ома, сиди дома!!!)))

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...