Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 24.03.2010, 15:08  
sergx1300
Прописка
 
Аватар для sergx1300
 
Регистрация: 18.03.2010
Адрес: Украина, Тернополь
Сообщений: 225
Сказал спасибо: 14
Сказали Спасибо 44 раз(а) в 34 сообщении(ях)
sergx1300 на пути к лучшему
По умолчанию Re: Передача данных с ATmega8 на COM порт ПК

На практике выяснил, что скорость передачи данные сутево зависит от их разрядности (то есть 1 символьное число передается намного быстрее, чем 4-ри символьное). Думаю что передача данных в другом формате меня неспасет.
Поэтому сделал вывод о переходе на другой интерфейс, только который?!!! Есть еще вариант: реализовать какой-то буфер в МК а затем передавать данные на СОМ ПК. Для начала попробую реализовать буфер и записывать туда данные. Мне хватило бы записать хотяби один период на 200-300 точек.
Помогите с примерами программ, кто чем может.
Реклама:
sergx1300 вне форума  
Непрочитано 26.03.2010, 01:04  
sserg_ey
Частый гость
 
Регистрация: 22.07.2007
Адрес: Харьков
Сообщений: 47
Сказал спасибо: 3
Сказали Спасибо 1 раз в 1 сообщении
sserg_ey на пути к лучшему
По умолчанию Re: Передача данных с ATmega8 на COM порт ПК

Реализация буфера в МК сводится к объявлению массива данных.
Навскидку, пример складирования данных измерения в буфер непрерывно работающего АЦП

#define MAX_IZMERENIY 300 // максимальное количество измерений
bit f_Buff_overfl; // флаг переполнения буфера
int index_counter; // счетчик позиции в буфере
int ADC_Data[MAX_IZMERENIY]; // буфер

interrupt [ADC_INT] void[];
{
if(!f_Buff_overfl) // проверка чтобы прерывание не переписывало данные если они не прочитаны
{
if(index_counter ‹ sizeof(ADC_Data)-1) // если счетчик не за пределами массива
{
ADC_Data[index_counter]=ADCW; // запоминаем результат в буфере
index_counter++; // наращиваем счетчик
return; // выходим из прерывания
};
f_Buff_overfl=1; //иначе, выставляем флаг, что в буфере данных под завязку.
index_counter=0; // сбрасываем счетчик
}
}
Флаг сбрасывайте после того как передали весь буфер.
sserg_ey вне форума  
Непрочитано 29.03.2010, 11:56  
sergx1300
Прописка
 
Аватар для sergx1300
 
Регистрация: 18.03.2010
Адрес: Украина, Тернополь
Сообщений: 225
Сказал спасибо: 14
Сказали Спасибо 44 раз(а) в 34 сообщении(ях)
sergx1300 на пути к лучшему
По умолчанию Re: Передача данных с ATmega8 на COM порт ПК

Вот что-то написал с передачей данных в буфер.
Благодарю sserg_ey за пример, но я в нем чето неочень разобрался, соответственно у меня ничего невийшло. Помогите разобраться и подправить программу.
Виложую саму программу и архив проекта.

#include ‹mega8.h›
#include ‹delay.h›
#include ‹stdio.h›
#define ADC_VREF_TYPE & 0xff;
#define MAX_IZMERENIY 300 // максимальное количество измерений
bit f_Buff_overfl; // флаг переполнения буфера
int index_counter; // счетчик позиции в буфере
int ADC_Data[MAX_IZMERENIY]; // буфер

interrupt [ADC_INT] void adc_isr(void){

{
if(!f_Buff_overfl) // проверка чтобы прерывание не переписывало данные если они не прочитаны
{
if(index_counter ‹ sizeof(ADC_Data)-1) // если счетчик не за пределами массива
{
ADC_Data[index_counter]=ADCW; // запоминаем результат в буфере
index_counter++; // наращиваем счетчик
return; // выходим из прерывания
};
f_Buff_overfl=1; //иначе, выставляем флаг, что в буфере данных под завязку.
index_counter=0; // сбрасываем счетчик
}
}
}
void init(void){

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 57600

UCSRA=0x02;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x19;

ADMUX=0x0b00000000; // вибираем 0-й канал АЦП
ADCSRA=0x0b10001011; // конфигурация АЦП
#asm ("sei"); // разрешить все переривания
}
void main(void)
{
init(); // визов функции int (инициализация всего)
while(1){
ADCSRA=0b11010011; // включаем АЦП преобразование
printf("%d ",ADC_Data); // печатаем в УАРТ значение регистра ADCW
putchar(0x0D); // на новую строку УАРТА
}
}
Вложения:
Тип файла: rar Adc-com_buf.rar (65.5 Кб, 68 просмотров)
sergx1300 вне форума  
Непрочитано 29.03.2010, 23:52  
=GM=
Прописка
 
Регистрация: 21.09.2009
Сообщений: 218
Сказал спасибо: 1
Сказали Спасибо 29 раз(а) в 27 сообщении(ях)
=GM= на пути к лучшему
По умолчанию Замечания по программе

1) Счётчик байт и флаг перед началом цикла надо установить в 0.

2) Перед выдачей буфера на печать надо проверять буфер на заполнение, т.е установлен флаг f_Buff_overfl в 1 или нет. (Убедитесь, что прерывания срабатывают).

3) После выдачи буфера на печать, флаг f_Buff_overfl надо сбрасывать в ноль.

4) Убрать из цикла всё лишнее, например, зачем каждый раз устанавливать ADCSRA.

Предложения по конкретному алгоритму для передачи 10000 точек/с в реальном времени.

1) Необходимо осознать, как вам было сказано, что на скорости 115200 бод вы не успеете передать 20000 байт/с. Значит нужно или урезать осетра до 9 бит вместо 10 (что вполне возможно), или передавать на скорости 230400 (что предпочтительнее).

2) Убрать printf и putchar, поскольку при таком подходе выдаётся по крайней мере 6 байт вместо 2, налицо замедление в 3 раза, причём в самом узком месте. Выдавать строго два байта оцифровки.

2) Проще всего написать программу на ассемблере, всего 4 строки кода: считать два байта из ацп, выдать первый байт, подождать до 50 мкс, выдать второй байт, подождать до 50 мкс, вернуться к чтению готовых данных из ацп. Вся программа, никаких буферов. Как-то так.
=GM= вне форума  
Непрочитано 30.03.2010, 09:18  
ilya_sh
Прописка
 
Регистрация: 09.10.2007
Сообщений: 235
Сказал спасибо: 27
Сказали Спасибо 24 раз(а) в 24 сообщении(ях)
ilya_sh на пути к лучшему
По умолчанию Re: Передача данных с ATmega8 на COM порт ПК

Сообщение от sergx1300 Посмотреть сообщение
В будущем можно сделать цифровой осцилограф.
Про осцилограф на меге8 забудь - слишком медленно. Если только не для ультраНЧ
ilya_sh вне форума  
Непрочитано 30.03.2010, 10:26  
Prime
Прописка
 
Регистрация: 11.06.2005
Сообщений: 266
Сказал спасибо: 9
Сказали Спасибо 13 раз(а) в 12 сообщении(ях)
Prime на пути к лучшему
По умолчанию Re: Передача данных с ATmega8 на COM порт ПК

Скажу тоже пару слов автору топика...
Если хочешь получить скорость передачи повыше ( а для твоей задачи без всяких сжатий данных и прочая надо как теоретический минимум 10000 * 2 * 10 = 200000 кБит/с), попробуй глянуть на скорости на USART выше 115200. Стандартный COM-порт может такое не потянуть, зато виртуальный, создаваемые при использовании той же самой FT232 (подробнее читай на сайте производителя) и USB - вполне позволит такие скорости. Мы разгоняли до 1.5 МБит, и всё работало. Удачи в начинаниях!
__________________
Канал в Telegram об МК AVR @EasyAVR
Prime вне форума  
Непрочитано 30.03.2010, 12:51  
=GM=
Прописка
 
Регистрация: 21.09.2009
Сообщений: 218
Сказал спасибо: 1
Сказали Спасибо 29 раз(а) в 27 сообщении(ях)
=GM= на пути к лучшему
По умолчанию осцилограф на меге8

Сообщение от ilya_sh Посмотреть сообщение
Про осцилограф на меге8 забудь - слишком медленно. Если только не для ультраНЧ
Ну, не так страшен чёрт, как его малюта . На про-радио был реальный проект с внешним ацп, он реально работал на 20/3=6.7МГц. В процессе обсуждения пришли к выводу, что можно легко присобачить ТРИ меги к одному ацп и получить 20Мвыборок/с.
=GM= вне форума  
Непрочитано 30.03.2010, 14:22  
sergx1300
Прописка
 
Аватар для sergx1300
 
Регистрация: 18.03.2010
Адрес: Украина, Тернополь
Сообщений: 225
Сказал спасибо: 14
Сказали Спасибо 44 раз(а) в 34 сообщении(ях)
sergx1300 на пути к лучшему
По умолчанию Re: Передача данных с ATmega8 на COM порт ПК

Об осциллографе уже давно забыл. На таких скоростях нереально. Prime писав: Стандартный COM-порт может такое не потянуть. Виртуальный потянет, но потянет ли порт МК.
USB - полностью позволит такие скорости. Мы разгоняли до 1.5 Мбит, и все работало. Можно примеры и на каком МК реализували? И как приймати даны из USB. Еще нужно дрова писати под Windows, а я в этом полной 0. О программировании вообще ничего незнаю. Это вообще мой первый проект по програмуваню МК . Может кто-то пидправить мою программу.
Слышал о TWI, И2с интерфейс. Как с помощью их передавать данные на ПК. Подойдет ли к моей задаче?
sergx1300 вне форума  
Непрочитано 30.03.2010, 14:37  
ilya_sh
Прописка
 
Регистрация: 09.10.2007
Сообщений: 235
Сказал спасибо: 27
Сказали Спасибо 24 раз(а) в 24 сообщении(ях)
ilya_sh на пути к лучшему
По умолчанию Re: осцилограф на меге8

Сообщение от =GM= Посмотреть сообщение
Ну, не так страшен чёрт, как его малюта . На про-радио был реальный проект с внешним ацп, он реально работал на 20/3=6.7МГц. В процессе обсуждения пришли к выводу, что можно легко присобачить ТРИ меги к одному ацп и получить 20Мвыборок/с.
Так эт уже не на меге, а на внешнем АЦП. А речь шла на АПЦ самого МК.
ilya_sh вне форума  
Непрочитано 30.03.2010, 14:41  
ilya_sh
Прописка
 
Регистрация: 09.10.2007
Сообщений: 235
Сказал спасибо: 27
Сказали Спасибо 24 раз(а) в 24 сообщении(ях)
ilya_sh на пути к лучшему
По умолчанию Re: Передача данных с ATmega8 на COM порт ПК

Сообщение от sergx1300 Посмотреть сообщение
Слышал о TWI, И2с интерфейс. Как с помощью их передавать данные на ПК. Подойдет ли к моей задаче?
Если тлько слышали, то тяжело будет вникнуть.
На ПК нет этих интерфейсов, и для требуемой скорости нуно будет еще девайс для связи компом городить (тока через что?). Опять же лишние устройства. Лучше. как было сказано выше, использовать USB.
Вообще, если бы описали ТЗ подробно, то мож и посоветовали что-нибудь (например, нужно ли 10К выборок в сек?)
ilya_sh вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача данных в UART из текстового файла bombardier_rotax Proteus 6 24.02.2010 20:50
Беспроводная передача данных? maxNTF Автоматика и аппаратура связи 6 29.12.2009 12:20
Котроллер дисплея на Atmega8 kosant Микроконтроллеры, АЦП, память и т.д 24 30.11.2009 20:57
Порт С в ATmega8 VVKart Микроконтроллеры, АЦП, память и т.д 2 10.11.2009 14:08
proteus, atmega8, меняю ноги в hex - не работает digitest Микроконтроллеры, АЦП, память и т.д 3 08.10.2009 13:07


Часовой пояс GMT +4, время: 13:06.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot