Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.65/43: Рейтинг темы: голосов - 43, средняя оценка - 4.65
1 / 1 / 0
Регистрация: 14.06.2014
Сообщений: 100

Работа с АЦП (PIC16F676)

01.12.2014, 22:56. Показов 8641. Ответов 31
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
МК pic16f676
Задача: попробовать сделать АЦП.
Код программы:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
    
 
    #include <htc.h>
    #include <lcd.h> //библиотека ЖК
    #define _XTAL_FREQ 4000000 //4МГц
     
    __CONFIG(WDTDIS & UNPROTECT & MCLREN & LVPDIS & HS);
    unsigned int adc_rd;
    unsigned char volt=[];
    unsigned int ADC_1;//внутренняя переменная АЦП
    main (){
     
    CMCON=0x07;// отключаем компаратор
    ANSEL = 0b00111111; //порты AN0-AN5 включены как аналоговые
    ADCON0 = 0b00111000; // аналоговый вход AN7 -- подача напряжения
    ADCON1 = 0x00;   // Reference voltage is Vdd
    TRISC = 0b00000000; // PORTC All Outputs
    TRISA = 0b00100000; // PORTA All Outputs, Except AN6
    //дисплей
    lcd_init(); //инициализация дисплея
    lcd_goto(0);    // переместиться на первую линию
     
    adc_rd = ADC_Read(7); // читаем выходной регистр АЦП с 7 канала
    ADC_1 = adc_rd/2;
     
    volt[0] = ADC_1/1000 + 48; //первое число
    volt[1] = (ADC_1/100)%10 + 48; //второе число
    volt[3] = (ADC_1/10)%10 + 48; //третие число
     
     
    __delay_ms(150);   // задержка
    __delay_ms(150);   // задержка
    lcd_puts(volt);
     
    while (1){}
    }
Выдает следующие ошибки:
C
1
2
3
4
5
6
7
8
9
10
11
    
 
    Error   7.20 expression syntax
    Warning  21.10 function declared implicit int
    Error    24.9 pointer required
    Error    24.9 pointer required
    Error    25.9 pointer required
    Error    25.9 pointer required
    Error    26.9 pointer required
    Error    26.9 pointer required
    Warning  31.14 illegal conversion of integer to pointer
вроде как все правильно сделано, а все равно ругается.. . не знаю... .
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.12.2014, 22:56
Ответы с готовыми решениями:

Работа с ИЖК (PIC16F676, HiTech)
Здравствуйте! Никак не получается работать с ЖК на pic16f676.... На других некоторых пробовал (pic16f628, pic16f877, pic16f874), а на...

PIC16F676
делаю плату и не могу найти диаметр для PIC16F676

ATtiny13. Работа с АЦП (Си)
необходима информация о том, как правильно можно использовать ЦАП и компаратор в паре, а именно с встроенного ЦАП подать некое напряжение...

31
1 / 1 / 0
Регистрация: 14.06.2014
Сообщений: 100
05.12.2014, 17:06  [ТС]
Студворк — интернет-сервис помощи студентам
Владимир. Валерий понял в чем у меня проблема.
Вроде можно как-то через массив вывести, но я не знаю как может подскажите... а Вот функции lcd:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
void
lcd_write(unsigned char c)
{
   __delay_us(40);
   LCD_DATA = ( ( c >> 4 ) & 0x0F );
   LCD_STROBE();
   LCD_DATA = ( c & 0x0F );
   LCD_STROBE();
}
 
/*
 *    Clear and home the LCD
 */
 
void
lcd_clear(void)
{
   LCD_RS = 0;
   lcd_write(0x1);
   __delay_ms(2);
}
 
/* write a string of chars to the LCD */
 
void
lcd_puts(const char * s)
{
   LCD_RS = 1;   // write characters
   while(*s)
      lcd_write(*s++);
}
 
/* write one character to the LCD */
 
void
lcd_putch(char c)
{
   LCD_RS = 1;   // write characters
   lcd_write( c );
}
 
 
/*
 * Go to the specified position
 */
 
void
lcd_goto(unsigned char pos)
{
   LCD_RS = 0;
   lcd_write(0x80+pos);
}
   
/* initialise the LCD - put into 4 bit mode */
void
lcd_init()
{
   char init_value;
 
   CMCON  = 0x07;    // Disable analog pins on PORTA
 
   init_value = 0x3;
   TRISA=0;
   TRISC=0;
   LCD_RS = 0;
   LCD_EN = 0;
   LCD_RW = 0;
   
   __delay_ms(15);   // wait 15mSec after power applied,
   LCD_DATA    = init_value;
   LCD_STROBE();
   __delay_ms(5);
   LCD_STROBE();
   __delay_us(200);
   LCD_STROBE();
   __delay_us(200);
   LCD_DATA = 2;   // Four bit mode
   LCD_STROBE();
 
   lcd_write(0x28); // Set interface length
   lcd_write(0xF); // Display On, Cursor On, Cursor Blink
   lcd_clear();   // Clear screen
   lcd_write(0x6); // Set entry Mode
}
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
void
lcd_write(unsigned char c)
{
   __delay_us(40);
   LCD_DATA = ( ( c >> 4 ) & 0x0F );
   LCD_STROBE();
   LCD_DATA = ( c & 0x0F );
   LCD_STROBE();
}
 
/*
 *    Clear and home the LCD
 */
 
void
lcd_clear(void)
{
   LCD_RS = 0;
   lcd_write(0x1);
   __delay_ms(2);
}
 
/* write a string of chars to the LCD */
 
void
lcd_puts(const char * s)
{
   LCD_RS = 1;   // write characters
   while(*s)
      lcd_write(*s++);
}
 
/* write one character to the LCD */
 
void
lcd_putch(char c)
{
   LCD_RS = 1;   // write characters
   lcd_write( c );
}
 
 
/*
 * Go to the specified position
 */
 
void
lcd_goto(unsigned char pos)
{
   LCD_RS = 0;
   lcd_write(0x80+pos);
}
   
/* initialise the LCD - put into 4 bit mode */
void
lcd_init()
{
   char init_value;
 
   CMCON  = 0x07;    // Disable analog pins on PORTA
 
   init_value = 0x3;
   TRISA=0;
   TRISC=0;
   LCD_RS = 0;
   LCD_EN = 0;
   LCD_RW = 0;
   
   __delay_ms(15);   // wait 15mSec after power applied,
   LCD_DATA    = init_value;
   LCD_STROBE();
   __delay_ms(5);
   LCD_STROBE();
   __delay_us(200);
   LCD_STROBE();
   __delay_us(200);
   LCD_DATA = 2;   // Four bit mode
   LCD_STROBE();
 
   lcd_write(0x28); // Set interface length
   lcd_write(0xF); // Display On, Cursor On, Cursor Blink
   lcd_clear();   // Clear screen
   lcd_write(0x6); // Set entry Mode
}
0
62 / 187 / 31
Регистрация: 14.02.2013
Сообщений: 1,701
05.12.2014, 17:13
Вы с начало научитесь хотя бы с дисплеем работать на основе готовых функций.
Просто выведете текст на дисплей.
Схему включения дисплея покажите.
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
05.12.2014, 17:30
вот так например можно вывести char
C++
1
2
3
4
for(int i=100;i>0;i/=10)
 {
    lcd_putch((v/i)%10+0x30);
  }
0
62 / 187 / 31
Регистрация: 14.02.2013
Сообщений: 1,701
05.12.2014, 19:00
Чё там выводить когда не видно как включён дисплей и как определены порты микроконтроллера на этот дисплей.
0
1 / 1 / 0
Регистрация: 14.06.2014
Сообщений: 100
06.12.2014, 00:27  [ТС]
Владимир... Текст выводит. Порты как настроены из программы видно.
Ну вот схема.... http://storage7.static.itmages... 92f61d.jpg
Валерий, спасибо, попробую.
0
62 / 187 / 31
Регистрация: 14.02.2013
Сообщений: 1,701
06.12.2014, 13:53
Вот просто так скажем переменную типо int нельзя вывести на дисплей в том виде в каком хранится в ней значение.
Для этого вам необходимо преобразовать числовые данные в строку.
Ищите для этого преобразования готовую функцию в htc.
Далее чтобы объединить старший и младший байт ADRESH и ADRESL нужно воспользоваться союзом UNION.
Вот рабочий пример на MicroC

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
char txt[16];
short tmp;
 
union
{
unsigned short i[2];
unsigned int sd;
}ui;
 
void main() 
{
 
ADC_Init();
Lcd_Init();
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
while(1)
{
tmp = ADC_Read(2);        //не обращать внимание
ui.i[0]=ADRESL;
ui.i[1]=ADRESH;
 
IntToStr(ui.sd, txt);     //преобразование числа в переменной unsigned int sd в
                          //в строку и запись строки в массив char txt[16]
Lcd_Out(1,1,txt);         //вывод содержимог массива char txt[16] на дисплей
}
}
0
1 / 1 / 0
Регистрация: 14.06.2014
Сообщений: 100
06.12.2014, 14:56  [ТС]
Владимир, а что за MicroC? Код отличается от моего если у меня mplab?
Валерий, сегодня попробовал подключил скинутый вами pic16f676.h и у меня не копилируется... Точно так ли все?
Сделал строку как вы рекомендовали с помощью цикла, но жило на индикаторе почему-то 000. на вход подавал 3В...
Код про вычисления АЦП выглядит так:
C
1
2
3
l_adc=ADRESL;
h_adc=ADRESH;
v=l_adc+h_adc*256;
Отображение ведь все равно должно быть отличным от нуля....
0
62 / 187 / 31
Регистрация: 14.02.2013
Сообщений: 1,701
06.12.2014, 15:05
Цитата Сообщение от user437 Посмотреть сообщение
Отображение ведь все равно должно быть отличным от нуля....
В принципе должно.

Добавлено через 5 минут
В общем советую вам начать изучения C++.
Установите себе Microsoft Visual Studio C++ бесплатную версию. Скачайте пару книг для начинающих программистов на C++ и начинайте изучать C++.
0
1 / 1 / 0
Регистрация: 14.06.2014
Сообщений: 100
06.12.2014, 17:25  [ТС]
Ой. Как обычно накосячил) Не туда вставил функцию) Но теперь всегда выдает 230... Какое напряжение бы я не подавал....
Валерий, объясните пожалуйста логику каким образом переводится так число в строку....
И как быть с pic16f676.h и lcd.h? Если их добавлять, то не компилируется и выдает ошибки, а если htc.h и lcd.c, то нет.

Добавлено через 2 часа 4 минуты
Пф... Не знаю, что творится... Теперь ошибку не выдает на v... Но при этом ничего не высвечивается....

Выдает на индикатор F... Прошу переписать программу. Я уже замучился....
(не уверян, что все биты верно поставил, включая __CONFIG)
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <htc.h>
#define _XTAL_FREQ 4000000
#include "lcd.c"
__CONFIG(WDTDIS & UNPROTECT & MCLRDIS & INTOSCIO);
main() {
RA0=1; //вывод RA0 вход
CMCON=0x07;//компаратор отключен
ADCON0=0b10000011;//разрешен АЦП, аналоговый порт RA0, рабочая частота 32.
ADCON1=0b00000000;//fosc/2
ANSEL=0b000000001;//RA0 аналоговый
int h_adc, l_adc;
unsigned char v;
__delay_ms(100);
l_adc=ADRESL;
h_adc=ADRESH;
__delay_ms(100);
v=l_adc+h_adc*1024;
__delay_ms(100);
lcd_init();
lcd_goto(0);
lcd_putch(v);
while(1);
}
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
06.12.2014, 17:42
Цитата Сообщение от user437 Посмотреть сообщение
unsigned char v;
Цитата Сообщение от user437 Посмотреть сообщение
v=l_adc+h_adc*1024;
это как???
unsigned char имеет значения от 0 до 255
0
1 / 1 / 0
Регистрация: 14.06.2014
Сообщений: 100
06.12.2014, 17:45  [ТС]
а как же тогда? я читал, что надо умножать на разрядность....
если сделать просто v=l_adc+h_adc, то высветится h
0
1 / 1 / 0
Регистрация: 14.06.2014
Сообщений: 100
08.12.2014, 21:27  [ТС]
все решил вроде. но почему умножать на 256 объясните пожалуйста
ацп то 10 разрядный
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.12.2014, 21:27
Помогаю со студенческими работами здесь

Работа с АЦП PIC16F688
Здравствуйте! Подскажите пожалуйста мне про АЦП. Если используем левое выравнивание, то надо использовать только H? но тогда ведь не...

Работа с АЦП ADuC842
Всем доброго времени суток, помогите пожалуйста найти решение моей проблемы! Необходимо найти программным путем измерить амплитуду и...

PIC16F676. Конфигурация МК
Уважаемые форумчане помогите новичку. Я пытаюсь написать программу под pic16f676. вернее пытаюсь разобраться с прерываниями по INT, Так вот...

Работа с АЦП микроконтроллером PIC
movlw b'11111111' movwf TRISA movlw b'00000001' movwf TRISB clrf TRISD bcf STATUS, RP0 Если добавить код ...

Работа АЦП
Доброго времени суток! Решил я немного поиграться с АЦП и написал простенький скетч, с инициализацией. Всё отлично работало для одного...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
32
Ответ Создать тему
Новые блоги и статьи
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru