2 ацп в uart

Обсуждаем контроллеры компании Atmel.
Minasmorgul
Родился
Сообщения: 17
Зарегистрирован: Сб фев 07, 2015 20:21:27

2 ацп в uart

Сообщение 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);
}
}
Реклама
Аватара пользователя
Mishany
Электрический кот
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

Re: 2 ацп в uart

Сообщение Mishany »

както так
#include <stdio.h>
/////////
printf("data_adc_1%x \r\n",value);
printf("data_adc_2%x \r\n",value2);
Реклама
Minasmorgul
Родился
Сообщения: 17
Зарегистрирован: Сб фев 07, 2015 20:21:27

Re: 2 ацп в uart

Сообщение Minasmorgul »

Так в том то и дело что необходимо чтобы данные выводились разом "значение1;значение2"
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18647
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: 2 ацп в uart

Сообщение ARV »

Minasmorgul писал(а):необходимо чтобы данные выводились разом "значение1;значение2"
круто! тогда вот так:

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

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

Мой уютный бложик... заходите!
Реклама
Эиком - электронные компоненты и радиодетали
Minasmorgul
Родился
Сообщения: 17
Зарегистрирован: Сб фев 07, 2015 20:21:27

Re: 2 ацп в uart

Сообщение Minasmorgul »

т.е. в моем варианте получается

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



int main(void)
{
portSetup();
setUART();
setADC();
while(1)
{
outputUART(printf("%x ; %x \r\n", readADC(0), readADC(1)));
_delay_ms(400);
}
}
Что-то результат непонятный на выходе получается
Реклама
mas123
Потрогал лапой паяльник
Сообщения: 312
Зарегистрирован: Вс июл 29, 2012 16:25:39

Re: 2 ацп в uart

Сообщение 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() - пусть передает строку.
Реклама
Minasmorgul
Родился
Сообщения: 17
Зарегистрирован: Сб фев 07, 2015 20:21:27

Re: 2 ацп в uart

Сообщение 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);
}
}
Аватара пользователя
Mishany
Электрический кот
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

Re: 2 ацп в uart

Сообщение Mishany »

функция printf сама загружает в UDR,
как это переваривает компилятор: outputUART(printf("%x ; %x \r\n", readADC(0), readADC(1)));?
mas123
Потрогал лапой паяльник
Сообщения: 312
Зарегистрирован: Вс июл 29, 2012 16:25:39

Re: 2 ацп в uart

Сообщение 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()?
Minasmorgul
Родился
Сообщения: 17
Зарегистрирован: Сб фев 07, 2015 20:21:27

Re: 2 ацп в uart

Сообщение Minasmorgul »

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

outputUART(printf("%x ; %x \r\n", readADC(0), readADC(1)));
Выводит лишь символы "FF" в hex
Аватара пользователя
Mishany
Электрический кот
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

Re: 2 ацп в uart

Сообщение Mishany »

чтото с цитатами напутано...)))
Minasmorgul пролистайте stdio.h и посмотрите что делают там функции...
mas123
Потрогал лапой паяльник
Сообщения: 312
Зарегистрирован: Вс июл 29, 2012 16:25:39

Re: 2 ацп в uart

Сообщение mas123 »

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

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

Сама функция printf() производит вывод в стандартный поток вывода. А на каком основании сделан вывод, что это UART?
Minasmorgul
Родился
Сообщения: 17
Зарегистрирован: Сб фев 07, 2015 20:21:27

Re: 2 ацп в uart

Сообщение Minasmorgul »

пролистайте stdio.h и посмотрите что делают там функции...
полистал. Ответа на свой вопрос не нашел!
А именно: передай по UART один символ, полученный как результат работы функции printf().
Написал же ж, мне не нужен символ! Мне нужна строка определенного формата, с определенным содержимым!
Более того, выше у меня даже есть функция вывода строки, но и она выдает ошибки(конкретно не получается в нее загнать данные от двух ацп). Поэтому и спрашиваю тут, авось кто и ткнет в ошибку
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18647
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: 2 ацп в uart

Сообщение ARV »

Minasmorgul писал(а):Мне нужна строка определенного формата, с определенным содержимым!
приведите пример строки, которую вы хотите увидеть.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Minasmorgul
Родился
Сообщения: 17
Зарегистрирован: Сб фев 07, 2015 20:21:27

Re: 2 ацп в uart

Сообщение Minasmorgul »

приведите пример строки, которую вы хотите увидеть.
строка такого вида data_adc_1;data_adc_2 например 1234;1224
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18647
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: 2 ацп в uart

Сообщение ARV »

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

Мой уютный бложик... заходите!
Minasmorgul
Родился
Сообщения: 17
Зарегистрирован: Сб фев 07, 2015 20:21:27

Re: 2 ацп в uart

Сообщение Minasmorgul »

куда конкретней уж?!
в терминале должно быть 1023;104 где 1023 - значение первого ацп, 104 - значение второго ацп
mas123
Потрогал лапой паяльник
Сообщения: 312
Зарегистрирован: Вс июл 29, 2012 16:25:39

Re: 2 ацп в uart

Сообщение mas123 »

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

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

Re: 2 ацп в uart

Сообщение Minasmorgul »

пробовал
send_Uart_str(printf("%x ; %x \r\n", readADC(0), readADC(1)));
все также тишина на выходе uart
функция printf сама загружает в UDR
Вы читать умеете? Это вообще не я писал!
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: 2 ацп в uart

Сообщение COKPOWEHEU »

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

Вернуться в «AVR»