Приветствую. Нашел в сети цифровой указатель уровня топлива на pic 16f676 и 7-сегментном индикаторе. Собрал, прошил, все превосходно работает. Захотелось также сделать указатель давления масла. Схема устройств полностью идентична получается, датчики уровня топлива и давления масла идентичны (330 Ом = 0; 0 Ом = 8 атм = 40 л). Вся проблема в прошивке. На сайте выложен исходник, но уровень моих познаний в МК - взять готовый hex, прошить контроллер, если не работает поиграться фьюзами. Пробовал разобраться сам, скачал mplab, компиляторы, переписал строчки, указанные в описании проекта, но скомпилировать прошивку так и не смог. В лучшем случае выскакивает 21 ошибка. Пробовал разные версии мплаб, разные компиляторы, ничего не помогло. Прошу вашей помощи, уважаемые пиководы. Схема прибора: Исходный код, в нем нужно изменить строки AdrHi : byte = 12; litr : array [0..AdrHi] of byte = (0,5,10,15,20,25,30,35,40,45,50,55,60); на AdrHi : byte = 4; litr : array [0..AdrHi] of byte = (0,40,60,80); и добавить включение точки в 1 разряде (пока на макетке подкинул точку через резистор на общий провод) Спойлерprogram bakometr; const stNormal : byte = 1; stCalibr : byte = 2; AdrHi : byte = 12; litr : array [0..AdrHi] of byte = (0,5,10,15,20,25,30,35,40,45,50,55,60); 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:=$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; 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 := 0; Led(L10); C1 := 1; end else begin C1 := 0; Led(L1); C2 := 1; end; end; end.
Действительно Паскаль, спасибо. Скачал программу, закинул код, при компиляции получил ошибку main function is not defined main function is not defined Что нужно поправить в коде чтоб успешно скомпилировалось?
у меня скомпилировалось чутка поформатировал код: Спойлер
Код:
program bakometr; const stNormal : byte = 1; stCalibr : byte = 2; AdrHi : byte = 12; litr : array [0..AdrHi] of byte = (0,5,10,15,20,25,30,35,40,45,50,55,60); 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:=$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; 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 := 0; Led(L10); C1 := 1; end else begin C1 := 0; Led(L1); C2 := 1; end; end; end.
Не знаю что я не так делаю . Теперь другие ошибки выскакивают. И со старым исходником, и с Вашим отформатированным Порядок действий: создаю новый проект - стандартный проект. выбираю 16f676, частоту оставляю предложенную 8.000 МГц (пробовал и 4.000), файлы не добавляю, жму финиш. В открывшееся окно вставляю код, жму Build. По идее все правильно...
Все, разобрался. Надо было подключить библиотеки eeprom. adc и button, после этого все удачно скомпилировалось. Hex сохранял через program (microprog suite) - hex file option - save. Загружаю hex в pickit2 и получаю предупреждение Вроде как прошивается, проверку записи проходит. В железе - не сохраняются данные калибровки (не работает запись в еепром?)
Добавлено after 2 hours 39 minutes 56 seconds: Извиняюсь, это уже я затупил. В строках AdrHi : byte = 12; litr : array [0..AdrHi] of byte = (0,5,10,15,20,25,30,35,40,45,50,55,60) указал byte = 5; litr : array [0..AdrHi] of byte = (0,20,40,60,80) (вместо byte=5 нужно ставить 4, т.е 0 в калибровке не учитывается). После исправления все заработало как надо. прибор калибруется и сохраняет данные в еепром. Ошибка при прошивке (большой файл) на работу не повлияла. Огромное спасибо за помощь. Хотелось бы еще исправить пару моментов в прошивке, а именно: 1. Убрать мигание при значении 06 и ниже 2. Зажечь точку 1-го разряда (со свободного порта RA3) 3. Переделать прибор под 3-разрядный семисегментник и на 3 разряд выводить букву L для бакомера и P для давления масла (хз возможно ли это, свободный порт всего 1, видел у одного парня такую реализацию, но его прошивок в инэте нет) Если кто может помочь - буду очень благодарен А пока что выкладываю проект и hex файлик с настроенными битами
Вложения:
Комментарий к файлу: Проект+Hex+биты конфигурации Oilpress.rar [67.32 KiB]
Скачиваний: 145
Хотелось бы еще исправить пару моментов в прошивке...
1) попробовать убрать эти строки
Код:
if (i.7) and (V<6) then begin C1:=0; C2:=0; end;
2) RA3, насколько помню, может быть только входом 3) ввиду наличия отсутствия ресурсов микроконтроллера такой вариант предлагается - поставить подходящий по размеру и виду отдельный одноразрядный индикатор и чисто коммутацией (типа тумблер) зажигать нужные буквы...
ну 3 разряда онно может тянуть... но в код не влезет наверно
_________________ ZМудрость(Опыт и выдержка) приходит с годами. Все Ваши беды и проблемы, от недостатка знаний. Умный и у дурака научится, а дураку и .. Алберт Ейнштейн не поможет и ВВП не спасет.и МЧС опаздает
Хотелось бы еще исправить пару моментов в прошивке...
1) попробовать убрать эти строки 2) RA3, насколько помню, может быть только входом 3) ввиду наличия отсутствия ресурсов микроконтроллера такой вариант предлагается - поставить подходящий по размеру и виду отдельный одноразрядный индикатор и чисто коммутацией (типа тумблер) зажигать нужные буквы...
1. Помогло, спасибо 2. Так и сделал, но загораются сразу обе точки. Думаю закрасить лаком черным ненужную 3. Я тоже об этом подумал)
_________________ ZМудрость(Опыт и выдержка) приходит с годами. Все Ваши беды и проблемы, от недостатка знаний. Умный и у дурака научится, а дураку и .. Алберт Ейнштейн не поможет и ВВП не спасет.и МЧС опаздает
ну 3 разряда онно может тянуть... но в код не влезет наверно
Вот видос парня, выпускающего такие приборы. Я не знаю что за начинка в этой 3-ей серии, но предыдущие он собирал на 16f676 по схеме, приложенной в 1 посте. Интересная фича здесь - при включении питания МК сравнивает значения уровня топлива предыдущего запуска с текущим и отображает изменения. Ну и здесь есть третий разряд) https://www.youtube.com/watch?v=GlaaYu9Q_Do
для 3 разрядов Pic16f819 используют, что разумно (имхо)
Невнимательно смотрел значится) Тогда вопрос закрыт, нельзя значит нельзя... Оставлю все как есть Планшет конечно можно, но для этого как минимум мозги должны стоять
ну и я давненько делал и термометр и вольтметр на pic16f676 если смысл сейчас упираться - 18 и 20-ногих микроконтроллеров нынче полно. Да и кто сейчас возьмется программу альтруизмистично переписать...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения