Перейти к содержанию

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


vovancheg86

Рекомендуемые сообщения

Программа имеет режим калибровки, переходящая туда кнопкой на 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;

=#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.

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Форум устройства http://bezkz.su/foru...c/286-bakometr/ (делал базовую схему)
По ссылке совершенно ничего нельзя ни скачать ни посмотреть - везде вылезает ошибка доступа.

А региться там, непонятно ради чего, никто не будет.

ЗЫ: совершенно не понятно, для чего на всяких быдлофорумах закрывают доступ гостям. Они что, регистрации коллекционируют чтоли ? :crazy: И в чате всё по-хохляцки :lol2:

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Ах да, извините) забыл совсем, тогда сюда все вставлю оттуда.

http://files.webfile...c410537a5386c13 это исходники mikropascal

http://bezkz.su/_pu/3/21002631.gif схема устройства

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

{ if (i.7) and (V<6) then
begin
C1:=0;
C2:=0;
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.

эти куски кода изменяли?

PS 1. даете код пользуйтесь тегами [CODЕ][/code]

2. не цитируем полностью предыдущие посты, читаем правила форума

Ссылка на комментарий
Поделиться на другие сайты

IMXO,

 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;

Здесь менял, если был ноль ставил 1, если была 1 то ставил 0. Не помогло, абракадабра.

А здесь ничего не менял, что там менять?

 { if (i.7) and (V<6) then
begin
C1:=0;
C2:=0;
end; } 

Ссылка на комментарий
Поделиться на другие сайты

Я не понимаю к сожалению... В принципе я создавал в универе программки на паскале и примерно алгоритмизацию понимаю, но в данном конкретном случае многие команды для меня непонятны, что они делают, какие изменения производятся, как вообще напряжение на ножках появляется и как оно уходит через светодиод на другую ножку (ведь это не земля)...

Ссылка на комментарий
Поделиться на другие сайты

гуглите динамическая индикация....

а вообще схема не соответствует коду....

на схеме три разряда в коде два

для того что бы зажечь нужный сегмент индикатора с обшим анодом

нужно выбрать нужный разряд подав на анод лог1( при этом на другие разряды должен быть подан лог0)

а на нужные сегменты лог.0

для общего катода все на оборот....

a90f804799fa.jpg

Ссылка на комментарий
Поделиться на другие сайты

не та схема у вас, сверху я писал что моя базовая, вы другую открыли, с внешним опорным ее назвали

вот моя схема

21002631.gif

и что такое динамическая индикация я в курсе, но как контроллер ее реализовывает не знаю(((

я посинтаксису ваще ноль (кроме того что похоже на паскаль обычный)

и вообще проблема еще в том что код без комментариев... вы можете написать комментарии там где связано с индикацией?

для того что бы зажечь нужный сегмент индикатора с обшим анодом

нужно выбрать нужный разряд подав на анод лог1( при этом на другие разряды должен быть подан лог0)

а на нужные сегменты лог.0

для общего катода все на оборот....

- а как это командами написать?

Изменено пользователем vovancheg86
Ссылка на комментарий
Поделиться на другие сайты

- а как это командами написать?

для общего катода

		if i.0 then begin
	 C2 := 1; - выключаем ненужный разряд
	 Led(L10); - вызываем процедуру включения нужных сегментов в зависимости значения L10 (0...9)
	 C1 := 0; - включаем нужный разряд

в процедуре лед для цифры три

if I=3 then begin
    portc:=$D7; нужные сегменты=1
    porta.4:=1;  нужные сегменты=1

Ссылка на комментарий
Поделиться на другие сайты

А я так и сделал, но все равно абракадабра получается (был до этого с общим анодом все работало).

Посмотрите я скинул в самом первом посте то как я поменял, во всех цифрах проинвертировал.

кстати в конце надо все менять или только что вы указали?

if i.0 then begin

C2 := 1; - выключаем ненужный разряд

Led(L10); - вызываем процедуру включения нужных сегментов в зависимости значения L10 (0...9)

C1 := 0; - включаем нужный разряд

Ссылка на комментарий
Поделиться на другие сайты

4278c6a09926453b4c253a04d2df1182.jpg

Прошу прощения я тупил... Я подключил 7сег индикатор "вверх ногами")) вот как на картинке, специально разъем сделал даже, чтобы менять индикаторы))

В программе изменил следующее:

1) Изменил в процедуре LED значения portc:=$04; на инверсное значение (00000100=04 -> FB=11111011) и porta.4:=0; поменял на porta.4:=1. Для каждого следующего значения I аналогичным образом.

Внизу где обслуживание разрядов (как сказал участник форума bezkz) я не только поменял значения С1 и С2 на инверсные, я еще поменял их местами, получилось так:

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

Но вот сейчас проблема, в режиме Нормал, когда он в режиме измерения он показывает нормально, а вот в режиме калибровки "абракадабру", но я заметил что например число 04 отображается будто одновременно 40 и 04 показывает, число 06 будто 60 и 06 меняются местами и т.д.

Изменено пользователем vovancheg86
Ссылка на комментарий
Поделиться на другие сайты

Сейчас, я, с Вашей помощью конечно, почти добил это устройство!)

Я подумал, а что если инвертировать также внутри цикла калибровки значения С1 и С2 (раз уж они, как я понял, отвечают за общие выводы индикаторов), Инвертировал их (внизу результат инверсии) и получилось! Теперь во время калибровки показывает 00 02 04 как положено до 40.

Но, как Вы могли заметить, я сказал "почти" :) , проблема осталась вот в чем:

Когда устройство в режиме измерения и я подстроечным резистором меняю напряжение на 12 ноге, которое в свою очередь, меняет число на индикаторе я заметил, что там нечто подобное происходит как во время калибровки "абракадабра", т.е. число 18 например, отображается как попеременно 81 и 18, НО! число которое не должно отображаться (81 в данном случае) его сегменты горят оооочень тускло, хотя может просто они (сегменты "ненужного числа") включаются лишь на доли секунд? как это исправить?

Вот место в коде где я подправил (для нормального отображения чисел при калибровке)

begin
	  C1:=1; //Здесь был 0
	  C2:=1; //Здесь был 0
	  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; //Здесь была 1
    C2:=0; //Здесь была 1
  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;

Ссылка на комментарий
Поделиться на другие сайты

я еще поменял их местами, получилось так:

зачем? отсюда:

но я заметил что например число 04 отображается будто одновременно 40 и 04 показывает, число 06 будто 60 и 06 меняются местами и т.д.

Ссылка на комментарий
Поделиться на другие сайты

Все, разобрался... не знаю почему раньше не получилось... Оказывается, что можно было просто инвертировать только знакогенератор где процедура LED для каждого I, и в конце где обслуживание разрядов... не меняя при этом местами С1 С2, только значения напротив них...

Но вот еще вопрос возник... В МК осталась свободная нога №4, а у меня 3 сегментный индикатор... как добавить свечение английской буквы L (типа литры) ?

Я так понял надо в начале добавить что то типа

C3 : sbit at porta.(здесь номер порта чтобы на ногу 4 выходило);

. Затем добавить в процедуру LED (знакогенерато) 10 значение типа:

if I=10 then begin
portc:=$(здесь значение для буквы L, хз по какому закону оно вычисляется);
porta.4:=(Здесь,честно говоря хз, 0 или 1 ставить);
end;

Потом в конце где отображение при режиме нормал что то типа:

if i.0 then begin
 C2:= 1;
 Led(L10);
 C1:= 0;
С2:=0
Led(10)
С3:=1
end else
begin
 C1:= 1;
 Led(L1);
 C2:= 0;
С1:=0
Led(10)
С3:=1
end;

что не так сказал или забыл добавить - пожалуйста поправьте, и номер порта какой будет?

Изменено пользователем vovancheg86
Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
  • Сообщения

    • Все предложенные к рассмотрению источники питания работают примерно по одному принципу: сетевое напряжение выпрямляется, фильтруется (получаем чуть больше 300 вольт постоянного), затем преобразуется снова в переменное, но уже на частотах в несколько десятков килогерц, понижается на трансформаторе и снова выпрямляется. За счёт высокой частоты преобразования используется трансформатор на ферритовом, а не на стальном, сердечнике, гораздо меньших габаритов и стоимости. Минусы: значительное усложнение схемы блока и вероятность возникновения различных помех от него. Модули управления (кроме первого) также являются импульными преобразователями, с теми же достоинствами и недостатками. Если нужно по быстрому собрать некое подобие ЛБП, то уж лучше брать модуль вроде этого. Ну и блок питания к нему соответствующий. Но не очень понятно, какой практический опыт можно получить от соединения готовых модулей парой проводов.  
    • У меня больше всего вопросов вызвала необычная схема обеспечения отрицательного питания. Автор этой обстоятельной заметки пишет: For this supply to work correctly, the transformer must have a secondary voltage of at least 18V RMS.  Почему? Что будет не так с отрицательным питанием, если напряжение на трансформаторе будет меньше 18В?   https://tinyurl.com/23mlwxtt - я в простейшей эмуляции ставлю 12В пикового напряжения для трансформатора и на стабилитроне все как положено: -5.6В.
    • Согласен, очень криво объяснил. Это работа трёх вольтовой линии, просто на диод шотки сдвоенный, на один анод приходит сигнал напрямую с трансформатора, а на второй через дроссель. Вольт/деление 5 вольт в клетке, тайминг по моему 10 МС. Третья фотография это сигнал на катодах уровень земли ровно по центру экрана. Но все линии по итогу в порядке 3.3 в, 5, в, 12 в и -12 в. Нагрузить все линии не могу сразу ,так как тут же выгорают транзисторы (имеется нагрузка 250 ватт по 10 ампер на каждую линию за исключением-12в), поэтому нагружаю 3.3 вольтовую линию на 10 ампер,  подключаю переменный резистор 50 ватт на 15 ом на 5 вольтовую линию и постепенно довожу до той той картины с перекосом (это гдето  50 ватт общее). По поводу микросхемы, вверху имеется скрин где между импульсами проскакивает мини импульс, если так можно сказать, он проскакивает и на одной  и на второй ноге (7,8). Микросхема не tl 494, а lw4933/abx942.1/c9421646. Далее они приходят на базы транзисторов 945g  коллекторы этих транзисторов соединены с  выводами трансформатора. Просто схема типовая, легче мне кажется просто привести фото самого блока, для тех кто разбирается будет гораздо информативне.  Диод шотки по 12 вольтовой линии был подгоревший, заменил на донора. Приводить скрины не буду что бы не захламлять тему. В итоге, пока все так же, при достижении определенной нагрузки суммарно где-то 50 ватт, появляется этот "выброс и перекос". По этому имеются мысли на два варианта, это микросхема , этот мини импульс между периодами, на низкой нагрузке особо не влияет, но при достижении определенной приводит с самовозбуждению входной цепи и непроизвольному открытию транзистора нижнего плеча. Либо дело в "горячей части", плавающий дефект в обвязке силовых ключей.  Спасибо за ответ.
    • @Gomerchik а вы контролировали как меняется уровень сигнала на А1 ардуины?
    • Спасибо за совет. Автором данного проекта я не являюсь, мне нужно было воссоздать уличный датчик для метеостанции взамен пропавшего(( Из разного найденного в интернете этот проект работает с моей станцией Орегон (спасибо автору). В понедельник попробую последовать Вашему совету. Но все равно куча непоняток  как блин это работает)) Если дело в неправильной отправки команды, то как на это влияет подключение датчика температуры? Если совсем не подключать таймер, то передача идет один раз (как и прописано в программе), станция принимает и отображает, но минут через сколько-то естественно станция уже ни чего не показывает, но с таймером питание полностью не пропадает с ардуинки, но передача сигнала каким-то образом работает по таймеру.  В моем понимании данная команда подается один раз потому, что таймер должен отключать питание МК после передачи сигнала и каждые 43 сек снова подавать питание (так того требует станция).  Ардуино передает показания температуры отключается полностью и 43 секунды мк не работает.  Сейчас у меня питание пока сделано на подпитке от солнечной батареи, но пару пасмурных дней и аккумулятор съедается до отключения(
    • thickman Так и сделаю. Вытащу из бу БП.  Буду знать, как отличить. Благодарю. Заменил транзисторы на IRFB20N50K. Картина стала, совсем другой.  Похоже трудность не в драйвере, на момент подвозбуда, переходные процессы, в нем, завершены. Увеличил затворные резисторы до 50ом, стало немного лучше.  Не понятно, почему верхний ключ греется несколько сильнее. Возможно, стоит посмотреть ток в коллекторе.  Снабберные емкости временно удалил, изменений не произошло.  Замена ТГР на другой, на кольце MSTN-16A-TH, так же, результата не принесла.   irfb20n50k.pdf
×
×
  • Создать...