Страница 1 из 3

Передача данных с ATmega8 на COM порт ПК

Добавлено: Пт мар 12, 2010 13:28:45
sergx1300
:tea:
Помогите разобраться со скоростью передачи данных от Atmega8 на порт ПК (Rs-232). Запрограммировал АЦП в данном МК. Все работает, только даны паредаються очень медленно :cry: . Мне нужно оцифровать частоту 50 герц с как можно большим количеством точек. У меня работает со скоростью около 1000 точек за секунду. Мне нужно около 10000 точек - в этом и собственно проблема. Программу писал в Codevisionavr. Вот сама программа и архив проекта.

Код: Выделить всё

#include <mega8>
#include <delay>
#include <stdio>
#define ADC_VREF_TYPE & 0xff;
interrupt [ADC_INT] void adc_isr(void){
          printf("%d ",ADCW); //    печатаем в УАРТ значение регистра ADCW
          putchar(0x0D);              //  на новую строку УАРТА
       }
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=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x0C;

ADMUX=0x0b00000000;   // вибираем 0-й канал АЦП
ADCSRA=0x0b10001011;   //  конфигурация АЦП
 #asm ("sei"); // разрешить все переривания
 }
  void main(void)
{
  init();     // визов функции int (инициализация всего)
 while(1){
      ADCSRA=0b11001011;   // включаем непреривное АЦП преобразование
      }
      }
[/code]

Добавлено: Пт мар 12, 2010 13:52:56
Meteor
"В каждой строчке только точки
Догадайся мол сама"...(с) из песни.
Прошу прощения за офф топ

Добавлено: Пт мар 12, 2010 13:53:10
ARV
прикольная тема!

Re: Передача данных с ATmega8 на COM порт ПК

Добавлено: Сб мар 13, 2010 08:12:30
smac
sergx1300 писал(а)::tea:
Мне нужно около 10000 точек - в этом и собственно проблема.
Немудрено что медленно, ибо в прерываниях вызываются такие тяжелые функции. Метод решения прост: настраиваете АЦП на нужную частоту семплирования, в прерывании от АЦП просто кладете результаты преобразования в буфер, в основной программе преобразовываете значения от АЦП в ASCII строки, в прерывании от UART передаете преобразованные строки. При передаче нежелательно пользоваться функциями типа printf т. к. Вы (и я тоже) не знаете за какое время они выполняются, обработчики прерывания в любом случае лучше написать самому, преобразование в строку я бы тоже сам написал, но тут есть варианты.

Re: Передача данных с ATmega8 на COM порт ПК

Добавлено: Сб мар 13, 2010 10:51:05
Meteor
smac, ваши рекомендации немного неверны. Весь код не смотрел - нет надобности.
Автору нужно получить в секунду 10000 отсчетов АЦП это минимум 10000 байт при условии что данные 8бит, а может и 20000 если данные 2 байта (10 бит).
На приведенной автором скорости 57600 бод, можно при минимальном числе служебных бит (старт и 1 стоп, без контроля), можно передать за секунду 5760 байт.
Это почти в 2 раза ниже минимальных объемов данных.
Скорости передачи должно заведомо хватать для передачи максимально возможного объема данных раза в полтора. Эти полраза будут потрачены на обслужиание прерываний от АЦП, УАППа и прочего.
Вывод один или снижать объем данных или уходить на скоростную передачу данных.
Второй способ кажется более правильным.
У FTDI есть многорежимные переходники, в которых имеется USB- SPI.

Re: Передача данных с ATmega8 на COM порт ПК

Добавлено: Вс мар 14, 2010 00:29:33
smac
Meteor писал(а):smac, ваши рекомендации немного неверны...
Да, действительно, про скорость передачи-то я и не подумал. Просто сразу бросилось в глаза использование printf в прерывании. Еще одна проблема в том, что если передавать данные в ASCII формате, то данных будет еще больше, если грубо прикинуть, то на одно измерение (двухбайтовый результат АЦП) придется передавать 5 символов (если перевод строки тоже считать). Т. е. нужно где-то 50 000 байт в секунду. Вобщем если Ваши и мои рекомендации сложить, то получится уже ближе к телу :)

Re: Передача данных с ATmega8 на COM порт ПК

Добавлено: Вс мар 14, 2010 08:15:30
Mamonth
Вообще-то есть для USART такой режим х2 - удвоенная скорость передачи... В свое время даже пробовал его - работало.

Вообще... чтобы иметь буфер в 10 000 байт (или 20 000) надо иметь кучку оперативки такого размера. А в меге8 наверно такого объема нет.

Вероятнее необходимо организовать внешнюю RAM и там хранить; или кольцевой буфер, и данные постоянно выкидывать в USART.

Re: Передача данных с ATmega8 на COM порт ПК

Добавлено: Вс мар 14, 2010 08:55:53
Meteor
Необязательно иметь огромную память, достаточно решить вопрос со скоростью. Тогда можно и буфер в 10 байт иметь за глаза его хватит.

Re: Передача данных с ATmega8 на COM порт ПК

Добавлено: Вс мар 14, 2010 11:37:27
smac
Meteor писал(а):Необязательно иметь огромную память, достаточно решить вопрос со скоростью. Тогда можно и буфер в 10 байт иметь за глаза его хватит.
+1. В принципе, я так понимаю, UART может выполнить эту задачу - максимальная скорость передачи = fclk/8, бит/с, где fclk - тактовая частота контроллера. Поэтому выбираем кварц такой, чтобы "попасть" в стандартное значение скорости и вперед.
По моим прикидкам битовая скорость нужна такая: 50 000 (байт) * 10(бит: 1 старт, 8 - данные, 1 - стоп) = 500 000 бит/с. Выбираем ближайшее большее стандартное значение - 921600 бит/с (только нужно убедиться что компьютер это значение поддерживает), получаем кварц 8*921600 = 7,3728 МГц или 16*921600 =14,7456 МГц. Выбранное значение и запас по скорости кстати обеспечит, правда кабель длиннее метра вряд-ли можно будет применять.

Re: Передача данных с ATmega8 на COM порт ПК

Добавлено: Вс мар 14, 2010 11:45:43
Meteor
В целом согласен.
Но на такие скоростя обмена лучше наверное юзать не U(S)ART, а SPI. Причем поставить FT2232 от FTDI, ее универсальности хватит для трансляции. Минусом такого решения будет необходимость разработки собственного протокола обмена, включающего посылку служебных данных.
Про дистанцию тоже правильно вспомнили.
Автор, далё'ко шлёшь данные?

Re: Передача данных с ATmega8 на COM порт ПК

Добавлено: Пн мар 15, 2010 16:53:05
12val12
ага ..покажите мне как в win XP передавать данные на rs232 >=115200
все новые ком порты ограничены по скорости и скорее всего аппаратно
возможно применить сжатие данных
простейший вариант передавать разность между новым значением и предыдущым
если расстояние между точками меньше 1миллисек до диапазона (-127 +127) достаточно ..(передаем знаковый байт)
а вообще какая цель ?
если отлавливать пропадания /превышения сетевого напряжения..зачем гнать такой поток ..на мк можно написать алгоритм который будет передавать только "аномальности" )

Re: Передача данных с ATmega8 на COM порт ПК

Добавлено: Пн мар 15, 2010 22:56:48
smac
12val12 писал(а):ага ..покажите мне как в win XP передавать данные на rs232 >=115200
Не знаю, не знаю, у меня переходник USB-COM на основе pl2303 позволяет и на 921600 обмениваться как раз на win XP. Другое дело, что лично я бы не стал использовать COM порт для передачи больших массивов данных, но в принципе решение возможно, хотя-бы в качестве пилотного проекта.

Re: Передача данных с ATmega8 на COM порт ПК

Добавлено: Вт мар 16, 2010 01:12:16
12val12
интересно у меня тот же pl2303 выше 128000 нет настройки..

Re: Передача данных с ATmega8 на COM порт ПК

Добавлено: Ср мар 17, 2010 16:22:03
sergx1300
В проекте использовал скорость 57600 бод посколько ето максымальная скорость сымуляции RS-232 в Proteus. На практеке хочу использовать 115200 бод. Даныє буду слать на растояныє 1-0,5 метра (максимум на 2,5 м).
С 12val12 согласен, что если
отлавливать пропадания /превышения сетевого напряжения
вполне достаточно и скорости 1000 точек/сек. Но моя задача посложнее. Нужно считать форму сигнала 50 гц максимально точно, вплоть до точного перехода через ноль.
Тоесть мне нужно считать несколько периодов (не болише 3-5) с максималим количеством течек (чтоби увидеть наименьшие импульсы).
В будущем можно сделать цифровой осцилограф.

Re: Передача данных с ATmega8 на COM порт ПК

Добавлено: Ср мар 17, 2010 16:59:35
sergx1300
[smac писал]Немудрено что медленно, ибо в прерываниях вызываются такие тяжелые функции.[/quote]
Подскажите как без них. Напишите пожалуста хоть какой-то кусочек программи. МК только начинаю разбирать. Ето почти моя первая программа. Сам думал поместить данные в буфер, а затем передать их на СОМ. Но как это реализовать программно.
Еще один вопрос: какими командами передавать дание в USART (кроме printf) и как передать данные в других форматах (кроме ASCII), если можно на примерах программ. Меже это все увеличит скорость.
С уважением Сергей

Re: Передача данных с ATmega8 на COM порт ПК

Добавлено: Ср мар 17, 2010 19:48:39
Meteor
Думаю, что наиболее рационально использоать вставки ассемблерного кода.
Это существенно сократит объем кода.

Re: Передача данных с ATmega8 на COM порт ПК

Добавлено: Ср мар 17, 2010 23:05:14
maglev
А можно сделать всё на Си, и (в случае ИАР, как минимум) от ассемблера объем практически не будет отличаться. А решение в том, чтобы работать с регистрами USART, не используя printf. Вот уж от чего стоит отказаться.

Re: Передача данных с ATmega8 на COM порт ПК

Добавлено: Чт мар 18, 2010 00:14:08
smac
sergx1300 писал(а): Но как это реализовать программно.
Еще один вопрос: какими командами передавать дание в USART (кроме printf) ...
С уважением Сергей
Ну например, преобразование 4-хбитного числа в ASCII код табличным способом:

Код: Выделить всё

char hex2ascii (char x){
 static const unsigned char ascii[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
 return ascii[x&0x0f];
}
Массив ascii[] нужно разместить в памяти программ, как это сделать зависит от компилятора;
Чтобы преобразовать однобайтное число в ASCII c помощью этой функции понадобится ее вызвать два раза, например

Код: Выделить всё

char string[MAX_STR_LENGTH];
unsigned char any_number;
char *s_ptr=string;
*s++=hex2ascii(any_number>>4);
*s = hex2ascii(any_number);
В общем это только примеры, дальше Вы сами, если будут конкретные вопросы задавайте, а писать за вас программу - увольте.

З. Ы. Например у меня в реализации на avr-gcc hex2ascii() получилась размером в 9 команд (не считая таблицы, которая весит 8 слов) и выполняется за 11 тактов, при просмотре ассемблерного листинга выяснилось что ее можно уменьшить на 2 команды и на 2 такта соответственно.

Re: Передача данных с ATmega8 на COM порт ПК

Добавлено: Чт мар 18, 2010 11:41:58
Jack_A
smac писал(а): Ну например, преобразование 4-хбитного числа в ASCII код табличным способом:
А зачем вообще преобразовывать? Если на приемном конце обрабатывающее устройство - ему проще работать с бинарными данными. А если для вывода на индикатор... 1000 раз в секунду - не многовато ли для глаза ?
А если на 0.5 - 1 м, то и параллельно плоским кабельком не проблема передать, хоть мегабит в сек.

Re: Передача данных с ATmega8 на COM порт ПК

Добавлено: Чт мар 18, 2010 11:54:05
Jack_A
sergx1300 писал(а): Нужно считать форму сигнала 50 гц максимально точно, вплоть до точного перехода через ноль.
Если воспользоваться преобразованием Фурье, то можно очень точно получить переход через 0 уже по 1 периоду, потому что в расчете участвуют не 2 соседних точки по разные стороны от нулевой линии - шумы приведут к снижению точности - а все 32 ( или 64 или 128 ) отсчетов за период. Немножко усложняет необходимость синхронизировать частоту дискретизации с измеряемой сетью, но дело того стоит.
Я так думаю. В серьезных проектах я так и делал. А поиграться ....