Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить

АЦП на PIC16f877

Ср авг 02, 2023 01:23:32

Здравствуйте, учусь работе с 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);
}

Re: АЦП на PIC16f877

Ср авг 02, 2023 07:59:46

Дык, на дисплей то вообще, что то выводится ?

Re: АЦП на PIC16f877

Ср авг 02, 2023 08:26:06

.
Изображение

Re: АЦП на PIC16f877

Ср авг 02, 2023 11:02:23

забавно, плюс-минус на дисплее перепутаны, но работает :)

Re: АЦП на PIC16f877

Ср авг 02, 2023 11:32:13

... но на дисплее мусор ...

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.

Re: АЦП на PIC16f877

Ср авг 02, 2023 15:58:17

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