Merhaba arkadaşlar,
4 gündür siteye erişemiyordum, artık daral gelmişti.Kendimi yalnız
kalmış gibi hissetmeye başlamıştım. :cry:
Şuan bir saat devresi üzerinde çalışıyorum.16f84 ve 74HC595 li, 6 dijitli (hh:mm:ss)bir saat ama bir sorunum var.Saat değerlerini 7 segmente göre
çevirmek ciddi bir problemim oldu.Birkaç yöntem geliştirdim ama çok yer kaplıyor ve aksamalara sebep oluyor.
Bu konuda bilgisi veya önerisi olan arkadaşlar var ise çok memnun
olacağım.
Şimdiden teşekkürler.
4.17.7. DIG
DIG returns the value of a decimal digit. Simply tell it the digit number
(0 - 4 with 0 being the
rightmost digit) you would like the value of, and voila.
B0 = 123 ‘ Set B0 to 123
B1 = B0 DIG 1 ‘ Sets B1 to 2 (digit 1 of 123)
Sevgili Cnt,
Hata bende, sanırım ben tam olarak anlatamadım.
3 basamaklı bir sayıyı, 3 parçaya ayırmak değil
istediğim.
farzedelimki saat 13:00 olsun.
saatin birinci dijitini (1x:xx)ayırdım ve 595 e göndermek istiyorum.Değişkendeki formatı ne olursa olsun(bin,hex,dec), gönderirsem doğal olarak
7segmentte a segmenti ışık verecek, halbuki b segmentinin de yanması gerekli.
En içten teşekkürler... :)
Hadi arkadaşlar aklınızdan birşeyler geçmiyor mu? Tam 26 kişi bakıyor ama sadece cnt öneride bulunuyor.
Saçma gibi gelse de denemek istiyorum, siz söyleyin ben dinlerim.
İki gündür sıyırmama az kaldı.
Kurtarın bu Allah'ın kulunuuuuu. :?
Help me!!!
Re : katana
Bunun icin table yontemi kullanılır...
hatta table yonteminden baska bir yontem bilmiyorum
ben..
ama bu yontem cok kısa ve kullanıslı bir yontemdir..
595 in cikislerinin her birinin bir segment e denk geldigini ve displayinin ortak katotlu olduugunu varsayara
konusuyorum..
eger ortak anotlu display kullanıyorsan(ki ben olsam oyle yapardım) tabloyu degistirmen gerekir..
once displayde 0,1,2,3,4... rakamlarının gozukmesi icin hangi hex
sayıları gondermen gerektigini belirliyorsun.
ornegin 0 icin a,b,c,d,e,f segmentleri 1 g segment 0 olmalıdır.
1111 1100 ==>FCh sayısı 0 ın karsılıgıdır.
1 icin sadece
b,c 1 olacak digerleri 0
0110 0000 ==> 60h sayısı 1 in karsılıgıdır..
bu sekşilde hepsini hazırlayıp elindeki sayı 5 ise onun tablodan karsılıgını bulup o sayıyı
gondereceksin.
en son 595 ini latch sinyalini de gonderirisen hicbir titreme olmadan cıktı alırsın..
gerci 6-7 display icin 164 te kullansan olurdu...
PIC assemblysinden fazla
anlamadıgımdan kod veremiyorum...
umarım anlatabilmisimdir..
DerWish.
dostum dig komutuyla böldükten sonra mesela sayiyi bir degiskene (ornekte x) yükle
daha sonra
SELECT CASE
x
CASE 0
segment = %01111110
CASE 1
segment = %00110000
CASE 2
segment = %01101101
....
....
....
....
CASE 9
segment =
%011111011
END SELECT
ve segmenti degiskenini cikis portuna gonder.
bu arada segment degiskeninin icerigi 0abcdefg şeklinde.
teşekkürler dostlar,
ilk denediğim yöntem kendi kendini takip ettirmekti ama çok yer kaplayacağı için
vazgeçtim.
Daha sonra dt yi denedim ama içime sinmedi, sana msg yazarken de başka bir yöntem üzerinde çalışıyordum ve tamamdır. Harika oldu.
Tabloyu binary olarak hazırlayıp
programlama aşamasında e2 ye gömdüm.
daha sonra dijitleri ayırıp adres counter olarak yine kendisini kullandım ve çok kısa ve hoşuma giden bir sonuç çıktı ;)
...
G1A
VAR BYTE
G1B VAR BYTE
G2A VAR BYTE
G2B VAR BYTE
G3A VAR BYTE
G3B VAR BYTE
D1 VAR BYTE
D2 VAR BYTE
D3 VAR BYTE
D4 VAR BYTE
D5 VAR BYTE
D6 VAR BYTE
GUNCELLE VAR BIT
I VAR BYTE
WRITE 0,%00111111
WRITE 1,%00000110
WRITE 2,%01011011
WRITE 3,%01001111
WRITE 4,%01100110
WRITE
5,%01101101
WRITE 6,%01111101
WRITE 7,%00000111
WRITE 8,%01111111
WRITE 9,%01101111
.
.
.
DECIMAL:
G1A=SANI DIG 1
G1B=SANI DIG 0
G2A=DAKI DIG 1
G2B=DAKI DIG 0
G3A=SAAT DIG 1
G3B=SAAT DIG 0
READ G1A, G1A
READ G1B, G1B
READ G2A, G2A
READ G2B, G2B
READ G3A, G3A
READ G3B, G3B
.
.
.
SHIFTOUT DPIN, CPIN, 1, [G1B,G1A,G2B,G2A,G3B,G3A]
PULSOUT YAZ, 10
GOTO
ANADONGU
.
.
.
gibi.
Bir arkadaşım daha öncesinde yazdırıp tasarlattığı bir iş içindi.
Halı sahalar için bir scoreboard+time devresi
idi.
Pek çok yere dağıtmış ve devreyi değiştiremiyor.O yüzden devreye göre program yazıyorum.Ben olsam bu tarz da yapmazdım ama ne yaparsın hatır işte.
Şimdi RB0 ile ilgili bir
sorunum var, onunla boğuşuyorum. :twisted:
RBPU dan pullup düşmüyor kafayı şimdi buna bozdum.
Yardımınız için teşekkür ederim...
Bir kaç güne kadar gruba upload edeceğim.
önerilerinizi beklerim :) ( eleştrilerinizide) :evil:
sevgiler...
selam, gercekten ilginc bir konu
belki asagdaki sema ve pbp kodlarindan yararlanarak 74HC595 ile bir uygulama
yapabiliriz.
(http://home.no/fsan/projects/Diverse/7-seg%20UP_DN_Counter/Image1.gif)
'*********************************************
*******************
'* Name : 7-seg UP_DN_Counter.BAS *
*
'****************************************************************
@ device xt_osc, wdt_off, pwrt_on, protect_off
'***** Seven Seg code 'depending on how each seg is hooked
to the port
Zero con %11000000 'abcdef
One con %11111001 'bc
Two con %10100100 'abdeg
Three con %10110000 'abcdg
Four con %10011001 'bcfg
Five con %10010010 'acdfg
Six con %10000010 'acdefg
Seven con %11111000 'abc
Eight con %10000000 'abcdefg
Nine con %10011000 'abcfg
X
var byte
Counter var word
PBup var porta.0
PBdn var porta.4
DoOnce var bit
Trisa=%10001
Trisb=%00000000
porta = 0
portb =
0
DoOnce = 0
Counter = 880
Main:
For X = 0 to 2 '***number of digits 'three in this case
'***code to do something, must not pause for anything
'***or the display will look jerky
If (PBup = 1) and (DoOnce = 0) then
DoOnce = 1
Counter = Counter + 1
else
If (PBdn = 1) and (DoOnce = 0) then
DoOnce = 1
Counter = Counter - 1
endif
Endif
If (PBup = 0)
and (PBdn = 0) and (DoOnce = 1) then DoOnce = 0
Lookup (Counter dig
(X)),[Zero,One,Two,Three,Four,Five,Six,Seven,Eight,Nine],Portb
'***drive for all segments
Lookup X,[2,4,8],Porta
'***drive
for common anode connection,
'***Porta.1 for display 1, Porta.2 for display 2, Porta.3 for display 3
pause 10
Next X
Goto Main
End
http://home.no/fsan/projects/Diverse/7-seg
UP_DN_Counter/ (http://home.no/fsan/projects/Diverse/7-seg%20UP_DN_Counter/)
Benim şu an yazdığım kodlar aşağıda, Henüz detayına inmedim ama sorunsuz simüle edebiliyorum.595 mdf siiçin üstat
XNHCX ' in verdiğiği dosyayıaldım.2 taneden fazla kullanılırsa bazı ayarlar yapılması gerekiyor en azından bende böyle oldu.
sevgiler... :D
isis ve pbp olarak gruba aktarıyorum
ama henüz bitmedi.Bitirmeden önerileriniz olursa sevinirim. :o
'***********************************************
INCLUDE "modedefs.bas"
'KESME KORUMA
TANIMLARI
@ DEVICE WDT_OFF
'BUTON TANIMLAMALARI
DPIN VAR PORTA.0
CPIN VAR PORTA.1
YAZ VAR PORTA.2
ZIL VAR PORTA.3
RENK VAR PORTA.4
'YAZMAC TANIMLAMALARI
TRISA =0
PORTA=0
SAAT
VAR BYTE
DAKI VAR BYTE
SANI VAR BYTE
SKES VAR BYTE
MACDAKI VAR BYTE
ASCORE VAR BYTE
BSCORE VAR BYTE
G1A VAR BYTE
G1B VAR BYTE
G2A VAR BYTE
G2B VAR BYTE
G3A VAR BYTE
G3B VAR
BYTE
A1 VAR BYTE
A2 VAR BYTE
S1 VAR BYTE
S2 VAR BYTE
B1 VAR BYTE
B2 VAR BYTE
GUNCELLE VAR BIT
I VAR BYTE
WRITE 0,%00111111
WRITE 1,%00000110
WRITE 2,%01011011
WRITE 3,%01001111
WRITE 4,%01100110
WRITE 5,%01101101
WRITE 6,%01111101
WRITE 7,%00000111
WRITE 8,%01111111
WRITE 9,%01101111
'ANA PROGRAM
'********************************************************************
SANI=0
DAKI=0
SAAT=0
MACDAKI=0
ASCORE=0
BSCORE=0
G1A=0
G1B=0
G2A=0
G2B=0
G3A=0
G3B=0
A1=0
A2=0
S1=0
S2=0
B1=0
B2=0
OPTION_REG =$D5
INTCON=%00100000
ON INTERRUPT GOTO ZSAAT
TRISB=1
PORTB=0
'----------------------------------------------------------------------
'*********************************************************************
ANADONGU:
IF
PORTB=%00010100 THEN DAKUP
IF PORTB=%00011000 THEN DAKDN
IF PORTB=%00010001 THEN SAATUP
IF PORTB=%00010010 THEN
SAATDN
KONTROL:
SHIFTOUT DPIN, CPIN, 1, [G1B,G1A,G2B,G2A,G3B,G3A]
PULSOUT YAZ, 10
IF PORTB=%00100000
THEN MAC_ANADONGU
GOTO ANADONGU
'*******************************************************************
DAKUP:
DAKI=DAKI+1
IF DAKI>59 THEN
DAKI=0
SAAT=SAAT+1
IF SAAT>23 THEN
SAAT=0
ENDIF
ENDIF
GOTO DEBOUNCE
'******************************************************************
DAKDN:
DAKI=DAKI-1
IF DAKI>59 THEN
DAKI=59
SAAT=SAAT-1
IF SAAT>23 THEN
SAAT=23
ENDIF
ENDIF
GOTO DEBOUNCE
'*****************************************************************
SAATUP:
SAAT=SAAT+1
IF SAAT>23 THEN
SAAT=0
ENDIF
GOTO
DEBOUNCE
'******************************************************************
SAATDN:
SAAT=SAAT-1
IF SAAT>23 THEN
SAAT=23
ENDIF
'*****************************************************************
DEBOUNCE:
FOR I= 1 TO 25
PAUSE 10
NEXT
I
GOTO KONTROL
DISABLE
'*******************************************************************
ZSAAT:
SKES= SKES+1
IF SKES<61 THEN
KCIK
SKES=0
SANI=SANI+1
IF SANI>59 THEN
SANI=0
DAKI=DAKI+1
IF DAKI>59 THEN
DAKI=0
SAAT=SAAT+1
IF SAAT>23 THEN
SAAT=0
ENDIF
ENDIF
ENDIF
'******************************************************************
DECIMAL:
G1A=SANI DIG 1
G1B=SANI DIG 0
G2A=DAKI DIG
1
G2B=DAKI DIG 0
G3A=SAAT DIG 1
G3B=SAAT DIG 0
READ G1A, G1A
READ G1B, G1B
READ G2A, G2A
READ G2B, G2B
READ G3A, G3A
READ G3B, G3B
'********************************************************************
'KESME
SON
'********************************************************************
KCIK:
INTCON.2=0
RESUME
ENABLE
'********************************************************************
'MAÇ
AYARLARI
'********************************************************************
MAC_ANADONGU:
IF PORTB=%00010000 THEN ANADONGU
IF
PORTB= 00000001THEN
BSCORE=BSCORE+1
GOTO MACDEBOUNCE
ENDIF
IF PORTB=%00000010 THEN
BSCORE=BSCORE-1
GOTO MACDEBOUNCE
ENDIF
IF PORTB=%00000100 THEN
ASCORE=ASCORE+1
GOTO
MACDEBOUNCE
ENDIF
IF PORTB=%00001000 THEN
ASCORE=ASCORE-1
GOTO MACDEBOUNCE
ENDIF
IF
PORTB=%00100010 THEN MACDAKUP
IF PORTB=%00100001 THEN MACDAKDN
IF PORTB=%01000000 THEN MACBASLA
IF
PORTB=%10000000 THEN
HIGH ZIL
FOR I= 1 TO 1000
PAUSE 5
NEXT I
LOW ZIL
GOTO ANADONGU
ENDIF
'DECMAC
A1=ASCORE DIG 1
A2=ASCORE DIG 0
S1=MACDAKI DIG 1
S2=MACDAKI DIG 0
B1=BSCORE DIG 1
B2=BSCORE DIG 0
READ A1,A1
READ A2,A2
READ S1,S1
READ S2,S2
READ B1,B1
READ B2,B2
MAC_KONT:
SHIFTOUT DPIN, CPIN, 1, [B2,B1,S2,S1,A2,A1]
PULSOUT YAZ, 10
GOTO
MAC_ANADONGU
'**************************************************
MACDAKUP:
MACDAKI=MACDAKI+1
IF MACDAKI>99
THEN DAKI=00
GOTO MACDEBOUNCE
MACDAKDN:
MACDAKI=MACDAKI-1
IF MACDAKI>99 THEN DAKI=00
MACDEBOUNCE:
FOR I= 1 TO 25
PAUSE 10
NEXT I
GOTO
MAC_ANADONGU
MACBASLA:
S1=0
S2=0
HIGH ZIL
FOR I= 1 TO 1000
PAUSE 5
NEXT I
LOW ZIL
GOTO MAC_ANADONGU
end
Tamamdır.
Gruba aktardım ve yorumlarınızı
bekliyorum.:)
http://groups.yahoo.com/group/PicProjeUP1/files/katana/[url]
Arkadaşlar kesinlikle epromdan okuma ve yazma olayını böyle sık kullanımlar için tavsiye etmiyorum.Arkadaşlardan birisi 1000.000.000 dan fazla yazma yapınca sarhoş oluyor demişti(Kafam karışık ismi hatırlayamıyorum,özür dilerim).Kesinlikle doğru.Pic 20 gün çalıştı ve aptallaştı.Data table kullanmanız çok daha sağlıklı :?
eepromlarında bir yazma okuma ömrü var.o yüzden dengeli kullanmak lazım.ben exelde çok basit bir çevrim tablosu yaptım port uçlarını ve segmentleri ayarlıyorsun sana direk ascii yi yedi segmente çeviren table oluşturuyor.kopyala yapıştır yaparak programa ekliyorum.hem ascii gönderince yazabildiği sembol veya harfleride yazıyor, ayrıca birşey yapmaya gerek kalmıyor.
mcu flash epromların yazılım ömrü 100.000 kezdir fakat i2c veya normal paralel epromların yazılım ömrü 1000.000 kezdir(bu firmaya görede değişiyor) yerinden çıkarmazsan pek bir şey olmuyor.
Özür dilerim. 3 sıfır fazla yazmışım.