Arkadaşlar yardım edin lütfen pic ile matematiksel işlem yapamıyorum...

Başlatan xemre89, 14 Mart 2012, 23:25:47

xemre89

DEFINE LCD_DREG PORTA 'LCD DATA BACAKLARI PORTB'YE BAGLI
DEFINE LCD_DBIT 0 'LCD DATA BITLERI HANGİ BITTEN BASLIYOR
DEFINE LCD_EREG PORTB 'LCD ENABLE BACAGI HANGI PORTA BAGLI
DEFINE LCD_EBIT 0 'LCD ENABLE BITI HANGI PORTA BAGLI
DEFINE LCD_RWREG PORTB 'LCD RW BACAGI HANGI PORTA BAGLI
DEFINE LCD_RWBIT 7 'LCD RW BACAGI HANGI BITE BAGLI
DEFINE LCD_RSREG PORTA 'LCD RS BACAGI HANGI PORTA BAGLI
DEFINE LCD_RSBIT 4 'LCD RS BACAGI HANGI BITE BAGLI
DEFINE LCD_BITS 4 'LCD 4 BIT BAGLI
DEFINE LCD_LINES 2 'LCD KAC SIRADAN OLUSUYOR

CMCON=7
PORTB=0

PAUSE 200

SAY1 VAR WORD
SAY2 VAR WORD
SAY3 VAR WORD
SAY4 VAR WORD
SAY5 VAR WORD
TOPLAM VAR WORD

BASLA:

SAY1=0
SAY2=0
SAY3=0
SAY4=0
SAY5=0
TOPLAM=0

LCDOUT $FE,1

LCDOUT $FE,$80,"    ATAKAN"
LCDOUT $FE,$C0,"    ELBASAN"

PAUSE 2000

LCDOUT $FE,1

LCDOUT $FE,$80,"KUMBARADAKI PARA"
LCDOUT $FE,$C0,"   TOPLAM=",DEC TOPLAM

TEST:


IF PORTB.2=0 THEN
SAY1=SAY1+1
ENDIF
IF PORTB.3=0 THEN
SAY2=SAY2+1
ENDIF
  IF PORTB.4=0 THEN
  SAY3=SAY3+1
  ENDIF
   IF PORTB.5=0 THEN
   SAY4=SAY4+1
   ENDIF
    IF PORTB.6=0 THEN
    SAY5=SAY5+1
    ENDIF
     IF PORTB.1=1 THEN
     GOTO BASLA
     ENDIF


 
TOPLAM=SAY1*100+SAY2*50+SAY3*25+SAY4*10+SAY5*5


LCDOUT $FE,1
LCDOUT $FE,$80,"KUMBARADAKI PARA"   
LCDOUT $FE,$C0,"  TOPLAM=",DEC TOPLAM," TL"

PAUSE 200

GOTO TEST

END


Arkadaşlar lcd ekran ve 6 tane buton var ben bu butonların 1. sine basılınca toplamın 100 artmasını 2. sine basılınca 50 artmasını 3. süne basılınca 25 gibi artmasını istiyorum ama gel gelelim 1. butona basınca 100 değilde 90 artıyor. 2 butona basınca 50 yerine 135 artıyor. Neden böyle oluyor acaba yardım edebilirmisiniz 2 gündür uyku uyumuyorum.

Kabil ATICI

...
IF PORTB.2=0 THEN
Toplam=toplam+100
ENDIF
IF PORTB.3=0 THEN
Toplam=toplam+50
ENDIF
  IF PORTB.4=0 THEN
Toplam=toplam+25
  ENDIF
...
şeklinde yapsan nasıl olur.?
böylece
TOPLAM=SAY1*100+SAY2*50+SAY3*25+SAY4*10+SAY5*5
satırından kurtulursun..
ambar7

xemre89

 Cevap için saol kardeşim. Öyle de denedim ama yine lcd de kafasına göre topluyor.  Picin matematik işlemcisi bozuk olabilir mi? Öyle olsa Lcd de çalışmaz gerçi. Bilmiyorum nasıl çıkcam bu işin içinden

Maxim

picin matematik işlemcisi bozukmu  ;D
yok artık

sizin kodunuz hatalı

if portb.0 = falan gibi bir komut kullanırsanız ne olur ?
parmağınla butona bastığın anda komut saymaya başlar ve çok çabuk artmalar olur
elin butona basılı olduğu sürece sayı artacaktır
hatta 0-255 arası birkaç tur bile atabilir o yüzden mantıksız sayılar görüyorsundur

mesela sayı 30 diyelim
butona bastın +1 artması lazım ya
ohoo o 255 i kaç kere geçip başa dönmüştür kimbilir ..

sizin sayılar word müş ama mantık dediğim gibi yani ..


o yüzden böyle durumlarda while - wend komutu kullanılır
siz butona basarsınız sayı 1 artar ve öylece bekler taaa siz parmağınızı butondan çekene kadar
tekrar basarsınız tekrar 1 daha artar , butona 5 kere basın 5 artar , 6 basın 6 artar



xemre89

Ama aslında 6 tane buton değil sensör var ve 1. sensörü kapattığımda hep 90 2. sensörü kapattığımda hep 135 görüyorum 3. sensörde 165 görüyorum. Dediğiniz gibi olsa hep farklı sayı görmem gerekmez mi?

Maxim

evet farklı sayılar gelirdi
kodu tam incelemedim, bakalım...

yukarıdaki kod hatasız eksiksiz sizin denediğiniz kod değilmi ?

xemre89

Evet lcd çalışıyor ama toplamı yanlış hesaplıyor. Acaba decimal yazarken mi bir problem yaşanıyor. Aynı kodu proteus isiste çizdiğim devreye atıyorum sanal olarak program düzgün çalışıyor ama gel geleim reelde böyle sonuçlar veriyor. Biraz takıtılıyım da kaç gecedir adam gbi  uyku uyuyamadım bunu çözebilmek için.

Maxim

sizin pic nedir ? 16F628a ?

lcd tanımlamaları yanlış + tris ayarları yok

her buton veya switch girişinde pull-up yada pull-down direnci varmı?
kendi kendine değerler artıyorda olabilir
yada saçmalıyor

internal osc mi kullanıyorsunuz ?
şema gene yok tabi .

kodu ambar7 nin dediği gibi değişmek şart

Maxim

bu satırda tuhaf anlamadım neden böyle

IF PORTB.1=1 THEN
GOTO BASLA
ENDIF



xemre89

Bu kumbara devresi portb 2 den portb6 ya  kadar 1tl,50krş,25krş,10krş,5krş aldılayan 5 adet cny70 sensörleri var. portb1' e de buton koydum sıfırlama yapıyor yani reset gibi.

Maxim

proton kodları çok benzerdir, picbasic için birkaç değişiklik gerekir lcd tanımları gibi mesela ..
** koyduğum yerler önemli

bu kod gayet güzel çalışıyor


Device 16F628A
Xtal 4

Config CP_OFF,LVP_OFF,BODEN_ON,MCLRE_OFF,PWRTE_ON,WDT_OFF,INTRC_OSC_NOCLKOUT '**

TRISA=%00000000 '**
TRISB=%11111111 '**

CMCON=7
All_Digital = TRUE '**
PortB_Pullups=1 '**

' LCD TANIMLAMALARI ** 
Declare LCD_DTPin PORTA.0
Declare LCD_RSPin PORTA.6 
Declare LCD_ENPin PORTA.7 
Declare LCD_Interface 4
Declare LCD_Lines 2


DelayMS 200

SAY1 VAR Word
SAY2 VAR Word
SAY3 VAR Word
SAY4 VAR Word
SAY5 VAR Word
TOPLAM VAR Word

BASLA:

SAY1=0
SAY2=0
SAY3=0
SAY4=0
SAY5=0
TOPLAM=0

LCDOUT $FE,1

LCDOUT $FE,$80,"    ATAKAN"
LCDOUT $FE,$C0,"    ELBASAN"
PAUSE 2000
LCDOUT $FE,1


TEST:
'IF YERİNE WHILE-WEND KULLANMAK GEREKIR **

LCDOUT $FE,$80,"KUMBARADAKI PARA"    
LCDOUT $FE,$C0,"  TOPLAM=",Dec TOPLAM," TL"


If PORTB.1=0 Then
toplam = 0
LCDOUT $FE,1
EndIf

If PORTB.2=0 Then
toplam = toplam + 100
EndIf

If PORTB.3=0 Then
toplam = toplam + 50
EndIf 

If PORTB.4=0 Then
toplam = toplam + 25
EndIf

If PORTB.5=0 Then
toplam = toplam + 15
EndIf

If PORTB.6=0 Then
toplam = toplam + 5
EndIf


PAUSE 200
GoTo TEST

End



bu da şema:

xemre89

Dostum ben bu while wend komutunun nasıl kullanıldığını bilmiyorum onu bir göstersen biri için öyle denesem.Mesela sadece portb.1 için bir while wend döngüsü kurarmışısn örnek olarak.

Maxim

siz bu kadarını sağlıklı bir çalıştırın gerisine bakarız

xemre89

DEFINE LCD_DREG PORTA 'LCD DATA BACAKLARI PORTB'YE BAGLI
DEFINE LCD_DBIT 0 'LCD DATA BITLERI HANGİ BITTEN BASLIYOR
DEFINE LCD_EREG PORTB 'LCD ENABLE BACAGI HANGI PORTA BAGLI
DEFINE LCD_EBIT 0 'LCD ENABLE BITI HANGI PORTA BAGLI
DEFINE LCD_RWREG PORTB 'LCD RW BACAGI HANGI PORTA BAGLI
DEFINE LCD_RWBIT 7 'LCD RW BACAGI HANGI BITE BAGLI
DEFINE LCD_RSREG PORTA 'LCD RS BACAGI HANGI PORTA BAGLI
DEFINE LCD_RSBIT 4 'LCD RS BACAGI HANGI BITE BAGLI
DEFINE LCD_BITS 4 'LCD 4 BIT BAGLI
DEFINE LCD_LINES 2 'LCD KAC SIRADAN OLUSUYOR

CMCON=7
PORTB=0

PAUSE 200

TOPLAM VAR WORD

BASLA:

TOPLAM=0

LCDOUT $FE,1

LCDOUT $FE,$80,"    ATAKAN"
LCDOUT $FE,$C0,"    ELBASAN"

PAUSE 2000

LCDOUT $FE,1

LCDOUT $FE,$80,"KUMBARADAKI PARA"
LCDOUT $FE,$C0,"   TOPLAM=",DEC TOPLAM

TEST:


IF PORTB.2=0 THEN
TOPLAM=TOPLAM+100
ENDIF

IF PORTB.3=0 THEN
TOPLAM=TOPLAM+50
ENDIF

IF PORTB.4=0 THEN
TOPLAM=TOPLAM+25
ENDIF

IF PORTB.5=0 THEN
TOPLAM=TOPLAM+10
ENDIF
   
IF PORTB.6=0 THEN
TOPLAM=TOPLAM+5
ENDIF
     
IF PORTB.1=1 THEN
GOTO BASLA
ENDIF


LCDOUT $FE,1
LCDOUT $FE,$80,"KUMBARADAKI PARA"   
LCDOUT $FE,$C0,"  TOPLAM=",DEC TOPLAM," TL"

PAUSE 200

GOTO TEST

END



Abi programı dediğin gibi yaptım ama sonuç yine aynı

1. sensörü kapatınca artış 90
2. sensörü kapatınca artış 140
3. sensörü kapatınca artış 165
4. sensörü kapatınca artış 180
5. sensörü kapatınca artış 185 oluyor.


Bundan sonra ben her sensör için toplamı 1 arttıran program yazdım o program çalışıyor her sensörde toplam 1 artıyor. Ama bu şekilde olmuyor. Bunun sebebi ne olabilir başka neyi kontrol etmeliyim. Bu arada LCD JDM162A. Acaba pronlem nerdedir.

Maxim

bak gene aynı şeyi yapmışsın

konfig tanımlamaları yok
all digital = 1 tanımlaması yok
portb portunun pull-up tanımlaması yok
şema yok
lcd tanımlamaları garip gene, rw ayağı nereye bağlı ?
tris tanımlamaları yok
her göngüde ekranı neden siliyorsun? hoşunamı gidiyor ekrandaki yazıların kıpraşması ?

sana çalışan kod verdim gene gittin kendi kodunu kullandın