Rotary enkoder i treperenje displeja

Rasprava o PIC mikrokontrolerima, PIC projekti i drugo vezano za PIC-eve...

Moderators: pedja089, stojke369, [eDo], trax

Post Reply
febo26
Pravo uznapredovao :)
Pravo uznapredovao :)
Posts: 207
Joined: 12-08-2008, 19:58

Rotary enkoder i treperenje displeja

Post by febo26 »

Ovo je primjer koda za dekodiranje Rotary Enkodera.
Primjer coda je skinut s picbasic.co.uk stranice i prilagođen ua PIC 16f877 pic i LCD display.
Primjer radi ocitava impulse s enkodera i broji unapred i unazad ali mi treperi LCD display.


Code: Select all

'PIC16f877A
'OSCILATOR NA 20MHZ
'PORT A.0 I PORT A.1 ULAZI ZA ENKODER
'PORT B SE KORISTI ZA LCD DISPLAY
  
  
DEFINE OSC 20
DEFINE LCD_BITS 4      ' LCD broj Bita na liniji 4 ili 8
DEFINE LCD_DREG PORTB  ' LCD data port
DEFINE LCD_DBIT 4      ' LCD pocetni bit podataka 0 ili 4(od kojeg pina na mikrokontroleru pocinje 0 bit podataka)
DEFINE LCD_RSREG PORTB ' LCD registar select port
DEFINE LCD_RSBIT 2     ' LCD registar select bit (na koji pin na mikrokontroleru je povezan RS bit)
DEFINE LCD_EREG PORTB  ' LCD enable port
DEFINE LCD_EBIT 3      ' LCD enable bit(na koji pin na mikrokontroleru je povezan E bit)
DEFINE LCD_LINES 4      'LCD koristi 4 reda za ispis 4x20 lcd

   ADCON1 = 7
   TRISA = $1F    'Postavi sve pinove porta A kao ulazne
   TRISB = $00    'Postavi sve pinove porta B kao izlazne 
   TRISD = $00    'Postavi sve pinove porta D kao izlazne 


A_INPUT VAR PORTA.0
B_INPUT VAR PORTA.1
HULP1 VAR BIT
HULP2 VAR BIT
COUNTER VAR WORd
COUNTER = 1

 
START:

HULP2 = A_INPUT & ~ HULP1 'EVERY POSITIVE GOWING EDGE OF A_INPUT
HULP1 = A_INPUT 'GIVES A PULSE OF ONE PROGRAMM CYCLE

IF HULP2 = 1 AND B_INPUT = 1 Then 'MOTOR TURNS RIGHT
COUNTER = COUNTER + 1
EndIF

IF HULP2 = 1 AND B_INPUT = 0 Then 'MOTOR TURNS LEFT
COUNTER = COUNTER - 1
EndIF

'prikaz na displayu

Lcdout $fe,1,"brojac = ", dec counter
[b]pause 10	[/b]   
GoTo START 

end

primjetio sam da treperenje ima veze s pauzom u prikazu.Ako pauzu obrisem treperenje je tako brzo da se na displeju jedva vidi sto pise,a ako pak pauzu povecam onda dobivam usporeno treperenje displeja svakih par sekundi. brojac radi i ocitava impulse gore -dolje.
Lcdout $fe,1,"brojac = ", dec counter
pause 10


Da li bi se to treperenje izbjeglo ako bi se koristili interapti?
User avatar
MHN
Pravo uznapredovao :)
Pravo uznapredovao :)
Posts: 350
Joined: 11-03-2005, 22:02
Location: Sarajevo

Re: Rotary enkoder i treperenje displeja

Post by MHN »

To ti treptanje dolazi od ove jedinice
Lcdout $fe,1,"brojac = ", dec counter - ona je za brisanje displeja

Lcdout $fe,$80,"brojac = ", dec counter - probaj ovako pa vidi kako ce ti biti.
yt1nvs
Pravo uznapredovao :)
Pravo uznapredovao :)
Posts: 286
Joined: 30-03-2009, 16:54

Re: Rotary enkoder i treperenje displeja

Post by yt1nvs »

Da bez brisanja LCD, a ove linije cisto onako moze i :

IF HULP2 = 1 AND B_INPUT = 1 Then COUNTER = COUNTER + 1 'MOTOR TURNS RIGHT

bez endif malo ti skrati KOD (dobijas malo na brzini)
febo26
Pravo uznapredovao :)
Pravo uznapredovao :)
Posts: 207
Joined: 12-08-2008, 19:58

Re: Rotary enkoder i treperenje displeja

Post by febo26 »

Jeste to je to.Ta jedinica je pravila problem. Vise mi ne treba ni pause 10 komanda.

Bez toga program bolje broji impulse s enkodera

Puno hvala na pomoci :D
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7877
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Re: Rotary enkoder i treperenje displeja

Post by pedja089 »

Ali tu moze da nastane problem...
Probaj naterati 100 impulsa, pa vrati na 90, pa ce ti na lcd-u ostati 900... Tj ostaje zanja cifra, jer ga vise ne brises.
To mozes resiti na vise nacina, jedan je da koristis DEC3 ili tako nesto, da ti uvek ispisuje isti broj cifara, ili posle DEC counter, stavi prazan string, npr DEC counter," "
I kod ubuduce stavljaj u CODE tagove, gore imas dugme kada pises poruku.
Selektujes kod i onda kliknes na dugme.
febo26
Pravo uznapredovao :)
Pravo uznapredovao :)
Posts: 207
Joined: 12-08-2008, 19:58

Re: Rotary enkoder i treperenje displeja

Post by febo26 »

Da ne otvaram novu temu problem je vezan uz ovaj program.Napisao sam program koji mi u glavnoj labeli ocitava stanje enkodera ,rc5 koda,i tipki za ulaze.Program lijepo funkcionira i htio bih mu ubaciti jos jednu labelu za citanje temperature s DS1820 senzora.Ocitavanje temperature bi trebalo biti okvirno svakih 5 minuta ili vise nije bitno jer se mjeri vanjska temperatura.Problem je u tome sto neznam koju naredbu iskoristiti u glavnoj labeli da program skoci na labelu za mjerenje teperature svakih 5 minuta i vrati se na pocetak u glavnu.Ako kod za citanje temperature stavim u glavnu petlju onda ili mi ne radi citanje RC5 koda ili enkoder.
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7877
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Re: Rotary enkoder i treperenje displeja

Post by pedja089 »

Moras napraviti tajmer na 5 minuta...
Najjednostavnije ti je da u mainu stavis I=i+1, otprilike izmeris koliko traje jedan prolaz programa, i onda stavis If i=2342 then start merenje
if i>2345 then proveri jel jos meri ako je izmerio procitaj
Ako ti nije problem okaci ceo kod, i kod za merenje...
febo26
Pravo uznapredovao :)
Pravo uznapredovao :)
Posts: 207
Joined: 12-08-2008, 19:58

Re: Rotary enkoder i treperenje displeja

Post by febo26 »

hvala pedja,pomoglo je ovo s brojacem I=i+1.Radi perfektno.
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7877
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Re: Rotary enkoder i treperenje displeja

Post by pedja089 »

Nema na cemu.
Post Reply