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

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Родился
Сообщения: 13
Зарегистрирован: Пт мар 12, 2010 13:15:24

Сообщение sergx1300 »

А вообще есть слисл превращать данные из ASCII в другой формат в самом МК а затем посылать их на ПК? Увеличится ли быстродействие? :(
Реклама
Друг Кота
Аватара пользователя
Сообщения: 6350
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

sergx1300 писал(а):А вообще есть слисл превращать данные из ASCII в другой формат в самом МК а затем посылать их на ПК? Увеличится ли быстродействие? :(
Нешта я не разумею... Шла речь об printf, я думал, что данные получаются бинарные и printf'ом переводятся в вид для печати. А если там устройство 1000 раз в секунду че-то меряет и выдает уже в символьном коде, я про такое не слыхивал. Насколько помнит мой склероз, АЦП микроконтроллера данные всегда выдает в бинарном виде. Вот ведь век живи - век учись, и не такое увидишь. Так что беру все свои советы обратно.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....

Сообщение Meteor »

Склероз правильно помнит.
Но С, переводит данные в соответствии со своим представлением.
А коды чисел 0=0х30, 1=0х31, 2=0х32... 9 =0х39, A=0x41, B=0x42, C=0x43, D=0x44, E=0x45, F=0x46.
Оттуда все беды
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Контактная информация:
Мучитель микросхем
Сообщения: 459
Зарегистрирован: Вс июн 01, 2008 12:16:38

Сообщение smac »

sergx1300 писал(а):А вообще есть слисл превращать данные из ASCII в другой формат в самом МК а затем посылать их на ПК? Увеличится ли быстродействие? :(
Зависит от задачи. Если нужно быстродействие, то лучше и интерфейс и АЦП сменить.

Естественно если передавать бинарные данные, то получится быстрее, о чем здесь уже как-бы намекали. Но сперва у Вас вопрос был про то как без printf(). Опять-же в текстовом виде данные наглядней получаются и минимальную обработку (типа перевода строки, пробела и т. п.) можно сделать и на МК, зато не придется заморачиваться с программой для ПК - для начала вообще можно гипертерминал запустить и смотреть, хотя терминалки есть и те которые в бинарном виде данные отображают.
Реклама
Эиком - электронные компоненты и радиодетали
Потрогал лапой паяльник
Сообщения: 315
Зарегистрирован: Пт янв 29, 2010 19:42:27

Сообщение 12val12 »

лично у меня putchar 842 байта за секунду на скорости 57600 передаёт за 0.15 +- 0.1 сек.
быстрее и по теории не будет
вопрос в организации протокола
ух ты.... показывает
Реклама
Потрогал лапой паяльник
Сообщения: 315
Зарегистрирован: Пт янв 29, 2010 19:42:27

Сообщение 12val12 »

Хотелось бы узнать как принять 9бит посылку по rs232 на компьютере
т е поставить на компе 8бит +чётность
а интерпретировать четность как старший бит
кто нибудь пробовал ?
ух ты.... показывает
Реклама
Родился
Сообщения: 13
Зарегистрирован: Пт мар 12, 2010 13:15:24

Сообщение sergx1300 »

На практике выяснил, что скорость передачи данные сутево зависит от их разрядности (то есть 1 символьное число передается намного быстрее, чем 4-ри символьное). Думаю что передача данных в другом формате меня неспасет.
Поэтому сделал вывод о переходе на другой интерфейс, только который?!!! Есть еще вариант: реализовать какой-то буфер в МК а затем передавать данные на СОМ ПК. Для начала попробую реализовать буфер и записывать туда данные. Мне хватило бы записать хотяби один период на 200-300 точек.
Помогите с примерами программ, кто чем может.
Потрогал лапой паяльник
Сообщения: 315
Зарегистрирован: Пт янв 29, 2010 19:42:27

Сообщение 12val12 »

тебе нужно 8битные отсчёты или 10битные?
и конктретно расстояние между двумя отсчетами по времени
ух ты.... показывает
Родился
Сообщения: 13
Зарегистрирован: Пт мар 12, 2010 13:15:24

Сообщение sergx1300 »

Мне нужно 10-битные отсчёты, но для начала можно и 8-битные.
Расстояние между двумя отсчетами по времени 0,1 мСек (100 мкСек).
Потрогал лапой паяльник
Сообщения: 315
Зарегистрирован: Пт янв 29, 2010 19:42:27

Сообщение 12val12 »

ну так
0 указатель=0
1 запускаем однократное преобразование ацп (тактовая ацп 250кГц (16 Мгц /64) ) -это 52мксек
2 к указателю прибавляем 1 пишем в SRAM(ОЗУ) это до 10 тактов( до 0.625мкесек)
2 delay_us(47)
4 несколько Nop
3 если указатель больше 300 то в конец если меньше то в пункт 0
выдаём массив по rs232


readADC_3(); // получение данных в буфер

putchar(1); // отправка стартового кода
putchar(254); // отправка стартового кода
putchar(1); // отправка стартового кода
putchar(254); // отправка стартового кода
for(ij=0;ij<BUFFER;ij++) putchar( adc_array[ij] ); // в цикле сливаем BUFFER байт
ух ты.... показывает
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса

Сообщение clawham »

Ребятки ну какая у Вас вообще может быть проблема-то?
УАРТ то медленный интерфейс хоть и можно из него мегабит выдавить...дак и шлите в компьютер вначале два байта стартовых а потом 8-мибитную разницу со знаком!!!! а на компе уже наваять прогу обработки этих данных ну никаких проблем не составит!!!
+ ко всему вышеперечисленному можно накрутить буффер байт на 100 отправки уартовской и буффер замеров на 100 ацп
всё делать по прерываниям а в основном цикле только проверять если буффер не пустой - перекачать его в выходной немного обработав разницей уверен что проблем не будет! да и если мне не изменяет даташит то....

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

Up to 15 kSPS at Maximum Resolution
как то немного совпадает с 115200 Вашего уарта только если передавать будете по одному байту на измерение
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
Контактная информация:
Родился
Сообщения: 13
Зарегистрирован: Пт мар 12, 2010 13:15:24

Сообщение sergx1300 »

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

#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); // на новую строку УАРТА
}
}
Вложения
Adc-com_buf.rar
(65.53 КБ) 199 скачиваний
Потрогал лапой паяльник
Сообщения: 315
Зарегистрирован: Пт янв 29, 2010 19:42:27

Сообщение 12val12 »

Никаких printf
только putchar
ждем в цикле запроса от компа после запроса выдаём буффер ацп
и прерывания ацп не надо
ух ты.... показывает
Родился
Сообщения: 13
Зарегистрирован: Пт мар 12, 2010 13:15:24

Сообщение sergx1300 »

Об осциллографе уже давно забыл. На таких скоростях нереально.
О программировании вообще ничего незнаю. Это вообще мой первый проект по програмуваню МК. Может кто-то пидправить мою программу.
Слышал о TWI, И2с интерфейс. Как с помощью их передавать данные на ПК. Подойдет ли к моей задаче?
Потрогал лапой паяльник
Сообщения: 315
Зарегистрирован: Пт янв 29, 2010 19:42:27

Сообщение 12val12 »

а LPT есть?
если нет то как сказано накапливаешь 300-400точек в буффере и сливаешь по Rs232

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


while (1)  {   // бесконечный цикл
    
 
label1:    
  for( ; ; ) //  синхронизация rs232
   {     
         delay_us(1000);
          priem=getchar() ; 
        if (priem  == 1)   break  ;  
     }         
 for( ; ; ) //  синхронизация rs232
   {     
         delay_us(1000);
          priem=getchar()  ;
   if (priem  == 254)   break  ;   
      if (priem  != 254) ;
    goto  label1 ;
     }             
          
    fr=getchar();  //Прием фазы синхронизации
     por=getchar();//Прием уровень синхр         
     
////-------- меряем большую частоту      
TCCR1A = 0;
TCNT1 = 0;
TCCR1B = (1<<CS12)|(1<<CS11)|(1<<CS10); // разрешаем счет
delay_us(4000);  //
delay_us(4000);  // 8millisec         
TCCR1B = 0; // останавливаем счет
Freq = TCNT1; // кол-во импульсов входной частоты   
 putchar(Freq>>8);
 putchar(Freq & 0xFF);

////-------- меряем малую частоту      
TCCR1A = 0;
TCNT1 = 0;
TCCR1B = (1<<CS12)|(1<<CS11)|(1<<CS10); // разрешаем счет
delay_us(4000);  //
delay_us(4000);  // 
delay_us(4000);  //
delay_us(4000);  // 
 delay_us(4000);  //
delay_us(4000);  // 
delay_us(4000);  //
delay_us(4000);  //   
delay_us(4000);  //
delay_us(4000);  // 
delay_us(4000);  //
delay_us(4000);  // 
 delay_us(4000);  //
delay_us(4000);  // 
delay_us(4000);  //
delay_us(4000);  // 64millisec          
TCCR1B = 0; // останавливаем счет
Freq = TCNT1; // кол-во импульсов входной частоты   
 putchar(Freq>>8);
 putchar(Freq & 0xFF);




//   if((PIND &(1<<3))==0)  // ;  // если нажата pd3 на корпус переворачиваем фазу синхронизации
// {
//       if (fr) fr=0;
//        else fr=1;
//       }

 temp= PINC;
if (fr) {
//PORTD.6=1;  //лед горит если синхр по фронту
     for (xi=0;xi<2540;xi++) {
      temp1 = PINC;
      if ((temp1-temp) >por) break ; // 0 -> 1 detected
      temp = temp1;
                                   }
} else {
//PORTD.6=0 ;   //лед негорит если синхр по спаду
  for (xi=0;xi<2540;xi++) {
    temp1 = PINC;
    if ((temp-temp1)>por) break ; // 1 -> 0 detected
    temp = temp1;          
 }
 }
 
    
//*********хиррурчическое вмешательство****************
readADC_3(); // получение данных в буфер (процедура ацп (8бит на порту С)
// putchar(1);  // отправка стартового кода
// putchar(1);
// putchar(254);  // отправка стартового кода
// putchar(254);
// for(ij=0;ij<255;ij++) putchar( ij )   ;

for(ij=0;ij<BUFFER;ij++) putchar( adc_array[ij] ); // в цикле сливаем BUFFER байт в порт. BUFFER задан вверху дефайном. 
//*********хиррурчическое вмешательство****************     

} 
 }

на компе

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

 screen 19
dim as integer x,a,u ,z,s, sync1,sync2,k
dim as short j,ykey,ykey2
Dim  As Ubyte msg1
Dim  As Ubyte msg2
Dim  As Ubyte delta,fr,por
dim as double t,t2,r1,r2,st,freq
'dim as integer xMOUS, yMOUS, buttonsMOUS,resMOUS,LMOUS,RMOUS,MMOUS
dim as Ubyte h (16000)
'dim as Ubyte hm (16000)
ykey= 64
ykey2= 192
 
Open Com "com1: 57600, N, 8, 1,cs0,ds0,cd0,rs " As #4 
'Com_port=&hCf00

DO


msg1=1                'синхронизация
  Put #4,,msg1         'синхронизация
  msg1=254           'синхронизация
  Put #4,,msg1         'синхронизация

  fr=1              
  Put #4,,fr      
  por=15          
  Put #4,,por       
  
Get #4,,msg1
h (1)= msg1
Get #4,,msg1
h (2)= msg1
freq=(h(1)*256+h(2))*2
  Locate 2,10
     Print Using "freq high   kHz   #######.## ";freq 
Get #4,,msg1
h (1)= msg1
Get #4,,msg1
h (2)= msg1
freq=(h(1)*256+h(2))/4
  Locate 3,10
     Print Using "freq low <16mhz   #######.## ";freq 

  begin:     
   t=timer 
     for x=0 to  842
  '       for k=0 to 60
             Get #4,,msg1 ' get data terminated with CR
          h (x)= msg1
      '      h (x)=inp(&H3f8) 
   t2=timer
     Locate 1,60
     Print Using "time cycle ######.## "; (t2-t)   
      
'sleep 1
     next x
'   for x=1 to 802 
'       r1= (h(x+1)-h(x-1))/0.1
 '      r2= (h(x+1)-2*h(x)+h(x-1))/0.01
 '      for st=-0.9 to 0.9 step 0.1
'       hm((x+st)*10)=h(x)+r1*st ' r2*st*st
 '    next st
 '     next x

locate 1,20:PRINT  "average=";u
s=0 
u=0
pause1: 
'' sleep 1
IF MULTIKEY(&h50)   THEN ykey = ykey-2 
        IF MULTIKEY(&h48)   THEN ykey = ykey+2 
   IF MULTIKEY(&h51)   THEN ykey2 = ykey2-2 
        IF MULTIKEY(&h49)   THEN ykey2 = ykey2+2     
  
'goto ultra_x
for x=1 to 799
     line (x,80)-(x,599),0
     s= h(x)+s      
      pset(x,590-ykey),2
    pset(x,590-ykey2),11
     pset(x,590-0)   
    pset(x,590-128*2),5   
      pset(x,590-255*2),6
     line (x,590-h(x)*2)-(x,590-h(x-1)*2),3
     pset(x,590-h(x)*2),6
next x 

goto endx
ultra_x:
for x=1 to 79 
    for j=0 to 9
     line (x*10+j,80)-((x-1)*10+j,599),0 'затираем
     next j
     s= h(x)+s
      pset(x*10,590-ykey),2
      pset(x*10,590-ykey2),11
      pset(x*10,590-128*2),5   
      pset(x*10,590-255*2),6
     line (x*10,590-h(x)*2)-((x-1)*10,590-h(x-1)*2),1
     pset ((x-1)*10,590-h(x-1)*2+1)
next x 
endx:
     u=s/799
          Locate 2,60
     Print Using "y-line-key green###.##"; ykey/2
             Locate 3,60
     Print Using "y-line-key      ###.##"; ykey2/2
      IF MULTIKEY(&h4F)   THEN goto  pause1:
LOOP WHILE NOT MULTIKEY(&h1)
Close
WHILE INKEY$ = "": WEND
PRINT "Press any key to exit..."
 
это осциллоскоп 11 мегасамплов 800 точек +простейший частотомер на16бит таймере
ух ты.... показывает
Родился
Сообщения: 13
Зарегистрирован: Пт мар 12, 2010 13:15:24

Сообщение sergx1300 »

Большое спасибо 12val12 :beer: , буду пробовать
Родился
Сообщения: 13
Зарегистрирован: Пт мар 12, 2010 13:15:24

Сообщение sergx1300 »

Первая часть програми я так понял для МК. А вторая?
Потрогал лапой паяльник
Сообщения: 315
Зарегистрирован: Пт янв 29, 2010 19:42:27

Сообщение 12val12 »

а вторая на компе (freebasic )

стёк объявить 16 байт если не влезет тогда 24 (маловероятно +буффер сдвинуть на 8 вниз)
иначе залезет стёк на осциллограмму день бился
http://forum.ixbt.com/post.cgi?id=attach:48:8965:595:1
вобщем через недельку у тебя заработает если сидеть по 5 часов
вначале обьявить функцию чтения ацп

#include <mega8.h>
#include <delay.h>
#define UDRE UCSRA.5
#define BUFFER 843

unsigned char read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage .. .керамику на ноги Aref Avcc
//delay_us(10);задержкку потом корректировать
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCH;
}
// ADC initialization
// ADC Clock frequency: ----
// ADC Voltage Reference: Int., cap. on AREF
// ADC Auto Trigger Source: None
// Only the 8 most significant bits of
// the AD conversion result are used
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x86;


readADC_3(); -процедудура чтения ацп 843 точки

void readADC_3 ()
{
for(ij=0;ij<843;ij++)
adc_array[ij]=read_adc(Number_adc_input)
}
я могу кинуть весть текст но там под внешний 8бит паррлельный ацп ..
смысл в том что 400 точек 10бинтых (800 8 битных) как два пальца (для оперативки 1024 байта
но не надо забывать что не непрерывное сканирование а лишь куски (0.16сек ) потом передача гдето 0.15 сек отображение тоже доли секунд
итого будешь наблюдать только треть времени
ух ты.... показывает
Родился
Сообщения: 13
Зарегистрирован: Пт мар 12, 2010 13:15:24

Сообщение sergx1300 »

О freebasic впервие слишу. Ето какаята командная строка, что ли. Как с ней работать? Ёщо, LPT есть.
Потрогал лапой паяльник
Сообщения: 315
Зарегистрирован: Пт янв 29, 2010 19:42:27

Сообщение 12val12 »

Lpt позволяет минимум 250кбайт в секунду при програмной синхронизации
а при EPP 800..
freebasic позволяет напрямую работаь с портами
IDE под него FBide
ух ты.... показывает
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»