Македонски форум за електроника

Дигитална електроника => Микроконтролери => Topic started by: garfild on 12.04.2013, Friday, 13:39:45

Title: Протокометар
Post by: garfild on 12.04.2013, Friday, 13:39:45
Здраво.

Правам протокометар со готов сензор што дава импулси на излез.

Контролата на сензорот е со PIC16F877a и со LCD екран засега. Програмата ја пишувам во Mikropascal  но никако неможам да ја натерам да ги брои импулсите од сензорот исправно.

Односно да на секој импулс бројачот да се зголемува за 1, а не како сега нон стоп да брои без разлика дали има сигнал или не.

(http://i1162.photobucket.com/albums/q537/0x4E4F/flow_meter.jpg)

Code: [Select]
program Flowmeter;

// LCD module connections
var LCD_RS : sbit at RB1_bit;
var LCD_EN : sbit at RB3_bit;
var LCD_D4 : sbit at RB4_bit;
var LCD_D5 : sbit at RB5_bit;
var LCD_D6 : sbit at RB6_bit;
var LCD_D7 : sbit at RB7_bit;
var LCD_RS_Direction : sbit at TRISB1_bit;
var LCD_EN_Direction : sbit at TRISB3_bit;
var LCD_D4_Direction : sbit at TRISB4_bit;
var LCD_D5_Direction : sbit at TRISB5_bit;
var LCD_D6_Direction : sbit at TRISB6_bit;
var LCD_D7_Direction : sbit at TRISB7_bit;
// End LCD module connections


var txt1 : array[16] of char;
    txt2 : array[9]  of char;
//    txt3 : array[8]  of char;
//    txt4 : array[7]  of char;
//    i    : byte;
    broj : integer;
    txt,impuls : string[6];
    temp1,ml : integer;

begin

PORTB := 1;
TRISB := 1;
PORTA:=0;
TRISA.0:=0;
TRISA.1:=0;
ADCON1 := 0x0F;                //*Configure AN pins as digital*/
CMCON := 0x07;


Lcd_Init();
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);

temp1:=0;
broj:=0;
ml:=0;

while TRUE do

Begin
 
 if (PORTA.1 = 1) then

// Delay_ms(100);

 txt1:='ml';
 temp1:=temp1+1;
 Broj:= (temp1 * 60) / 7.5;
 ml:=temp1/10;
 inttostr(broj,txt);
 inttostr(ml,txt2);
 inttostr(temp1,impuls);
// Lcd_Out(1, 1, txt1+' '+txt+' '+impuls);
 Lcd_Out(1, 1, txt1+' '+impuls);
 Lcd_out(2,1,'ml'+' '+txt2);

end;

end.
Title: Одг: Протокометар
Post by: Trolko on 12.04.2013, Friday, 13:58:38
Сензорот каков излез има ? open collector, high Z, CMOS ?
Title: Одг: Протокометар
Post by: garfild on 12.04.2013, Friday, 14:10:03
Сензорот е со  square wave NPN open collector sinking
Title: Одг: Протокометар
Post by: Devil on 12.04.2013, Friday, 17:43:16
направи го со интерапри, да ги брое интераптите, јас барем така би го направил
Title: Одг: Протокометар
Post by: Trolko on 12.04.2013, Friday, 18:22:15
Сензорот е со  square wave NPN open collector sinking

Pull-up отпорник имаш ?
Title: Одг: Протокометар
Post by: Zan on 12.04.2013, Friday, 18:40:31
...на секој импулс бројачот да се зголемува за 1, а не како сега нон стоп да брои без разлика дали има сигнал или не.

На портот PORTA.1 треба да гледаш дали има промена од единица накај нула или обратно, и само во случај на промена, да го инкрементираш бројачот. Вака како што е кодот сега, бројачот се инкрементира на секое читање на портот, односно на секое извршување на главниот loop.
Title: Одг: Протокометар
Post by: garfild on 12.04.2013, Friday, 18:53:48
Во симулаторот и да му ставам Pull-up отпорник не променува ништо.

А дали ќе можи да ми дадете некој пример за како да ја видам промената на состојбата на портот?
Title: Одг: Протокометар
Post by: StefanJapanac on 12.04.2013, Friday, 18:55:29
Да не ти е случајно проблем со скокање на сигналот? Можеби pull up/pull down отпорник да не се потребни?
Title: Одг: Протокометар
Post by: Zan on 12.04.2013, Friday, 19:18:38
А дали ќе можи да ми дадете некој пример за како да ја видам промената на состојбата на портот?

Code: [Select]
    dim PrethodnaSostojba as boolean
    dim Counter as byte

    while true
        if (PrethodnaSostojba = false) and (PORTA.1 = 1) then
            PrethodnaSostojba = true
            Counter = Counter + 1
        end if
        if (PrethodnaSostojba = true) and (PORTA.1 = 0) then
            PrethodnaSostojba = false
        end if
    wend

Овој пример е напишан во mikroBasic, ама се надевам дека ќе разбереш.
Доколу излезот од сензорот е open collector, тогаш мора да има pull-up отпорник.
Title: Одг: Протокометар
Post by: garfild on 12.04.2013, Friday, 21:50:49
Благодарам за помошта , програмата ја префрлив во mikroBasic и работи.

Title: Одг: Протокометар
Post by: garfild on 22.04.2013, Monday, 03:06:46
направи го со интерапри, да ги брое интераптите, јас барем така би го направил

Програмата работи се додека имам помалку од 12 импулси во секунда а потоа почнува да заостанува од другиот бројач што е ставен во симулаторот. 

Дали би можеле да ми дадете пример со интерапти да видам дали ке ги брои побрзо, односно дали ке работи на поголем број на импулси во секунда.
Title: Одг: Протокометар
Post by: Zan on 22.04.2013, Monday, 08:02:18
Постирај го кодот што го имаш напишано до сега и проектот од симулаторот, па ќе видиме што може да се направи.
Title: Одг: Протокометар
Post by: garfild on 22.04.2013, Monday, 18:55:44
Во архивата е фајлот од симулаторот и кодот од програмата.

Title: Одг: Протокометар
Post by: Zan on 22.04.2013, Monday, 21:11:41
Еве пробај со Interrupt
Title: Одг: Протокометар
Post by: garfild on 22.04.2013, Monday, 21:22:37
За жал сеуште на повеке импулси во секунда закаснува со броењето.
Title: Одг: Протокометар
Post by: Zan on 22.04.2013, Monday, 21:31:57
И кај мене е така првиот пат кога ќе кликнам Старт во симулаторот. Пробај 2-3 пати кликни Старт-Стоп. За да го видиш реалниот број, постепено намалувај го бројот на импулси и застани на нула, па потоа види на LCD што има.
Title: Одг: Протокометар
Post by: garfild on 22.04.2013, Monday, 23:36:55
И кај мене е така првиот пат кога ќе кликнам Старт во симулаторот. Пробај 2-3 пати кликни Старт-Стоп. За да го видиш реалниот број, постепено намалувај го бројот на импулси и застани на нула, па потоа види на LCD што има.

Благорадарам за помошта.

Засега работи на овој принцип но кога ке го составам како склоп ке треба да го тестирам во реална ситуација дали навистина брои исправно.

 
Title: Одг: Протокометар
Post by: Zan on 22.04.2013, Monday, 23:49:08
Секогаш треба да го тестираш софтверот во реална ситуација. Симулаторот може многу да помогне, но во никој случај не може да го замени реалниот хардвер.