АЦП на PIC16f877
Добавлено: Ср авг 02, 2023 01:23:32
Здравствуйте, учусь работе с pic16f877. Сейчас пытаюсь сделать на нем АЦП с выводом данных на дисплей 16х2 (возможно будет дисплей больше). В симуляции Proteus вход читает напряжение и на выходе есть правильное число 5В=1024 единиц, но не выводится текстовая строка функции Show(). Так же есть проблема на стенде. Загрузил код в ПИК, подаю питание 5В с БП, но на дисплее мусор. Не понимаю почему мусор - пайку проверил - все отлично, пин контрастности дисплея на 0В, никаких замыканий, МК прошился без ошибок и прошел проверку.
файлы проекта ниже
https://disk.yandex.ru/d/AoUpxvmp4boqAA
код main.c
файлы проекта ниже
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);
}