Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
15.01.2015, 17:16
|
|
Заблокирован
Регистрация: 26.12.2013
Сообщений: 379
Сказал спасибо: 66
Сказали Спасибо 61 раз(а) в 23 сообщении(ях)
|
Форматирование данных и передача даных UART
устройство считывает 6 аналоговых сигналов и каждый в виде числа 0-1024 отсылает в ПК
в итоге получается посылка типа _12_245_456_753_425_1005
проблема в том, что числа имеют разное количество знаков и на компьютере будет сложнее разделить их
исходник
Код:
|
#include ‹mega8.h›
#include ‹delay.h›
#include ‹stdio.h›
interrupt [ADC_INT] void adc_isr(void){
printf("%d",ADCW); // печатаем в УАРТ значение
delay_ms(1);
}
void init(void){
ADCSRA=0b10011111;
ADMUX=0;
MCUCR=0x0A;
GICR=0xC0;
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x0C;
#asm ("sei");
}
void main(void)
{
init();
while(1){
ADMUX=0;
ADCSRA=0b11011111;
printf("%e_",ADCW);
delay_ms(1);
ADMUX=1;
ADCSRA=0b11011111;
printf("%e_",ADCW);
delay_ms(1);
ADMUX=2;
ADCSRA=0b11011111;
printf("%e_",ADCW);
delay_ms(1);
ADMUX=3;
ADCSRA=0b11011111;
printf("%e_",ADCW);
delay_ms(1);
ADMUX=4;
ADCSRA=0b11011111;
printf("%e_",ADCW);
delay_ms(1) ;
ADMUX=5;
ADCSRA=0b11011111;
printf("%e_",ADCW);
delay_ms(1);
putchar(0x0D); // на новую строку УАРТА
}
} |
как для этого сделать ответную часть программы на компьютере?
C. C++
устройство я спаял, в терминал данные приходят
|
|
|
|
15.01.2015, 17:21
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,270 раз(а) в 1,563 сообщении(ях)
|
Re: форматирование данных и передача даных UART
Сообщение от WindoЗavr
|
проблема в том
|
Проблема высосана из пальца ...
__________________
Осторожно , злой кот
|
|
|
|
15.01.2015, 17:31
|
|
Заблокирован
Регистрация: 21.01.2014
Сообщений: 589
Сказал спасибо: 7
Сказали Спасибо 267 раз(а) в 206 сообщении(ях)
|
Re: форматирование данных и передача даных UART
Сообщение от WindoЗavr
|
числа имеют разное количество знаков
|
Посылайте числа так
Цитата:
|
printf("%5d",ADCW);
|
и будет одинаковое количество знаков, по 5 знаков в каждой посылке
Цитата:
|
" 12 245 456 753 425 1005"
|
Затем в компьютере полученную строку разбиваете на группы по 5 символов и преобразуете обратно в целое число.
Можно просто посылать по 2 байта ADCW на каждое измерение без преобразования в символы. Строка будет короче. Ведь посылаете данные от одного процессора другому, им проще понимать байты, а не символы.
Тогда вместо 30 байт символов будет послана такая строка данных 12 байт
Цитата:
|
0x00 0x0C 0x00 0xF5 0x01 0xC8 0x02 0xF1 0x01 0xA9 0x03 0xED
|
Последний раз редактировалось Yurkin2014; 15.01.2015 в 17:46.
|
|
|
|
15.01.2015, 17:45
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: форматирование данных и передача даных UART
Ребят, он читает десятибитный ADCH + ADCR и шлёт его в комп.
Какое к зелёной бабушке выравнивание?
|
|
|
|
15.01.2015, 17:47
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: форматирование данных и передача даных UART
|
|
|
|
15.01.2015, 18:07
|
|
Заблокирован
Регистрация: 26.12.2013
Сообщений: 379
Сказал спасибо: 66
Сказали Спасибо 61 раз(а) в 23 сообщении(ях)
|
Re: форматирование данных и передача даных UART
а как на компе с ком порта получить данные и восстановить первоначальные значения?
|
|
|
|
15.01.2015, 19:07
|
|
Гражданин KAZUS.RU
Регистрация: 16.03.2011
Сообщений: 486
Сказал спасибо: 8
Сказали Спасибо 131 раз(а) в 116 сообщении(ях)
|
Re: форматирование данных и передача даных UART
Сообщение от WindoЗavr
|
а как на компе с ком порта получить данные и восстановить первоначальные значения?
|
Распарсить как-нибудь.
Как-то так:
Код:
|
static char AdcBuffer[5];
static unsigned char AdcDigitIndex;
unsigned short LastAdc;
void ResetParsing()
{
AdcDigitIndex=0;
AdcBuffer[0]=AdcBuffer[1]=AdcBuffer[2]=AdcBuffer[3]=AdcBuffer[4]=0;
}
void ParseOutput(unsigned char new_byte)
{
if (isdigit(new_byte)) {
if (AdcDigitIndex‹5)
AdcBuffer[AdcDigitIndex++]=new_byte;
else
ResetParsing();
}
else {
if (new_byte=='_') {
if (AdcDigitIndex) {
LastAdc=read_int(AdcBuffer);// какая-либо функция для преобразования их текста в число
}
}
ResetParsing();
}
} |
P.S. Может лучше в бинарном виде передавать и сразу все каналы в одном пакете?
P.S. 2. Номер канала не помешало бы добавить.
Последний раз редактировалось _Артём_; 15.01.2015 в 19:32.
|
|
|
|
15.01.2015, 19:37
|
|
Заблокирован
Регистрация: 26.12.2013
Сообщений: 379
Сказал спасибо: 66
Сказали Спасибо 61 раз(а) в 23 сообщении(ях)
|
Re: форматирование данных и передача даных UART
Сообщение от _Артём_
|
P.S. Может лучше в бинарном виде передавать и сразу все каналы в одном пакете?
P.S. 2. Номер канала не помешало бы добавить.
|
а зачем номер, они всё равно в одном порядке передаются
на счёт двоички я думал, но не понял как преобразовать в неё
|
|
|
|
15.01.2015, 19:53
|
|
Гражданин KAZUS.RU
Регистрация: 16.03.2011
Сообщений: 486
Сказал спасибо: 8
Сказали Спасибо 131 раз(а) в 116 сообщении(ях)
|
Re: форматирование данных и передача даных UART
Сообщение от WindoЗavr
|
а зачем номер, они всё равно в одном порядке передаются
|
Ну а кто из них какой как узнать? Они же по кругу крутятся. Или это не важно?
Сообщение от WindoЗavr
|
на счёт двоички я думал, но не понял как преобразовать в неё
|
В смысле на МК не понятно как?
Код:
|
void SendAdc(unsigned short adc_sample)
{
while (UCSRA&(1‹‹UDRE)==0) ;
UDR=adc_sample&0xFF;
while (UCSRA&(1‹‹UDRE)==0) ;
UDR=adc_sample››8;
} |
|
|
|
|
15.01.2015, 20:14
|
|
Заблокирован
Регистрация: 26.12.2013
Сообщений: 379
Сказал спасибо: 66
Сказали Спасибо 61 раз(а) в 23 сообщении(ях)
|
Re: Форматирование данных и передача даных UART
я борланд с++ установил, пытаюсь разобраться
а куда ваш код с парсингом вставлять?
там разные кнопки надо создавать, или окошки?
мне пока нужно чтоб то, что выдаёт контроллер, показывалось в каком нибудь окошке, дальше я уже разберусь
я в интернете поискал, нигде толком ничего не написано
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 03:24.
|
|