Передача данных с ATmega8 на COM порт ПК
- Сообщения: 13
- Зарегистрирован: Пт мар 12, 2010 13:15:24
А вообще есть слисл превращать данные из ASCII в другой формат в самом МК а затем посылать их на ПК? Увеличится ли быстродействие? 
- Реклама
Нешта я не разумею... Шла речь об printf, я думал, что данные получаются бинарные и printf'ом переводятся в вид для печати. А если там устройство 1000 раз в секунду че-то меряет и выдает уже в символьном коде, я про такое не слыхивал. Насколько помнит мой склероз, АЦП микроконтроллера данные всегда выдает в бинарном виде. Вот ведь век живи - век учись, и не такое увидишь. Так что беру все свои советы обратно.sergx1300 писал(а):А вообще есть слисл превращать данные из ASCII в другой формат в самом МК а затем посылать их на ПК? Увеличится ли быстродействие?
- Сообщения: 3961
- Зарегистрирован: Пн июл 13, 2009 14:37:39
- Откуда: Московская область, наукоград.....
Склероз правильно помнит.
Но С, переводит данные в соответствии со своим представлением.
А коды чисел 0=0х30, 1=0х31, 2=0х32... 9 =0х39, A=0x41, B=0x42, C=0x43, D=0x44, E=0x45, F=0x46.
Оттуда все беды
Но С, переводит данные в соответствии со своим представлением.
А коды чисел 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... не спрашивайте даже
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
- Сообщения: 459
- Зарегистрирован: Вс июн 01, 2008 12:16:38
Зависит от задачи. Если нужно быстродействие, то лучше и интерфейс и АЦП сменить.sergx1300 писал(а):А вообще есть слисл превращать данные из ASCII в другой формат в самом МК а затем посылать их на ПК? Увеличится ли быстродействие?
Естественно если передавать бинарные данные, то получится быстрее, о чем здесь уже как-бы намекали. Но сперва у Вас вопрос был про то как без printf(). Опять-же в текстовом виде данные наглядней получаются и минимальную обработку (типа перевода строки, пробела и т. п.) можно сделать и на МК, зато не придется заморачиваться с программой для ПК - для начала вообще можно гипертерминал запустить и смотреть, хотя терминалки есть и те которые в бинарном виде данные отображают.
- Сообщения: 315
- Зарегистрирован: Пт янв 29, 2010 19:42:27
лично у меня putchar 842 байта за секунду на скорости 57600 передаёт за 0.15 +- 0.1 сек.
быстрее и по теории не будет
вопрос в организации протокола
быстрее и по теории не будет
вопрос в организации протокола
ух ты.... показывает
- Реклама
- Сообщения: 315
- Зарегистрирован: Пт янв 29, 2010 19:42:27
Хотелось бы узнать как принять 9бит посылку по rs232 на компьютере
т е поставить на компе 8бит +чётность
а интерпретировать четность как старший бит
кто нибудь пробовал ?
т е поставить на компе 8бит +чётность
а интерпретировать четность как старший бит
кто нибудь пробовал ?
ух ты.... показывает
- Сообщения: 13
- Зарегистрирован: Пт мар 12, 2010 13:15:24
На практике выяснил, что скорость передачи данные сутево зависит от их разрядности (то есть 1 символьное число передается намного быстрее, чем 4-ри символьное). Думаю что передача данных в другом формате меня неспасет.
Поэтому сделал вывод о переходе на другой интерфейс, только который?!!! Есть еще вариант: реализовать какой-то буфер в МК а затем передавать данные на СОМ ПК. Для начала попробую реализовать буфер и записывать туда данные. Мне хватило бы записать хотяби один период на 200-300 точек.
Помогите с примерами программ, кто чем может.
Поэтому сделал вывод о переходе на другой интерфейс, только который?!!! Есть еще вариант: реализовать какой-то буфер в МК а затем передавать данные на СОМ ПК. Для начала попробую реализовать буфер и записывать туда данные. Мне хватило бы записать хотяби один период на 200-300 точек.
Помогите с примерами программ, кто чем может.
- Сообщения: 315
- Зарегистрирован: Пт янв 29, 2010 19:42:27
тебе нужно 8битные отсчёты или 10битные?
и конктретно расстояние между двумя отсчетами по времени
и конктретно расстояние между двумя отсчетами по времени
ух ты.... показывает
- Сообщения: 13
- Зарегистрирован: Пт мар 12, 2010 13:15:24
Мне нужно 10-битные отсчёты, но для начала можно и 8-битные.
Расстояние между двумя отсчетами по времени 0,1 мСек (100 мкСек).
Расстояние между двумя отсчетами по времени 0,1 мСек (100 мкСек).
- Сообщения: 315
- Зарегистрирован: Пт янв 29, 2010 19:42:27
ну так
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 байт
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 байт
ух ты.... показывает
Ребятки ну какая у Вас вообще может быть проблема-то?
УАРТ то медленный интерфейс хоть и можно из него мегабит выдавить...дак и шлите в компьютер вначале два байта стартовых а потом 8-мибитную разницу со знаком!!!! а на компе уже наваять прогу обработки этих данных ну никаких проблем не составит!!!
+ ко всему вышеперечисленному можно накрутить буффер байт на 100 отправки уартовской и буффер замеров на 100 ацп
всё делать по прерываниям а в основном цикле только проверять если буффер не пустой - перекачать его в выходной немного обработав разницей уверен что проблем не будет! да и если мне не изменяет даташит то.... как то немного совпадает с 115200 Вашего уарта только если передавать будете по одному байту на измерение
УАРТ то медленный интерфейс хоть и можно из него мегабит выдавить...дак и шлите в компьютер вначале два байта стартовых а потом 8-мибитную разницу со знаком!!!! а на компе уже наваять прогу обработки этих данных ну никаких проблем не составит!!!
+ ко всему вышеперечисленному можно накрутить буффер байт на 100 отправки уартовской и буффер замеров на 100 ацп
всё делать по прерываниям а в основном цикле только проверять если буффер не пустой - перекачать его в выходной немного обработав разницей уверен что проблем не будет! да и если мне не изменяет даташит то....
Код: Выделить всё
Up to 15 kSPS at Maximum ResolutionЧто нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
Не доверяйте русским лужам - это может быть вход в метро.
- Сообщения: 13
- Зарегистрирован: Пт мар 12, 2010 13:15:24
Вот что-то написал с передачей данных в буфер.
Благодарю за пример 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); // на новую строку УАРТА
}
}
Благодарю за пример 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
Никаких printf
только putchar
ждем в цикле запроса от компа после запроса выдаём буффер ацп
и прерывания ацп не надо
только putchar
ждем в цикле запроса от компа после запроса выдаём буффер ацп
и прерывания ацп не надо
ух ты.... показывает
- Сообщения: 13
- Зарегистрирован: Пт мар 12, 2010 13:15:24
Об осциллографе уже давно забыл. На таких скоростях нереально.
О программировании вообще ничего незнаю. Это вообще мой первый проект по програмуваню МК. Может кто-то пидправить мою программу.
Слышал о TWI, И2с интерфейс. Как с помощью их передавать данные на ПК. Подойдет ли к моей задаче?
О программировании вообще ничего незнаю. Это вообще мой первый проект по програмуваню МК. Может кто-то пидправить мою программу.
Слышал о TWI, И2с интерфейс. Как с помощью их передавать данные на ПК. Подойдет ли к моей задаче?
- Сообщения: 315
- Зарегистрирован: Пт янв 29, 2010 19:42:27
а LPT есть?
если нет то как сказано накапливаешь 300-400точек в буффере и сливаешь по Rs232
на компе
это осциллоскоп 11 мегасамплов 800 точек +простейший частотомер на16бит таймере
если нет то как сказано накапливаешь 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..."
ух ты.... показывает
- Сообщения: 13
- Зарегистрирован: Пт мар 12, 2010 13:15:24
- Сообщения: 13
- Зарегистрирован: Пт мар 12, 2010 13:15:24
- Сообщения: 315
- Зарегистрирован: Пт янв 29, 2010 19:42:27
а вторая на компе (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 сек отображение тоже доли секунд
итого будешь наблюдать только треть времени
стёк объявить 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
О freebasic впервие слишу. Ето какаята командная строка, что ли. Как с ней работать? Ёщо, LPT есть.
- Сообщения: 315
- Зарегистрирован: Пт янв 29, 2010 19:42:27
Lpt позволяет минимум 250кбайт в секунду при програмной синхронизации
а при EPP 800..
freebasic позволяет напрямую работаь с портами
IDE под него FBide
а при EPP 800..
freebasic позволяет напрямую работаь с портами
IDE под него FBide
ух ты.... показывает


