Перейти к содержанию
    

Как вывести 10 бит АЦП через один вывод

Спросить на форуме, что мне с этим делать.

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

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Прочитайте ADCW в отдельную переменную и выдвигайте ее. Замаскировал все биты, кроме младшего, сравнил результат с нулем, послал в порт в зависимости от результата. Сдвинул переменную. И т.д.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

действительно, непонятно, что вам нужно на выходе - что-то аналоговое (если речь про шим зашла) или как-то сформировать цифровой последовательный сигнал?

Кстати если мало уартов - сформировать уарт на выход нетрудно, можно хоть десять их сформировать, нужен только один таймер.

Может будет яснее, если вы скажете, что вы будете подключать к мк, для чего выход?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

С чего вы взяли, что у меня начались проблемы?

Спасибо большое, за анализ написанных мною ранее "трудов".

Я никого не упрекал, а наоборот извинился, что не предположил, что мне могут посоветовать УАРТ и не описал полностью задачу сначала.

Я бы тоже посоветовал Вам, перестать смотреть на всех с высока и не лезть с ролью доблестного рыцаря в защиту обиженных и угнетенных, для это го есть модераторы.

Прочитайте 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;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А почему не циклом?

for (int i = 10; i > 0; i--) {

ADC_temp >>= 1;

...

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 получите кашу из импульсов. Что вы с ними потом делать будете?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть еще способ, когда выдаются не полные значения измеренных кодов, а их приращения от одного измерения к следующему (в народе это называют - АДИКМ).

В некоторых случаях, и возможно Вашем, с микроконтроллером, это может быть полезным.

В свое время была задача оценить точность АЦП в 2МГц на 16 разрядов на стабильном синусе. Остановились на том, что без передачи кодов в компьютер с последующей обработкой не обойтись, да и генератор синуса тоже должен был быть не из дешевых.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот так:

 

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;

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Во первых это работать не будет. Во вторых, даже если поправить косяки в коде (и даже если переделать его на один цикл, как ViCo предлагал), вы на PORTB.1 получите кашу из импульсов. Что вы с ними потом делать будете?

Почему Вы тратите свое время на написание поста с вопросом- зачем мне это надо?

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

 

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

 

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

не будет работать потому что у вас = вместо ==, и не будет работать потому что вы не сможете отличить 1111000000 от 0000001111 - на экране осциллографа они будут выглядеть одинаково

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И потому, что сравнивать придется не с 0 и 1, а каждый раз с разными.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

не будет работать потому что у вас = вместо ==, и не будет работать потому что вы не сможете отличить 1111000000 от 0000001111 - на экране осциллографа они будут выглядеть одинаково

А мне и не надо их отличать. А за синтаксис спасибо. При отладке кода в симуляторе (когда конечно до этого дойдет), заведу для синхронизации на доп ножку начало преобразования и от неё синхронизирусь.

И потому, что сравнивать придется не с 0 и 1, а каждый раз с разными.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И книжку Кернигана и Ричи "Язык программирования C" скачайте. Если вдумчиво прочитать, да еще попробовать задания выполнить, то можно сильно продвинуться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Почему Вы тратите свое время на написание поста с вопросом- зачем мне это надо?
Потому что то, что вы написали невозможно применить в каких либо практических целях. Вот я и пытаюсь понять, что вы патались сделать. 'Вывести 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);   
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...