АЦП на PIC16f877

Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить
VyacheslavMakarov
Родился
Сообщения: 1
Зарегистрирован: Ср авг 02, 2023 01:14:49

АЦП на PIC16f877

Сообщение VyacheslavMakarov »

Здравствуйте, учусь работе с pic16f877. Сейчас пытаюсь сделать на нем АЦП с выводом данных на дисплей 16х2 (возможно будет дисплей больше). В симуляции Proteus вход читает напряжение и на выходе есть правильное число 5В=1024 единиц, но не выводится текстовая строка функции Show(). Так же есть проблема на стенде. Загрузил код в ПИК, подаю питание 5В с БП, но на дисплее мусор. Не понимаю почему мусор - пайку проверил - все отлично, пин контрастности дисплея на 0В, никаких замыканий, МК прошился без ошибок и прошел проверку. :(

файлы проекта ниже
https://disk.yandex.ru/d/AoUpxvmp4boqAA

код main.c
Спойлер

Код: Выделить всё

#include<pic.h>
#include "string.h"
#define delay for(i=0;i<=1000;i++)
#define rs RC0
#define rw RC1
#define e RC2

__CONFIG(0x3D7A);

void adc();
void lcd_int();
void cmd(unsigned char a);
void dat(unsigned char b);
void show(unsigned char *s);

int i;

void main()
{
	TRISB=TRISC=0; //Порт B и порт C выхода LCD
	TRISA0=1; //RA0 - вход
	TRISA1=1; //RA1 - вход
	lcd_int(); //Инициализация LCD
	show("ADC Value :");
	while(1) {
	cmd(0x8C);
	adc();
	}
}

void lcd_int()
{
	cmd(0x38);
	cmd(0x0c);
	cmd(0x06);
	cmd(0x80);
}

void cmd(unsigned char a)
{
	PORTB=a;
	rs=0;
	rw=0;
	e=1;
	delay;
	e=0;
}

void dat(unsigned char b)
{
	PORTB=b;
	rs=1;
	rw=0;
	e=1;
	delay;
	e=0;
}

void show(unsigned char *s) //текстовая строка к результату
{
	while(*s) {
	dat(*s++);
	}
}

void adc()
{
	unsigned int adcval;
	ADCON1=0b11000000;
	ADCON0=0b10000101;
	while(ADGO);
	adcval=((ADRESH<<8)|(ADRESL)); //результат
	adcval=(adcval);
	dat((adcval/1000)+48);
	dat(((adcval/100)%10)+48);
	dat(((adcval/10)%10)+48);
	dat((adcval%10)+48);
}
Реклама
Аватара пользователя
Alexey1969
Вымогатель припоя
Сообщения: 622
Зарегистрирован: Чт мар 05, 2009 05:31:16
Откуда: г. Кемерово
Контактная информация:

Re: АЦП на PIC16f877

Сообщение Alexey1969 »

Дык, на дисплей то вообще, что то выводится ?
Реклама
veso74
Поставщик валерьянки для Кота
Сообщения: 1907
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

Re: АЦП на PIC16f877

Сообщение veso74 »

.
Изображение
Martian
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32
Контактная информация:

Re: АЦП на PIC16f877

Сообщение Martian »

забавно, плюс-минус на дисплее перепутаны, но работает :)
Реклама
Эиком - электронные компоненты и радиодетали
veso74
Поставщик валерьянки для Кота
Сообщения: 1907
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

Re: АЦП на PIC16f877

Сообщение veso74 »

[uquote="VyacheslavMakarov",url="/forum/viewtopic.php?p=4455747#p4455747"]... но на дисплее мусор ...[/uquote]
LCD - медленное устройство. Проверьте время в инициализации и время загрузки данных. #define delay for(i=0;i<=1000;i++) не привязано к выбранной тактовой частоте. Найдите способ переписать его другим способом (либо компилятором: delay?, либо с относительным расчетом чрез F clock/crystal). Напр. hd66712u.pdf, стр. 431: Initializing by Instruction, Figure 29 Initializing Flow of 8-Bit Interface есть моменты с delay, с которыми нужно точно исполнить (напр. Wait for more than 4.1 ms, 100 ms).

Это то, что вижу на первый взгляд. Если откуда-то скопировали код, возьмите для первого теста clock/кварц и др. 1:1.
Реклама
Аватара пользователя
Alex_641
Поставщик валерьянки для Кота
Сообщения: 2314
Зарегистрирован: Вт янв 26, 2021 22:33:21

Re: АЦП на PIC16f877

Сообщение Alex_641 »

MCLR наверное лучше через сопрот на плюс, и кондёр на землю. Чё бы сброс был на время переходных процессов включения питания.
Не спрашивай по ком звонит колокол, он звонит по тебе !
Реклама
Ответить

Вернуться в «PIC»