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

Помогите Разобраться С Работой Ацп Pic16F676


denkop

Рекомендуемые сообщения

Контроллерами занимаюсь относительно недавно, собираю вольтметр. Вот схема:

post-172770-0-40493500-1373464348_thumb.jpg

Вот код:

#include <htc.h>
#include "pic.h"
#ifndef _XTAL_FREQ
#define _XTAL_FREQ 4000000
#endif
#include "lcd.h"

__CONFIG(WDTDIS & UNPROTECT & MCLRDIS & RCIO & INTOSCIO);
//

void main() {
TRISA=0b00000001;
TRISC=0;
PORTA=0;
PORTC=0;
CMCON=0x07;
ANSEL=0b00000001;
ADCON0=0b10000001;
ADCON1=0b01100000;
int h_adc, l_adc;
unsigned char v;
lcd_init();
lcd_goto(0);
lcd_puts("U=");
__delay_ms(100);
GODONE=1;
while (GODONE) {}
l_adc=ADRESL;
h_adc=ADRESH;
v=l_adc+h_adc*256;
lcd_puts(v);
//lcd_goto(0x40);
//lcd_puts("I=0.00");

for(;;

}

Доходит до цикла ожидания конца преобразования и ждёт до бесконечности... В протеусе есть два варнинга:

post-172770-0-73869700-1373464727_thumb.jpg

Судя по всему проблема с делителем, перепробовал все варианты от F/2 до F/64. Никаких изменений(..

Милион раз скурил даташит по теме ADC, просмотрел кучу похожих примеров, с виду всё сделано как в примерах, в соответствии с предписаниями даташита, но всё равно не работает.

в чём проблема не пойму((...

Помогите пож, люди добрые, разобраться в чём проблема!

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

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

__CONFIG(WDTDIS & UNPROTECT & MCLRDIS & RCIO & INTOSCIO);

два разных генератора? или нет?

сорь, тут глупость, это последний вариант, изначально стоял & INTOSCIO.. на проблему никак не повлияло

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

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

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

while(GODONE);

не выбран канал, аналоговый, в ADCON0

Изменено пользователем Catcatcat
Ссылка на комментарий
Поделиться на другие сайты

в протезе, в настройках МК какая частота выставлена?

для 4МГц делитель для АЦП=1/16

4МГц частота стоит. А слово конфигурации туда вписывать нужно? Или оно из прошивки загруженной берётся?

Поставил делитель 1/16, проблема осталась(..

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

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

while(GODONE);

не выбран канал, аналоговый, в ADCON0

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

по поводу канала, из даташита биты 4-2 отвечают за канал, у меня 000, что соотвествует AN0:

bit 4-2 CHS2:CHS0: Analog Channel Select bits

000 =Channel 00 (AN0)

001 =Channel 01 (AN1)

010 =Channel 02 (AN2)

011 =Channel 03 (AN3)

100 =Channel 04 (AN4)

101 =Channel 05 (AN5)

110 =Channel 06 (AN6)

111 =Channel 07 (AN7)

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

Проблема решена, как обычно причина не решаемых вопросов, оказывается до нельзя банальной)

Почему то нельзя вход ацп вешать на Vdd индикатора. Поставил батарейку подключил на вход, проблема решилась.

Но меряет почему то не верно.. От 3V батарейки, получил значение 640. Где то встречал, что цифру полученную с ацп, нужно ещё на 2 умножать, но здесь больше напрашивается, что нужно наоборот делить на 2..

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

Опорка 5в. 10бит ацп. 3*1024/5=614...

> Правила форума <

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

...это не дым от канифоли, нет... это души умерших транзисторов....

Первый закон Ома: никому не рассказывать про Ома!

Ну вот, а ты говорил ноль...

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

Опорка 5в. 10бит ацп. 3*1024/5=614...

Про эти вычисления забыл напрочь.. Спасибо!

Ещё вопрос нарисовался. Допустим меряю источник 4.78В

 int h_adc, l_adc;
unsigned int buf1, buf2;
char ss[];

lcd_init();

while (1)
{
__delay_ms(100);
GODONE=1;
while (GODONE) {}
l_adc=ADRESL;
h_adc=ADRESH;
buf1=(l_adc+h_adc*256)*5;
buf2=buf1%1024;
buf1=buf1/1024;

lcd_goto(0);    
sprintf(ss, "U=%d.%d V ", buf1, buf2);
lcd_puts(ss);
lcd_goto(0x40);    
sprintf(ss, "UU=%dA ", 0);
lcd_puts(ss);
}

Получаю buf1=4, buf2=794. Откуда взялось 794?

С ацп считано значение 978. 978*5/1024=4.775390625, т.е. в buf2 должно быть 77539.. (до какого разряда обрезается значение тоже не понятно), а у меня почему то 794..

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

Причём тут остаток от деления и дробная часть ? Это две разные вещи.

Математика 3 класса... ужас... :vava:

ничего не могу придумать в свое оправдание, наверное жара влияет так :crazy: глупость пришла с какого то из примеров :rake:

переделал код, принял он вот такой вид:

GODONE=1;
while (GODONE) {}
l_adc=ADRESL;
h_adc=ADRESH;
buf3=(l_adc+h_adc*256)*5;
buf1=buf3/1024;
buf2=((buf3/1024)-buf1)*100;
lcd_goto(0);   
sprintf(ss, "U=%d.%d V ", buf1, buf2);
lcd_puts(ss);
lcd_goto(0x40);   
sprintf(ss, "UU=%d A ", buf3);
lcd_puts(ss);

В buf2 всё время 0...

Я скоро с ума сойду с этими примитивными задачами на которые уходит время часами :wall::shok:

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

Чтобы получить дробную часть, остаток же тоже нужно делить :)

buf1=(l_adc+h_adc*256)*5;
buf2=buf1%1024;
buf1=buf1/1024;
buf2*=1000; // 794*1000 = 794000
buf2/=1024; // 794000/1024 = 775 - вот они, ваши тысячные ....
lcd_goto(0);
sprintf(ss, "U=%d.%d V ", buf1, buf2);

Если нужно до сотых, то умножаем не на 1000, а на 100, тогда получим 77 - это будут сотые от деления.

PS: Не забывайте, переменные должны быть размером больше 2-х байт.

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

buf1=(l_adc+h_adc*256)*5;
buf2=buf1%1024;
buf1=buf1/1024;
buf2*=1000; // 794*1000 = 794000
buf2/=1024; // 794000/1024 = 775 - вот они, ваши тысячные ....
lcd_goto(0);
sprintf(ss, "U=%d.%d V ", buf1, buf2);

Оно работает :dance2::thank_you2:!!!

честно говоря даже не слышал о таком методе получения дробной части :umnik2: если не трудно киньте пож ссылкой где разжёван этот метод :vava::thank_you2:

не даёт покоя, почему всё таки не работает этот способ? buf2=((buf3/1024)-buf1)*100;

больше 2х байт я так понимаю акутально только для buf2?

ещё вопрос возник, а чем отличаются два куска кода? этот:

buf2=buf1%1024;
buf2*=100;
buf2/=1024;

и этот:

buf2=(buf1%1024)*100/1024;

первый работает правильно, второй чушь какую то выдает :wacko:

Изменено пользователем Alex
Ссылка на комментарий
Поделиться на другие сайты

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

Представьте, например Вы делите число 15 на 4, результатом будет - 3.75, это если с дробью. Если с целым числом, то частное будет равно 3, остаток тоже 3. Сразу видно, что остаток (число 3) никак не связан с дробной частью (75/100). Так вот, чтобы получить дробную часть, нам этот остаток также нужно поделить на 4, т.к. мы его отсеяли и он остался неделимым. В итоге, если 4 разделить на 3, получается 0.75 - вот она, эта дробная часть. Но нам её нужно привести к целому числу, предположим с точностью до сотых. Для этого мы умножаем наш остаток на 100 и только после этого делим результат на 4, получается 300/4 = 75.

Вот и вся арифметика :)

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

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

Представьте, например Вы делите число 15 на 4, результатом будет - 3.75, это если с дробью. Если с целым числом, то частное будет равно 3, остаток тоже 3. Сразу видно, что остаток (число 3) никак не связан с дробной частью (75/100). Так вот, чтобы получить дробную часть, нам этот остаток также нужно поделить на 4, т.к. мы его отсеяли и он остался неделимым. В итоге, если 4 разделить на 3, получается 0.75 - вот она, эта дробная часть. Но нам её нужно привести к целому числу, предположим с точностью до сотых. Для этого мы умножаем наш остаток на 100 и только после этого делим результат на 4, получается 300/4 = 75.

Вот и вся арифметика :)

Понял, спасибо :thank_you2:

А разъясните пож, почему два куска которые писал выше, работают по разному?

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

А разъясните пож, почему два куска которые писал выше, работают по разному?
Тут не понятно. Возможно, buf1 имеет размер 2 или меньше байт. Но это только предположение. Запустите программу в отладчике и попробуйте выловить проблему.
Ссылка на комментарий
Поделиться на другие сайты

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

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

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

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

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

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

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...