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

Приём Данных С Пк По 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;

}

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

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

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

Особенности хранения литиевых аккумуляторов и батареек

Потеря емкости аккумулятора напрямую зависит от условий хранения и эксплуатации. При неправильном хранении даже самый лучший литиевый источник тока с превосходными характеристиками может не оправдать ожиданий. Технология, основанная на рекомендациях таких известных производителей литиевых источников тока, как компании FANSO и EVE Energy, поможет организовать правильный процесс хранения батареек и аккумуляторов. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 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В.

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

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

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

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

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

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

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 пользователей онлайн

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

    • так я нормально и не запустил блок питания на SG3525+IR2110 снова взрыв ключей, но после прошлого взрыва перебрав всех дохликов блок питания стал держать нагрузку но этого проседал со 120В до 15В сейчас включив в разрыв лампу проседает совсем чуть чуть и лампа горит точно так же и по низковольтным +15В/-15В ранее при  нагрузке всего на 5Вт напряжение падало почти в ноль теперь же ровно 15В и не шевелится, нагрузку то есть стал держать но, стоило только мне исключить лампу на входе на холостых он запустился но только подключив минимальную нагрузку на выход взрыв ключей, могу предположить что это из-за неправильного питания ШИМ, исходник не мой и слаботочная вторичка для питания ШИМ включена параллельно с дежурным мелкопитальником но напряжение на нем суммируется почему то и на выходе получается 36-38В а для стабилизатора L7815 где максимальное входное 35В это смерть, видимо дело обстоит так, когда включаю через лампу часть тока теряется на лампе и на выходе слаботочном для питания ШИМ напряжение ниже и суммируясь с выходным дежурки по грани но проходит для запитки 7815 но стоит убрать лампу повышается выходное слаботочки для ШИМ и выходное запредельно увеличивается для 7815 а подключив нагрузку ШИМ еще больше начинает молотить опять таки повышая выходное напряжение на выходах силовго трансформатора. В общем с лампой на входе работает без неё и дав чуть нагрузки взрыв ключей, так же мёртвая и 7815 оказывается, правильно мыслю? Зачем 2 источника питания для ШИМ мне не ясно и от слаботочки и от дежурки, почему сразу с дежурки не подать на ШИМ, там ведь стабилизированные 12В  
    • С ВМ12 или 18 есть, жёлтые и зелёные, остальные с разного импорта...
    • Да, да, как обычно обсираешь, я тебя хорошо знаю. Только вот ничего из того что ты сказал на данный момент не верно.  Во первых, когда я собирал свой Худ я расчитывал использовать его долго, и очень долго читал везде какие наиболее правильные детали в нëм нужно использовать, и не из-за аудиофилии, а именно по результатам тестов усилителя с определëнными деталями. Всë что я написал выше это то, что по всей инфе по Худу из интернета является лучшим вариантом.  Во вторых, симулятором я уже давно пользуюсь более чем хорошо, и схемы в железе тоже давно дорабатываю. Серьëзные схемы я тоже уже создал, как тот же HCA-2 и VAC 2.0. HCA-2 пока проверяется, VAC 2.0 уже давно опубликован, собран, и отлично реально каждый день часами работает без каких либо косяков и очень радует звуком. Из готовых схем я уже собирал ОМ 2.5 который у меня сразу запустился без проблем вообще. Паяю я уже не хуже профессионалов. Хорошие платы я тоже уже вполне разрабатываю и делаю и мои последние усилители это отлично подтверждают. И в отличии от вас, я действительно помогаю всем нормальным людям, а не троллю и хаю их как вы, а  также не ставлю под сомнения верные слова и репутацию свою и других людей. Однако я совершенно никогда не лезу в темы, в которых совсем не разбираюсь, что-то пишу в других темах помимо своей только тогда, когда на 99% уверен что написанное мной верно и как минимум никак не повредит человеку, а как максимум, значительно поможет ему.  Я развиваюсь в разы быстрее чем вы думаете. Ни на какой чëрт не нужен Худ на питании 18 вольт! При этом питании он даëт худший КНИ из всех и мощность чуть более 4х ватт. Худ имеет смысл собирать только с питанием 24-28 вольт и током покоя под 1.2-1.35 ампера. Тогда он выдаст свои максимальные параметры и свой лучший КНИ (~0.125%).  Ещë один тотальный бред. Мой худ с одним радиатором размером чуть более половины кирпича на питании 28 вольт и током покоя 1.3 ампера нагревался до вполне допустимых 59-65 градусов чисто на конвекции с вертикально стоящими рëбрами радиатора, а с мелкими куллерами на минимальных оборотах было вообще максимум 42 градуса. Опять же на алюмооксидных термопрокладках 0.25 мм и КПТ 8.
    • Дросселя с катушечного магнитофона с псевдо сенсорным управлением на микросхемах 176 серии
×
×
  • Создать...