реклама на сайте
подробности

 
 
4 страниц V  < 1 2 3 4 >  
Reply to this topicStart new topic
> Как вывести 10 бит АЦП через один вывод, Atmega+ CVAVR
zltigo
сообщение Dec 15 2016, 14:23
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(ikm @ Dec 15 2016, 16:06) *
Спросить на форуме, что мне с этим делать.

Ваши проблемы начались с того, что Вы даже спросить на форуме не смогли. По крайней мере я не заметил в этой теме ни одного понявшего Ваше желание sad.gif.
Так что вместо упреков в том, что Вам начали рассказывать про UART и прочее, соберитесь со своим мыслями и попрбуйте их изложить. Судя по беспомощности Вами ранее написанного, Вам для начала следует вообще забыть про слова АЦП, вывод и 10 бит и постараться просто сформулировать задачу взаимодействия контролера с каким-то внешним устройством.



--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
ViKo
сообщение Dec 15 2016, 14:26
Сообщение #17


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Прочитайте ADCW в отдельную переменную и выдвигайте ее. Замаскировал все биты, кроме младшего, сравнил результат с нулем, послал в порт в зависимости от результата. Сдвинул переменную. И т.д.
Go to the top of the page
 
+Quote Post
Onkel
сообщение Dec 15 2016, 19:03
Сообщение #18


Знающий
****

Группа: Свой
Сообщений: 708
Регистрация: 8-05-11
Из: Чг
Пользователь №: 64 861



действительно, непонятно, что вам нужно на выходе - что-то аналоговое (если речь про шим зашла) или как-то сформировать цифровой последовательный сигнал?
Кстати если мало уартов - сформировать уарт на выход нетрудно, можно хоть десять их сформировать, нужен только один таймер.
Может будет яснее, если вы скажете, что вы будете подключать к мк, для чего выход?
Go to the top of the page
 
+Quote Post
ikm
сообщение Dec 16 2016, 07:41
Сообщение #19


Знающий
****

Группа: Свой
Сообщений: 891
Регистрация: 25-12-06
Из: С-Пб
Пользователь №: 23 894



Цитата(zltigo @ Dec 15 2016, 17:23) *
Ваши проблемы начались с того, что Вы даже спросить на форуме не смогли. По крайней мере я не заметил в этой теме ни одного понявшего Ваше желание sad.gif.
Так что вместо упреков в том, что Вам начали рассказывать про UART и прочее, соберитесь со своим мыслями и попрбуйте их изложить. Судя по беспомощности Вами ранее написанного, Вам для начала следует вообще забыть про слова АЦП, вывод и 10 бит и постараться просто сформулировать задачу взаимодействия контролера с каким-то внешним устройством.

С чего вы взяли, что у меня начались проблемы?
Спасибо большое, за анализ написанных мною ранее "трудов".
Я никого не упрекал, а наоборот извинился, что не предположил, что мне могут посоветовать УАРТ и не описал полностью задачу сначала.
Я бы тоже посоветовал Вам, перестать смотреть на всех с высока и не лезть с ролью доблестного рыцаря в защиту обиженных и угнетенных, для это го есть модераторы.
Цитата(ViKo @ Dec 15 2016, 17:26) *
Прочитайте ADCW в отдельную переменную и выдвигайте ее. Замаскировал все биты, кроме младшего, сравнил результат с нулем, послал в порт в зависимости от результата. Сдвинул переменную. И т.д.

Спасибо.
Вот так:

ADC_ch0=ADCW;

ADC_ch0_temp=ADC_ch0 & 0x01 // битовая маска на младший 10-ый бит АЦП
if (ADC_ch0_temp= 0) PORTB.1=0;
if (ADC_ch0_temp= 1) PORTB.1=1;

ADC_ch1_temp=ADC_ch0 & 0x02 // битовая маска на 9-ый бит АЦП
if (ADC_ch0_temp= 0) PORTB.1=0;
if (ADC_ch0_temp= 1) PORTB.1=1;
....

ADC_ch0_temp=ADC_ch0 & 0x200 // битовая маска на 1-ый бит АЦП
if (ADC_ch0_temp= 0) PORTB.1=0;
if (ADC_ch0_temp= 1) PORTB.1=1;


--------------------
ОБХОДЯ РАЗЛОЖЕННЫЕ ГРАБЛИ - ТЫ ТЕРЯЕШЬ ДРАГОЦЕННЫЙ ОПЫТ!!!
Go to the top of the page
 
+Quote Post
ViKo
сообщение Dec 16 2016, 09:08
Сообщение #20


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



А почему не циклом?
for (int i = 10; i > 0; i--) {
ADC_temp >>= 1;
...
}
Go to the top of the page
 
+Quote Post
XVR
сообщение Dec 16 2016, 09:53
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(ikm @ Dec 16 2016, 10:41) *
ADC_ch0=ADCW;

ADC_ch0_temp=ADC_ch0 & 0x01 // битовая маска на младший 10-ый бит АЦП
if (ADC_ch0_temp= 0) PORTB.1=0;
if (ADC_ch0_temp= 1) PORTB.1=1;

ADC_ch1_temp=ADC_ch0 & 0x02 // битовая маска на 9-ый бит АЦП
if (ADC_ch0_temp= 0) PORTB.1=0;
if (ADC_ch0_temp= 1) PORTB.1=1;
....

ADC_ch0_temp=ADC_ch0 & 0x200 // битовая маска на 1-ый бит АЦП
if (ADC_ch0_temp= 0) PORTB.1=0;
if (ADC_ch0_temp= 1) PORTB.1=1;

Во первых это работать не будет. Во вторых, даже если поправить косяки в коде (и даже если переделать его на один цикл, как ViCo предлагал), вы на PORTB.1 получите кашу из импульсов. Что вы с ними потом делать будете?
Go to the top of the page
 
+Quote Post
Serhiy_UA
сообщение Dec 16 2016, 10:29
Сообщение #22


Знающий
****

Группа: Свой
Сообщений: 721
Регистрация: 23-10-08
Из: next to Odessa
Пользователь №: 41 112



Есть еще способ, когда выдаются не полные значения измеренных кодов, а их приращения от одного измерения к следующему (в народе это называют - АДИКМ).
В некоторых случаях, и возможно Вашем, с микроконтроллером, это может быть полезным.
В свое время была задача оценить точность АЦП в 2МГц на 16 разрядов на стабильном синусе. Остановились на том, что без передачи кодов в компьютер с последующей обработкой не обойтись, да и генератор синуса тоже должен был быть не из дешевых.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Dec 16 2016, 10:58
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(ikm @ Dec 16 2016, 09:41) *
Вот так:

ADC_ch0=ADCW;

ADC_ch0_temp=ADC_ch0 & 0x01 // битовая маска на младший 10-ый бит АЦП
if (ADC_ch0_temp= 0) PORTB.1=0;
if (ADC_ch0_temp= 1) PORTB.1=1;

Вопросов больше нет. Это плинтус sad.gif на уровне которого обсуждать просто нечего sad.gif



--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
ikm
сообщение Dec 16 2016, 11:04
Сообщение #24


Знающий
****

Группа: Свой
Сообщений: 891
Регистрация: 25-12-06
Из: С-Пб
Пользователь №: 23 894



Цитата(XVR @ Dec 16 2016, 12:53) *
Во первых это работать не будет. Во вторых, даже если поправить косяки в коде (и даже если переделать его на один цикл, как ViCo предлагал), вы на PORTB.1 получите кашу из импульсов. Что вы с ними потом делать будете?

Почему Вы тратите свое время на написание поста с вопросом- зачем мне это надо?
Ведь намного полезнее указать мне на мои косяки да бы они не повторялись.

И что вы подразумеваете под "кашей"?

Если Вам и правда так интересно зачем мне это всё, то лишь для того чтобы посмотреть осцилом и затем предать на антенну. Причем сразу скажу никакой второй антенны и приёмника не будет.

Цитата(zltigo @ Dec 16 2016, 13:58) *
Вопросов больше нет. Это плинтус sad.gif на уровне которого обсуждать просто нечего sad.gif


Мне очень важен Ваш уровень, можете измерить его линейкой и добавить измерения в подпись.


--------------------
ОБХОДЯ РАЗЛОЖЕННЫЕ ГРАБЛИ - ТЫ ТЕРЯЕШЬ ДРАГОЦЕННЫЙ ОПЫТ!!!
Go to the top of the page
 
+Quote Post
Onkel
сообщение Dec 16 2016, 14:04
Сообщение #25


Знающий
****

Группа: Свой
Сообщений: 708
Регистрация: 8-05-11
Из: Чг
Пользователь №: 64 861



не будет работать потому что у вас = вместо ==, и не будет работать потому что вы не сможете отличить 1111000000 от 0000001111 - на экране осциллографа они будут выглядеть одинаково
Go to the top of the page
 
+Quote Post
ViKo
сообщение Dec 16 2016, 14:11
Сообщение #26


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



И потому, что сравнивать придется не с 0 и 1, а каждый раз с разными.
Go to the top of the page
 
+Quote Post
ikm
сообщение Dec 16 2016, 15:14
Сообщение #27


Знающий
****

Группа: Свой
Сообщений: 891
Регистрация: 25-12-06
Из: С-Пб
Пользователь №: 23 894



Цитата(Onkel @ Dec 16 2016, 17:04) *
не будет работать потому что у вас = вместо ==, и не будет работать потому что вы не сможете отличить 1111000000 от 0000001111 - на экране осциллографа они будут выглядеть одинаково

А мне и не надо их отличать. А за синтаксис спасибо. При отладке кода в симуляторе (когда конечно до этого дойдет), заведу для синхронизации на доп ножку начало преобразования и от неё синхронизирусь.
Цитата(ViKo @ Dec 16 2016, 17:11) *
И потому, что сравнивать придется не с 0 и 1, а каждый раз с разными.

Да, это я поспешил с выводами и забыл,что при "И" остается единица, но в том бите который я маскирую. Т.е. верно будет только для сравнения младшего бита, а потом надо сравнивать результат с 0х02, 0х04 ... 0х200. Ну и конечно тоже завести эту переменную на цикл увеличения, как Вы ранее посоветовали.


--------------------
ОБХОДЯ РАЗЛОЖЕННЫЕ ГРАБЛИ - ТЫ ТЕРЯЕШЬ ДРАГОЦЕННЫЙ ОПЫТ!!!
Go to the top of the page
 
+Quote Post
ViKo
сообщение Dec 16 2016, 16:13
Сообщение #28


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



И книжку Кернигана и Ричи "Язык программирования C" скачайте. Если вдумчиво прочитать, да еще попробовать задания выполнить, то можно сильно продвинуться.
Go to the top of the page
 
+Quote Post
XVR
сообщение Dec 16 2016, 16:50
Сообщение #29


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(ikm @ Dec 16 2016, 14:04) *
Почему Вы тратите свое время на написание поста с вопросом- зачем мне это надо?
Потому что то, что вы написали невозможно применить в каких либо практических целях. Вот я и пытаюсь понять, что вы патались сделать. 'Вывести 10 бит через ножку' - это не ответ, это ваши хотелки.

Цитата
Если Вам и правда так интересно зачем мне это всё, то лишь для того чтобы посмотреть осцилом и затем предать на антенну.

Вот с этого и надо было начинать. Что бы на осцилографе можно было разобрать что имено выводится, нужно выводить так, что бы визуально можно было отделить каждый бит друг от друга и все 10 бит вместе от следующих 10 бит.
Цитата
И что вы подразумеваете под "кашей"
То, что вы получите если выведите все 10 бит 'как есть' друг за другом.

Можно выводить например так:
  • 0 выводится коротким импульсом лог 1
  • 1 выводится длинным импульсом лог 1
  • Разделяются 0 и 1 коротким импульсом лог 0
  • Биты выводятся начиная с младшего
  • После 10 битов делается пауза (в 2 раза длиннее чем импульс 1)

Код
void delay(int dly)
{
volatile char c=i;
while(c--);
}

void send_adc(int value)
{
int cnt;
for(cnt=0;cnt<10;++cnt, value>>=1)
{
   PORTB.1 = 1;
   delay(1+(value&1));
   PORTB.1 = 0;
   delay(1);
}
delay(4);  
}
Go to the top of the page
 
+Quote Post
skripach
сообщение Dec 18 2016, 04:00
Сообщение #30


■ ■ ■ ■
*****

Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443



Может ТСу нужен R-2R ЦАП чтобы осциллографом наблюдать. Чет вспомнилось. santa2.gif


--------------------
Делай что должен и будь что будет.
Go to the top of the page
 
+Quote Post

4 страниц V  < 1 2 3 4 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 16th June 2025 - 06:23
Рейтинг@Mail.ru


Страница сгенерированна за 0.01515 секунд с 7
ELECTRONIX ©2004-2016