1 / 1 / 0
Регистрация: 14.06.2014
Сообщений: 100

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

01.12.2014, 22:56. Показов 8732. Ответов 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,713
05.12.2014, 17:13
Вы с начало научитесь хотя бы с дисплеем работать на основе готовых функций.
Просто выведете текст на дисплей.
Схему включения дисплея покажите.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,874
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,713
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,713
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,713
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
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,874
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
Ответ Создать тему
Опции темы

Новые блоги и статьи
[golang] Угол между стрелками часов
alhaos 12.05.2026
По заданным значениям часа и минуты необходимо определить значение меньшего угла между стрелками аналогового циферблата часов. import "math" func angleClock(hour int, minutes int) float64 { . . .
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html и его же старой инструкции по установке Lazarus с gtk2. . .
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер. Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru