Pıc basıc dılı ıle yaptıgım saatte sorunu duzeltemedım

Katılım
26 Ağu 2008
Mesajlar
124
Puanları
1
Yaş
39
ARKADAŞLAR TMR KESMESI ILE SANIYEYI KURDUM.ANCAK TIME1,TIME2,TIME3,TIME4 DONGULERINDE ZAMAN GECIKMESI FAZLA OLDUGUNDAN,PROGRAM TIME1 DONGUSUNE GIRIP TIME4 DEN CIKANA KADAR HER DEFASINDA 2 KESME GELIYOR WE DE NORMAL OLARAK SANIYE 2 ŞER ŞER SAYIYOR.BUNU DUZELTMENIN YOLU MESELA GUNAYDIN-HERKESE DERKEN ARADA 1 SN LİK OLAN GECIKMEYI DUSURMEK ANCAK BEN LCD DE "GUNAYDINI" VE "HERKESE" YAZILARINI 1 ER SANIYE GORMEK ISTIYORUM.YOKSA DAHA DUSUK SUREDE OLUNCA GÖZ BUNU PEK HOŞ ALGILAMIYOR.SONUCTA SAAT GOSTERİMİ İLE "GUNAYDIN-HERKESE" KOMUTLARINI AYNI OSİLATÖRLE KULLANDIGIM ICIN KESMELERDE ZAMAN PROBLEMI OLUYOR.KESMELER İÇİN AYRI BİR OSİLATOR KULLANMAM COZUMU GİDERİR Mİ ? TMR KESMLERİ İÇİN 16F877 NIN RC0 VE RC1 PINLERINDEN 32.768 KHz'LİK KRİSTAL OSİLATÖR BAĞLAMAK GEREKİYORMUS.PEKİ BİZ TMRO KESMESİNE "SEN GİT RC PİNLERİNE BAĞLADIĞIM KRİSTALİ KULLAN,"GUNAYDIN-HERKESE" KOMUTLARI DA NORMAL OSİLATÖRU KULLANSIN DİCEM ? :)



YAZDIĞIM PROGRAM VE PROTEUS DEWRESINIDE ALTA KOYDUM.YARDIMCI OLURSANIZ SEVİNİRİM.TEŞEKKURLER...
 

Ekli dosyalar

  • YAZILIM ve PROTEUS DEVRESi.rar
    1.3 MB · Görüntüleme: 0
yazılıma direk göz atmak isteyenler için yukarıda gonderdiğim klasörde olmasına rağmen burdan da gönderiyorum.yukarıdaki klasörde hex dosyası da bulunmaktadır...

**********************************************************************************




'******LCD TANIMLAMALARI******
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 3
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 2
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2
SANIYE var BYTE
DAKIKA VAR BYTE
SAAT VAR BYTE
GUN VAR BYTE
TRISB=%00000000
TRISA=%00000111
ADCON1=%00000111
GUN=3
SANIYE=14
DAKIKA=58
SAAT=11
TRISB=0
i VAR BYTE
D1 VAR BYTE
D2 VAR BYTE
D3 VAR BYTE
GUNCELLE VAR BYTE
GUNCELLE=1

OPTION_REG=%01010101
INTCON=%10100000
TMR0_SAY var byte

TMR0_SAY=0
i=0

ON INTERRUPT GOTO TMR0_KESME
pause 100


loop:
GUNCELLE=1
BUTTON PORTA.0,0,254,0,D1,1,DAKIKA_ARTTIR
BUTTON PORTA.1,0,254,0,D2,1,SAAT_ARTTIR
BUTTON PORTA.2,0,254,0,D3,1,GUN_AYARI



'*****************************************************************

IF (SAAT=0) AND (DAKIKA=0) AND (SANIYE=0) THEN GUN_AYARI
DONGU:
WHILE GUNCELLE=1
LCDOUT $FE,2
LCDOUT " ",dec2 SAAT,":",DEC2 DAKIKA,":",DEC2 SANIYE," (",DEC2 GUN,")"
GUNCELLE=0
WEND


IF (SAAT>=6) AND (SAAT<12) THEN TIME4

IF (SAAT>=12) AND (SAAT<18) THEN TIME3

IF (SAAT>=18) AND (SAAT<=23) THEN TIME2

IF (SAAT>=0) AND (SAAT<6) THEN TIME1


'*****************************************************************


TIME1:

LCDOUT $fe,$C0,"*iYi GECELER* "
FOR i=0 TO 200
PAUSE 5
NEXT
LCDOUT $fe,$C0," "
LCDOUT $fe,$C0,"*HERKESE*"
FOR i=0 TO 200
PAUSE 5
NEXT
GOTO LOOP

TIME2:

LCDOUT $fe,$C0,"*iYi AKSAMLAR* "
FOR i=0 TO 200
PAUSE 5
NEXT
LCDOUT $fe,$C0," "
LCDOUT $fe,$C0,"*HERKESE*"
FOR i=0 TO 200
PAUSE 5
NEXT
GOTO LOOP

TIME3:

LCDOUT $fe,$C0,"*iYi GUNLER* "
FOR i=0 TO 200
PAUSE 5
NEXT
LCDOUT $fe,$C0," "
LCDOUT $fe,$C0,"*HERKESE*"
FOR i=0 TO 200
PAUSE 5
NEXT
GOTO LOOP

TIME4:

LCDOUT $fe,$C0,"*GUNAYDIN* "
FOR i=0 TO 200
PAUSE 5
NEXT
LCDOUT $fe,$C0," "
LCDOUT $fe,$C0,"*HERKESE*"
FOR i=0 TO 200
PAUSE 5
NEXT
GOTO LOOP
'*****************************************************************
DAKIKA_ARTTIR:

DAKIKA=DAKIKA+1
IF DAKIKA=60 THEN
DAKIKA=0
ENDIF
GOTO LOOP:

SAAT_ARTTIR:
SAAT=SAAT+1
IF SAAT=24 THEN
SAAT=0
ENDIF
GOTO LOOP:

GUN_AYARI:
GUNCELLE=1
GUN=GUN+1
IF GUN=32 THEN
GUN=1
ENDIF

GOTO DONGU
'*****************************************************************

DISABLE
TMR0_KESME:
TMR0_SAY=TMR0_SAY+1
IF TMR0_SAY < 61 THEN KESME_SONU:
TMR0_SAY=0

SANIYE=SANIYE+1
IF SANIYE=60 THEN
SANIYE=0
DAKIKA=DAKIKA+1
ENDIF

IF DAKIKA=60 THEN
DAKIKA=0
SAAT=SAAT+1
ENDIF
IF SAAT=24 THEN
SANIYE=0:DAKIKA=0:SAAT=0
ENDIF

GUNCELLE=1
'*****************************************************************
KESME_SONU:
INTCON.2=0
RESUME
ENABLE
END
 
kurgunuz güzel ama dediğinize göre time1 döngüsünde 2 adet for döngüsü var 1Snlik doğal olarak time1 döngüsünde 2 sn mebcur kalacak ve bu esnada sn ekranda tazelenemiyecek

bence LCD ekrandaki SN tazeleme bölümünü int. içine alın o zaman bir sorun kalmaz istediği kadar main'de yazılım koşsun veya beklesin
 
Kitapçılarda bu tür örneklerin olduğu birkaç kitap var.4 mhz kullanarak ta yapılabilir.
Bazen 4.096 mhz lik kristal kullanıp daha sade programlar yazılabilir.bu programlar picbasic ile değil
doğrudan komut setleri ile yazılıyor.
32.768khz ise takvim entegrelerinde kullanılıyor.
 
ekran tazeleme bölumunu int içine aldım diyelim.zaten oylede denemiştim once bana da mantıklı geldi ancak o zaman sorun şu olmaz mı==>> dakıka,saat,gün kawramlarının saat ayarını yaparken yani mesela portA.0 ı dakika için kurmuştum,portA.0 a bastıgımızda dakika 1 artıyor ancak;SN yi int içine kurarsam,kesme gelmeden,dakikadaki manuel olarak yaptırdığımız artışı nasıl görucez??? sonucta int gelmeden SN de bu artışı göremeyiz o zaman ? ama genede tekrar deniyeyim.teşekkürler gunderdr

_________________________________________________________________________________________

elek arkadasım kitaplarda var elbette.amacım saat üretmek değil zaten,en azından mantığı tam kawramak sadece.ayrıca basic ile yapmamızın ne sakıncası olabilirki ?

Arka arkaya mesaj yazmak yasaktır.Lütfen son mesajınızın sağ üstünde bulunan Değiştir butonunu kullanınız.
Düzenleme:
korkmaz_design
 
gunderdr ARKADASIM;ŞU ŞEKİLDE YAPTIGIMDA OLDU;YUKARIDAKİ SN Yİ SİLİP INT İÇİNE KOYUNCA AYAR YAPARKEN KULLANDIGIMIZ A.0,A.1,A.2 PORTLARINI,KESMEYE GİTMEDİĞİ SÜRECE GÖRMUYOR PROGRAM.ONU SİLMEDEN INT İÇİNE AYNINI KOPYALADIM WE ŞİMDİ OLDU.YAZILIMI TEKRAR GÖNDERİYORUM.ANCAK ŞİMDİDE PROBLEM;TAM OLARAK SANİYEYİ AYARLAMAK :-\ ÇÜNKÜ SENİNDE DEDİĞİN GİBİ HER TIME1 WE DİĞER TIMELARDA DA 2 SANİYELİK GECİKMELER WAR.BUDA ASLINDA SANIYE AYARINI TAM YAPTIRMIYOR DOLAYISIYLA DAKIKA TAM 60.00 SANİYEDEN OLUŞAMIYOR.4 MHZ YA DA ELEK ARKADASIMIZIN DEDİĞİ GİBİ 4.096 MHZ KULLANARAK DA ÇÖZULMUYOR CUNKU PROGRAMDAKİ GECİKMELER OLDUKÇA FAZLA:S PROGRAMI NASIL TAM 1 DAKİKAYA AYARLAYABİLİRİM ? HER ÇEWRİMİ TEK TEK HESAPLAYIP ONA GÖRE Mİ FREKANS BELİRLESEK OLUR MU ACABA?

Kod:
DEFINE LCD_DREG  PORTB 
DEFINE LCD_DBIT  4  
DEFINE LCD_EREG  PORTB 
DEFINE LCD_EBIT  3  
DEFINE LCD_RSREG  PORTB 
DEFINE LCD_RSBIT  2  
DEFINE LCD_BITS  4  
DEFINE LCD_LINES  2  
SANIYE var BYTE
DAKIKA VAR BYTE
SAAT VAR BYTE
GUN VAR BYTE
TRISB=%00000000 
TRISA=%00000111
ADCON1=%00000111
GUN=3
SANIYE=14
DAKIKA=58
SAAT=11
TRISB=0
i VAR BYTE
D1 VAR BYTE
D2 VAR BYTE
D3 VAR BYTE
GUNCELLE VAR BYTE
GUNCELLE=1

OPTION_REG=%01010101
INTCON=%10100000
TMR0_SAY var byte

TMR0_SAY=0
i=0
    
ON INTERRUPT GOTO TMR0_KESME
pause 100


loop:
GUNCELLE=1
BUTTON PORTA.0,0,254,0,D1,1,DAKIKA_ARTTIR
BUTTON PORTA.1,0,254,0,D2,1,SAAT_ARTTIR
BUTTON PORTA.2,0,254,0,D3,1,GUN_AYARI



'*****************************************************************

IF (SAAT=0) AND (DAKIKA=0) AND (SANIYE=0) THEN GUN_AYARI
DONGU:
WHILE GUNCELLE=1
LCDOUT $FE,2
LCDOUT " ",dec2 SAAT,":",DEC2 DAKIKA,":",DEC2 SANIYE," (",DEC2 GUN,")" 
GUNCELLE=0
WEND


IF (SAAT>=6) AND (SAAT<12) THEN TIME4

IF (SAAT>=12) AND (SAAT<18) THEN TIME3

IF (SAAT>=18) AND (SAAT<=23) THEN TIME2

IF (SAAT>=0) AND (SAAT<6) THEN TIME1


'*****************************************************************


TIME1:

LCDOUT $fe,$C0,"*iYi GECELER* "
FOR i=0 TO 200
PAUSE 5
NEXT
LCDOUT $fe,$C0,"          "
LCDOUT $fe,$C0,"*HERKESE*"
FOR i=0 TO 200
PAUSE 5
NEXT
GOTO LOOP

TIME2:

LCDOUT $fe,$C0,"*iYi AKSAMLAR* "
FOR i=0 TO 200
PAUSE 5
NEXT
LCDOUT $fe,$C0,"          "
LCDOUT $fe,$C0,"*HERKESE*"
FOR i=0 TO 200
PAUSE 5
NEXT
GOTO LOOP

TIME3:

LCDOUT $fe,$C0,"*iYi GUNLER*  "
FOR i=0 TO 200
PAUSE 5
NEXT
LCDOUT $fe,$C0,"          "
LCDOUT $fe,$C0,"*HERKESE*"
FOR i=0 TO 200
PAUSE 5
NEXT
GOTO LOOP

TIME4:

LCDOUT $fe,$C0,"*GUNAYDIN*   "
FOR i=0 TO 200
PAUSE 5
NEXT
LCDOUT $fe,$C0,"          "
LCDOUT $fe,$C0,"*HERKESE*"
FOR i=0 TO 200
PAUSE 5
NEXT
GOTO LOOP
'*****************************************************************
DAKIKA_ARTTIR:

DAKIKA=DAKIKA+1
IF DAKIKA=60 THEN
DAKIKA=0
ENDIF
GOTO LOOP:

SAAT_ARTTIR:
SAAT=SAAT+1
IF SAAT=24 THEN
SAAT=0
ENDIF
GOTO LOOP:

GUN_AYARI:
GUNCELLE=1
GUN=GUN+1
IF GUN=32 THEN
GUN=1 
ENDIF

GOTO DONGU
'*****************************************************************

DISABLE
TMR0_KESME:
TMR0_SAY=TMR0_SAY+1
IF TMR0_SAY < 61 THEN KESME_SONU:
TMR0_SAY=0

SANIYE=SANIYE+1
IF SANIYE=60 THEN 
SANIYE=0
DAKIKA=DAKIKA+1
ENDIF

IF DAKIKA=60 THEN
DAKIKA=0
SAAT=SAAT+1
ENDIF
IF SAAT=24 THEN 
SANIYE=0:DAKIKA=0:SAAT=0
ENDIF
LCDOUT $FE,2
LCDOUT " ",dec2 SAAT,":",DEC2 DAKIKA,":",DEC2 SANIYE," (",DEC2 GUN,")" 

GUNCELLE=1
'*****************************************************************
KESME_SONU:
INTCON.2=0
RESUME
ENABLE
END

__________________________________________________________________------
AYRICA TMR KESMELERI İÇİN AYRI BİR OSİLATÖR KULLANABİLİYORMUŞUZ SANIRIM.O ŞEKİLDE YAPSAK BU SORUNU GİDEREBİLİR MİYİZ ACABA?

Arka arkaya mesaj yazmak yasaktır.Lütfen son mesajınızın sağ üstünde bulunan Değiştir butonunu kullanınız.
Düzenleme:
korkmaz_design

Bir daha uyarmıcam
 
FOR i=0 TO 200
PAUSE 5
NEXT

yerine

FOR i=0 TO 10000
PAUSEUS 10
NEXT

yapman daha uygun olur int sevmediği komutlar
analog okumak
pause bekleme komutları
bunlar int. gecikmelere yol açar bu tür uygulamalarda pause değilde pauseus kullanın

ayrıca int. sonunda Timer int registerini sıfırlaman uygun olur
tmr kesmeleri için ayrı bir osilatör oluyorda bu pause böyle oldukça oda işe yaramaz
TIMER0 yerime 16 bitlik TIMER1 kullansan daha hassas olur (önemli) 8 bitlik bir timer'da 1sn ayarı çok kaba olur
geçen sinüs ölçümü uygulaması vardı bu tür kesmeler geçikiyordu uygulama komutlarının farklılığından dolayı timer artıyor ama int girmediğini gözlemledik ve int. girince timer'ı okuduk ve geçen zaman kadar yazılımda düşüm yaptık yani işin kısası burda kurgular komple yazılımcıya kalmış yazılmıcılığın zevkide bu:)

bunları denersen inşallah yararı olur eğer çok hassas bir iş ise saat pcf8583 gibi entegreler var yanına bir pil takıyorsun sn dk saat gibi bilgileri okuyorsun

saygılar
 
ewt anladım cok saol ;) senin dediğin zaman düşümünü bende yaptım az önce bu programda :) mesela programda IF TMR_0 < 61 dediğimizde programın saniyesi,gercek saatin saniyesine göre 49 saniyede tamamlıyor.bende 49saniye için 61 saykıl gerekiyorsa;60 için( 1 dak) kaç gerekiyor diye orantıdan yaptım we sonuc 50 çıkıyor.yani TMR_0<50 yapınca düzgün sayıyor artık :D

bu arada söylediklerini de uyguluycam çok teşekkür ederim,iyi çalışmalar ;)
 

Yeni mesajlar

Forum istatistikleri

Konular
127,965
Mesajlar
913,961
Kullanıcılar
449,611
Son üye
ramazansanli@

Yeni konular

Geri
Üst