zltigo 0 15 декабря, 2016 Опубликовано 15 декабря, 2016 · Жалоба Спросить на форуме, что мне с этим делать. Ваши проблемы начались с того, что Вы даже спросить на форуме не смогли. По крайней мере я не заметил в этой теме ни одного понявшего Ваше желание :(. Так что вместо упреков в том, что Вам начали рассказывать про UART и прочее, соберитесь со своим мыслями и попрбуйте их изложить. Судя по беспомощности Вами ранее написанного, Вам для начала следует вообще забыть про слова АЦП, вывод и 10 бит и постараться просто сформулировать задачу взаимодействия контролера с каким-то внешним устройством. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 15 декабря, 2016 Опубликовано 15 декабря, 2016 · Жалоба Прочитайте ADCW в отдельную переменную и выдвигайте ее. Замаскировал все биты, кроме младшего, сравнил результат с нулем, послал в порт в зависимости от результата. Сдвинул переменную. И т.д. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Onkel 1 15 декабря, 2016 Опубликовано 15 декабря, 2016 · Жалоба действительно, непонятно, что вам нужно на выходе - что-то аналоговое (если речь про шим зашла) или как-то сформировать цифровой последовательный сигнал? Кстати если мало уартов - сформировать уарт на выход нетрудно, можно хоть десять их сформировать, нужен только один таймер. Может будет яснее, если вы скажете, что вы будете подключать к мк, для чего выход? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ikm 0 16 декабря, 2016 Опубликовано 16 декабря, 2016 · Жалоба Ваши проблемы начались с того, что Вы даже спросить на форуме не смогли. По крайней мере я не заметил в этой теме ни одного понявшего Ваше желание :(. Так что вместо упреков в том, что Вам начали рассказывать про 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 16 декабря, 2016 Опубликовано 16 декабря, 2016 · Жалоба А почему не циклом? for (int i = 10; i > 0; i--) { ADC_temp >>= 1; ... } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 16 декабря, 2016 Опубликовано 16 декабря, 2016 · Жалоба 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 получите кашу из импульсов. Что вы с ними потом делать будете? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Serhiy_UA 1 16 декабря, 2016 Опубликовано 16 декабря, 2016 · Жалоба Есть еще способ, когда выдаются не полные значения измеренных кодов, а их приращения от одного измерения к следующему (в народе это называют - АДИКМ). В некоторых случаях, и возможно Вашем, с микроконтроллером, это может быть полезным. В свое время была задача оценить точность АЦП в 2МГц на 16 разрядов на стабильном синусе. Остановились на том, что без передачи кодов в компьютер с последующей обработкой не обойтись, да и генератор синуса тоже должен был быть не из дешевых. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 16 декабря, 2016 Опубликовано 16 декабря, 2016 · Жалоба Вот так: 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; Вопросов больше нет. Это плинтус :( на уровне которого обсуждать просто нечего :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ikm 0 16 декабря, 2016 Опубликовано 16 декабря, 2016 · Жалоба Во первых это работать не будет. Во вторых, даже если поправить косяки в коде (и даже если переделать его на один цикл, как ViCo предлагал), вы на PORTB.1 получите кашу из импульсов. Что вы с ними потом делать будете? Почему Вы тратите свое время на написание поста с вопросом- зачем мне это надо? Ведь намного полезнее указать мне на мои косяки да бы они не повторялись. И что вы подразумеваете под "кашей"? Если Вам и правда так интересно зачем мне это всё, то лишь для того чтобы посмотреть осцилом и затем предать на антенну. Причем сразу скажу никакой второй антенны и приёмника не будет. Вопросов больше нет. Это плинтус :( на уровне которого обсуждать просто нечего :( Мне очень важен Ваш уровень, можете измерить его линейкой и добавить измерения в подпись. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Onkel 1 16 декабря, 2016 Опубликовано 16 декабря, 2016 · Жалоба не будет работать потому что у вас = вместо ==, и не будет работать потому что вы не сможете отличить 1111000000 от 0000001111 - на экране осциллографа они будут выглядеть одинаково Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 16 декабря, 2016 Опубликовано 16 декабря, 2016 · Жалоба И потому, что сравнивать придется не с 0 и 1, а каждый раз с разными. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ikm 0 16 декабря, 2016 Опубликовано 16 декабря, 2016 · Жалоба не будет работать потому что у вас = вместо ==, и не будет работать потому что вы не сможете отличить 1111000000 от 0000001111 - на экране осциллографа они будут выглядеть одинаково А мне и не надо их отличать. А за синтаксис спасибо. При отладке кода в симуляторе (когда конечно до этого дойдет), заведу для синхронизации на доп ножку начало преобразования и от неё синхронизирусь. И потому, что сравнивать придется не с 0 и 1, а каждый раз с разными. Да, это я поспешил с выводами и забыл,что при "И" остается единица, но в том бите который я маскирую. Т.е. верно будет только для сравнения младшего бита, а потом надо сравнивать результат с 0х02, 0х04 ... 0х200. Ну и конечно тоже завести эту переменную на цикл увеличения, как Вы ранее посоветовали. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 16 декабря, 2016 Опубликовано 16 декабря, 2016 · Жалоба И книжку Кернигана и Ричи "Язык программирования C" скачайте. Если вдумчиво прочитать, да еще попробовать задания выполнить, то можно сильно продвинуться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 16 декабря, 2016 Опубликовано 16 декабря, 2016 · Жалоба Почему Вы тратите свое время на написание поста с вопросом- зачем мне это надо?Потому что то, что вы написали невозможно применить в каких либо практических целях. Вот я и пытаюсь понять, что вы патались сделать. 'Вывести 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); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
skripach 5 18 декабря, 2016 Опубликовано 18 декабря, 2016 · Жалоба Может ТСу нужен R-2R ЦАП чтобы осциллографом наблюдать. Чет вспомнилось. :santa2: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться