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

2 ацп в uart

Добавлено: Ср мар 02, 2016 22:48:58
Minasmorgul
Пытаюсь передавать в uart сразу несколько данных( с двух ацп), но не знаю как вывести их в виде data_adc_1;data_adc_2 по крайней мере хочу чтобы в терминале шли данные. Основная проблема как вывести строковую переменную, которая и будет выходом в терминал, состоящую из нескольких char.
Спойлер

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

#define F_CPU 8000000L
#define BAUD	9600L
#define UBRRL_VALUE	(F_CPU/(BAUD*16))-1
#include
#include
void setUART(void);
void outputUART(unsigned char key);
void portSetup(void);
void setADC(void);
//void readADC(unsigned int adc_input);
char buf0[5];
char buf1[5];
void setADC(void){
ADMUX = (1<<6);
ADCSRA|=(1<<ADPS0)|(1<<ADPS1)|(1<<ADPS2);
ADCSRA|=(1<<ADEN);
}
unsigned int readADC(unsigned int ch)
{
unsigned char set_admux = ADMUX;
set_admux&=~((1<<MUX3)|(1<<MUX2)|(1<<MUX1)|(1<<MUX0));
switch(ch)
{
case 0: set_admux|=((0<<MUX4)|(0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(0<<MUX0)); break;
case 1: set_admux|=((0<<MUX4)|(0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(1<<MUX0)); break;
case 2: set_admux|=((0<<MUX4)|(0<<MUX3)|(0<<MUX2)|(1<<MUX1)|(0<<MUX0)); break;
case 3: set_admux|=((0<<MUX4)|(0<<MUX3)|(0<<MUX2)|(1<<MUX1)|(1<<MUX0)); break;
default: break;
}
ADMUX=set_admux;
_delay_us(10);
int tmp=0;
for (int i=0;i<64;i++)
{
ADCSRA|=(1<<ADSC);
while ((ADCSRA&(1<>8;
UBRRL=UBRRL_VALUE;
UCSRA=0;
UCSRB|=(1<<TXEN);
UCSRC!=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
}
void outputUART(unsigned char key){
while ((UCSRA&(1<<UDRE))==0);
UDR=key;
}
void portSetup(void){
DDRA&=~((1<<0)|(1<<1));
}
void send_Uart_str(unsigned char *s)//	Отправка строки
{
while (*s != 0) outputUART(*s++);
}
int main(void)
{
portSetup();
setUART();
setADC();
while(1)
{
char a=(readADC(0)+'0');
char b=(readADC(1)+'0');
outputUART(a+b);
_delay_ms(400);
}
}

Re: 2 ацп в uart

Добавлено: Чт мар 03, 2016 07:04:35
Mishany
както так
#include <stdio.h>
/////////
printf("data_adc_1%x \r\n",value);
printf("data_adc_2%x \r\n",value2);

Re: 2 ацп в uart

Добавлено: Чт мар 03, 2016 12:44:50
Minasmorgul
Так в том то и дело что необходимо чтобы данные выводились разом "значение1;значение2"

Re: 2 ацп в uart

Добавлено: Чт мар 03, 2016 13:17:59
ARV
Minasmorgul писал(а):необходимо чтобы данные выводились разом "значение1;значение2"
круто! тогда вот так:

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

printf("%x ; %x \r\n", value, value2);
правда, я не понял, почему было приведено в качестве примера %x - я бы использовал, например, %d

Re: 2 ацп в uart

Добавлено: Чт мар 03, 2016 17:28:39
Minasmorgul
т.е. в моем варианте получается

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



int main(void)
{
portSetup();
setUART();
setADC();
while(1)
{
outputUART(printf("%x ; %x \r\n", readADC(0), readADC(1)));
_delay_ms(400);
}
}
Что-то результат непонятный на выходе получается

Re: 2 ацп в uart

Добавлено: Чт мар 03, 2016 19:10:54
mas123
Minasmorgul писал(а):outputUART(printf("%x ; %x \r\n", readADC(0), readADC(1)));
Что-то результат непонятный на выходе получается
Почему странный? Совершенно логичный и правильный.
Функция printf() выводит полученную строку в поток вывода (куда он у тебя подключён?) и возвращает количество выведенных символов.
Как это int-значение воспринимает функция outputUART() - смотри в её описании. Скорее всего, как адрес выводного буфера. :))

Если нужно формировать строку, то воспользуйся sprintf(). Типа такого: sprintf( ptrBuffer, "%x ; %x \r\n", nVal0, nVal1);
А затем содержимое ptrBuffer отдай в outputUART() - пусть передает строку.

Re: 2 ацп в uart

Добавлено: Чт мар 03, 2016 23:29:43
Minasmorgul
outputUART() у меня согласно согласно этому коду. Т.е. простая запись в регистр UDR
В итоге получается чушь на входе.

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

#define F_CPU 8000000L
#define BAUD   9600L
#define UBRRL_VALUE   (F_CPU/(BAUD*16))-1
#include
#include
void setUART(void);
void outputUART(unsigned char key);
void portSetup(void);
void setADC(void);
//void readADC(unsigned int adc_input);
char buf0[5];
char buf1[5];
void setADC(void){
ADMUX = (1<<6);
ADCSRA|=(1<<ADPS0)|(1<<ADPS1)|(1<<ADPS2);
ADCSRA|=(1<<ADEN);
}
unsigned int readADC(unsigned int ch)
{
unsigned char set_admux = ADMUX;
set_admux&=~((1<<MUX3)|(1<<MUX2)|(1<<MUX1)|(1<<MUX0));
switch(ch)
{
case 0: set_admux|=((0<<MUX4)|(0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(0<<MUX0)); break;
case 1: set_admux|=((0<<MUX4)|(0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(1<<MUX0)); break;
case 2: set_admux|=((0<<MUX4)|(0<<MUX3)|(0<<MUX2)|(1<<MUX1)|(0<<MUX0)); break;
case 3: set_admux|=((0<<MUX4)|(0<<MUX3)|(0<<MUX2)|(1<<MUX1)|(1<<MUX0)); break;
default: break;
}
ADMUX=set_admux;
_delay_us(10);
int tmp=0;
for (int i=0;i<64;i++)
{
ADCSRA|=(1<<ADSC);
while ((ADCSRA&(1<>8;
UBRRL=UBRRL_VALUE;
UCSRA=0;
UCSRB|=(1<<TXEN);
UCSRC!=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
}
void outputUART(unsigned char key){
while ((UCSRA&(1<<UDRE))==0);
UDR=key;
}
void portSetup(void){
DDRA&=~((1<<0)|(1<<1));
}
void send_Uart_str(unsigned char *s)//   Отправка строки
{
while (*s != 0) outputUART(*s++);
}
int main(void)
{
portSetup();
setUART();
setADC();
while(1)
{
outputUART(printf("%x ; %x \r\n", readADC(0), readADC(1)));
_delay_ms(400);
}
}

Re: 2 ацп в uart

Добавлено: Пт мар 04, 2016 05:35:11
Mishany
функция printf сама загружает в UDR,
как это переваривает компилятор: outputUART(printf("%x ; %x \r\n", readADC(0), readADC(1)));?

Re: 2 ацп в uart

Добавлено: Пт мар 04, 2016 08:05:37
mas123
Minasmorgul писал(а):void outputUART(unsigned char key){
...
outputUART(printf("%x ; %x \r\n", readADC(0), readADC(1)));
Перевожу на русский язык:
Выполнить функцию printf(), полученный результат этой функции из "int" преобразовать в "unsigned char". Полученный результат (один байт) передать по UART.
Результат функции printf() по стандарту, напомню - количество выведенных символов.
Minasmorgul писал(а):В итоге получается чушь на входе.
Хотелось бы взглянуть на эту "чушь".
Minasmorgul писал(а):функция printf сама загружает в UDR,
В таком случае зачем передавать по UART результат printf()?
И можно взглянуть на реализацию printf()?

Re: 2 ацп в uart

Добавлено: Пт мар 04, 2016 09:29:22
Minasmorgul

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

outputUART(printf("%x ; %x \r\n", readADC(0), readADC(1)));
Выводит лишь символы "FF" в hex

Re: 2 ацп в uart

Добавлено: Пт мар 04, 2016 10:41:05
Mishany
чтото с цитатами напутано...)))
Minasmorgul пролистайте stdio.h и посмотрите что делают там функции...

Re: 2 ацп в uart

Добавлено: Пт мар 04, 2016 13:46:35
mas123
Minasmorgul писал(а):Выводит лишь символы "FF" в hex
Действительно странно, а должно было выводить только один символ с кодом от 0x06 до 0x0E.
Подозреваю, что функция printf() возвращает либо "-1", что, скорее всего, сигнализирует об ошибке. Либо printf() вообще имеет тип void.

В любом случае: программа работает правильно. И работает именно то, что ей сказано.
А именно: передай по UART один символ, полученный как результат работы функции printf().
Не понимаю, для чего это нужно.... ну да ладно.

Сама функция printf() производит вывод в стандартный поток вывода. А на каком основании сделан вывод, что это UART?

Re: 2 ацп в uart

Добавлено: Сб мар 05, 2016 20:01:22
Minasmorgul
пролистайте stdio.h и посмотрите что делают там функции...
полистал. Ответа на свой вопрос не нашел!
А именно: передай по UART один символ, полученный как результат работы функции printf().
Написал же ж, мне не нужен символ! Мне нужна строка определенного формата, с определенным содержимым!
Более того, выше у меня даже есть функция вывода строки, но и она выдает ошибки(конкретно не получается в нее загнать данные от двух ацп). Поэтому и спрашиваю тут, авось кто и ткнет в ошибку

Re: 2 ацп в uart

Добавлено: Сб мар 05, 2016 20:32:47
ARV
Minasmorgul писал(а):Мне нужна строка определенного формата, с определенным содержимым!
приведите пример строки, которую вы хотите увидеть.

Re: 2 ацп в uart

Добавлено: Сб мар 05, 2016 20:41:10
Minasmorgul
приведите пример строки, которую вы хотите увидеть.
строка такого вида data_adc_1;data_adc_2 например 1234;1224

Re: 2 ацп в uart

Добавлено: Сб мар 05, 2016 20:46:24
ARV
я недостаточно четко задал вопрос? хорошо, уточняю: приведите пример строки, которую хотите увидеть без каких бы то ни было комментариев, пояснений и т.п. - только то, что должно быть в терминальной строке. КОНКРЕТНЫЙ ПРИМЕР.

Re: 2 ацп в uart

Добавлено: Сб мар 05, 2016 21:28:46
Minasmorgul
куда конкретней уж?!
в терминале должно быть 1023;104 где 1023 - значение первого ацп, 104 - значение второго ацп

Re: 2 ацп в uart

Добавлено: Сб мар 05, 2016 23:37:06
mas123
Minasmorgul писал(а):
А именно: передай по UART один символ, полученный как результат работы функции printf().
Написал же ж, мне не нужен символ!
Тогда не используй функцию, которая передает только один символ.
Minasmorgul писал(а):Более того, выше у меня даже есть функция вывода строки, но и она выдает ошибки(конкретно не получается в нее загнать данные от двух ацп).
Эта вышеуказанная функция работает совершенно правильно. И делает то, что ты ей сказал сделать, а не то, что хотел от неё.

Ну прими как факт, что outputUART(unsigned char key) передает в UART ОДИН символ.
И второй факт, что функция printf() возвращает int-значение выведенных символов.
Требовать чего-то иного от outputUART( printf(...) ) - бесполезно.
Minasmorgul писал(а):Поэтому и спрашиваю тут, авось кто и ткнет в ошибку
Ошибка в вообще неправильном использовании функций.
Либо сконфигурируй стандартный поток вывода на UART (вот тут не подскажу как), и пользуйся printf() без всяких outputUART().
Либо используй sprintf() - сформируй строку в буфере, а затем передай его содержимое с использованием outputUART().
Minasmorgul писал(а):функция printf сама загружает в UDR
На основании чего сделан такой вывод? И зачем тогда вообще использовать outputUART()?

Re: 2 ацп в uart

Добавлено: Вс мар 06, 2016 00:04:24
Minasmorgul
пробовал
send_Uart_str(printf("%x ; %x \r\n", readADC(0), readADC(1)));
все также тишина на выходе uart
функция printf сама загружает в UDR
Вы читать умеете? Это вообще не я писал!

Re: 2 ацп в uart

Добавлено: Вс мар 06, 2016 01:18:28
COKPOWEHEU
Minasmorgul писал(а):
пролистайте stdio.h и посмотрите что делают там функции...
полистал. Ответа на свой вопрос не нашел!
Не похоже, что полистали. Функция printf возвращает число выведенных в stdout символов. Не сами символы, а только их количество. Возможно, если прочитаете про sprintf, поймете, как этим можно пользоваться. Формирование строки и ее вывод на UART далеко не всегда стоит объединять.