В Коде Для16F676 Надо Поменять Для 7Сег. Индикатора С Общим Анодом На Катод

20-12-2014, 21:48 От: admin Посмотрели: 274
Программа имеет режим калибровки, переходящая туда кнопкой на 13 ноге, после этого светятся 00 на индикаторах, это соответствует 0 литров в емкости, потом еще раз нажимается кнопка, на индикаторах 02, это соответствует 2 литрам, в это время надо залить два литра, датчик реостатного типа изменит напряжение на 12 ноге, МК запоминает точку в eeprom. Так доходит до 40 литров и программа переходит в режим измерения. При изменении реостатом напряжения программа показывает литры, причем нечетные цифры тоже, как среднее значение между четными (калибровались же значения только четные 00 02 04 06 и т.д.), так вот, программа рассчитана на индикатор с общим анодом, а надо сменить на общий катод, на форуме где нашел эту схему один чувак сказал как это сделать, но я сделал и ничего не вышло.

Форум устройства http://bezkz.su/foru...c/286-bakometr/ (делал базовую схему)

Вот что чувак сказал:



Цитата


Мужеки потскажите где в прошивке изменить с общего Анода на Котод?

Не шарю сильно в исходнике.

Чтобы поменять индикатор (тут оригинал),

надо править (инвертировать) знакогенератор



procedure Led(i: byte);

begin

if I=0 then begin

portc:=$04;

porta.4:=0;

end;

if I=1 then begin

portc:=$2D;

porta.4:=1;

end;

if I=2 then begin

portc:=$22;

porta.4:=0;

end;

if I=3 then begin

portc:=$28;

porta.4:=0;

end;

if I=4 then begin

portc:=$09;

porta.4:=1;

end;

if I=5 then begin

portc:=$18;

porta.4:=0;

end;

if I=6 then begin

portc:=$10;

porta.4:=0;

end;

if I=7 then begin

portc:=$0D;

porta.4:=0;

end;

if I=8 then begin

portc:=$00;

porta.4:=0;

end;

if I=9 then begin

portc:=$08;

porta.4:=0;

end;

end;



и обслугу разрядов.



delay_ms(1);

if i.0 then begin

C2 := 0;

Led(L10);

C1 := 1;

end else

begin

C1 := 0;

Led(L1);

C2 := 1;

end;



[color]=#ff0000]я поменял таким образом:





Цитата


procedure Led(i: byte);

begin

if I=0 then begin

portc:=$FB;

porta.4:=1;

end;

if I=1 then begin

portc:=$D2;

porta.4:=0;

end;

if I=2 then begin

portc:=$DD;

porta.4:=1;

end;

if I=3 then begin

portc:=$D7;

porta.4:=1;

end;

if I=4 then begin

portc:=$F6;

porta.4:=0;

end;

if I=5 then begin

portc:=$E7;

porta.4:=1;

end;

if I=6 then begin

portc:=$EF;

porta.4:=1;

end;

if I=7 then begin

portc:=$F2;

porta.4:=1;

end;

if I=8 then begin

portc:=$FF;

porta.4:=1;

end;

if I=9 then begin

portc:=$F7;

porta.4:=1;

end;

end;



А вот весь код программы:







Цитата


program bakometr;

const
stNormal : byte = 1;
stCalibr : byte = 2;
AdrHi : byte = 20;
litr : array [0..AdrHi] of byte = (0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40);

var
C1 : sbit at porta.5;
C2 : sbit at porta.2;
i,j,cc: byte;
V : word; absolute 0x30;
Vhi : byte; absolute 0x31;
VLo : byte; absolute 0x30;

L10,L1:byte;
dat : array [0..AdrHi] of byte;
mode : byte;
calibrN : byte;

procedure Led(i: byte);
begin
if I=0 then begin
portc:=$FB;
porta.4:=1;
end;
if I=1 then begin
portc:=$D2;
porta.4:=0;
end;
if I=2 then begin
portc:=$DD;
porta.4:=1;
end;
if I=3 then begin
portc:=$D7;
porta.4:=1;
end;
if I=4 then begin
portc:=$F6;
porta.4:=0;
end;
if I=5 then begin
portc:=$E7;
porta.4:=1;
end;
if I=6 then begin
portc:=$EF;
porta.4:=1;
end;
if I=7 then begin
portc:=$F2;
porta.4:=1;
end;
if I=8 then begin
portc:=$FF;
porta.4:=1;
end;
if I=9 then begin
portc:=$F7;
porta.4:=1;
end;
end;

procedure delay10;
begin
delay_ms(10);
end;

procedure ReadData;
begin
for i := 0 to AdrHi do dat[i]:=EEPROM_Read(i);
end;

begin
porta := %00010000;
trisa := %11001011;
portc := $FF;
trisc := 0;
wpua := 1;
cmcon := $07;
ansel := 2;
adcon0:= 4;
adcon1:= $30;

mode:=stNormal;
ReadData;
ADC_Init;
i:=0;
while true do
begin
inc(I);
if mode = stNormal then
begin
{ if (i.7) and (V<6) then
begin
C1:=0;
C2:=0;
end; }
if i=0 then
begin
V:=ADC_Read(1);
V:=V shr 2;
if V<=dat[AdrHi]
then V:=litr[adrHi]
else begin
if V>=dat[0]
then V:=litr[0]
else begin
for j:=0 to AdrHi-1 do
if (V<=dat[j]) and (V>dat[j+1]) then cc:=j;
if cc=AdrHi
then V:=Litr[AdrHi]
else begin
V:= (dat[cc]-V);
j:=(Litr[cc+1]-Litr[cc]);
V:= V * j;
j:=(dat[cc]-dat[cc+1]);
V:= V / j;
V:= V + litr[cc];
end;
end;
end;
L10:= v div 10;
L1 := V mod 10;
if (porta.0 = 0) then
begin
C1:=1;
C2:=1;
portc:=$3B;
porta.4:=1;
calibrN:=0;
mode:=stCalibr;
delay10;
repeat until porta.0 = 1;
delay10;
end;
end;
end;
if mode = stCalibr then
begin
L10:=litr[calibrN] div 10;
l1:=litr[calibrN] mod 10;
if i>127 then
begin
C1:=0;
C2:=0;
end;
if porta.0 = 0 then
begin
delay10;
repeat until porta.0 = 1;
delay10;
V:=adc_read(1);
V:=V shr 2;
EEPROM_Write(calibrN,VLo);
inc(calibrN);
if calibrN>AdrHi then
begin
mode:= stNormal;
CalibrN:=0;
delay10;
delay10;
delay10;
delay10;
ReadData;
end;
end;
end;

delay_ms(1);
if i.0 then begin
C2 := 1;
Led(L10);
C1 := 0;
end else
begin
C1 := 1;
Led(L1);
C2 := 0;
end;
end;

end.

Раздел: PIC

Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться, либо войти на сайт под своим именем.

Обсудить на форуме


На момент добавления В Коде Для16F676 Надо Поменять Для 7Сег. Индикатора С Общим Анодом На Катод все ссылки были рабочие.
Все публикации статей, книг и журналов, представлены на этом сайте, исключительно для ознакомления,
авторские права на эти публикации принадлежат авторам статей, книг и издательствам журналов!
Подробно тут | Жалоба

Добавление комментария

Ваше имя:*
E-Mail:*
Текст:
Вопрос:
В чем измеряется сопротивление?
Ответ:*
Введите два слова, показанных на изображении:


Опрос

Ваши предпочтения в TRX


Одинарное преобразование
Двойное преобразование
Прямое преобразование
SDR
Другое
Мне всё равно

Популярные новости
Календарь новостей
«    Август 2018    »
ПнВтСрЧтПтСбВс
 12345
6789101112
13141516171819
20212223242526
2728293031