Merhaba arkadaslar,
Her zaman kullandığım pıc lerin dışına çıkarak 16F873A kullanmak istiyorum.Çünkü pın sayısının fazla olması ve çok yönlü
olması işime uygundur.Ama bir sorun var bu picin REGISTER ayarını tam olarak yapamıyorum.Basit bir programda bile program çalış-
mamaktadır.Forumlara baktım ordaki ayarlarda tam olarak pratikte çalışmamaktadır.Acaba bu pic i pıratikte deneyen var mı. yada
programın kendisinde ne gibi sorun görülmektedir.
verıcı
@ DEVICE pic16F873A 'islemci 16F873A
@ DEVICE pic16F873A, WDT_OFF 'Watch Dog timer kapali
@ DEVICE pic16F873A, PWRT_ON 'Power on timer acik
@ DEVICE pic16F873A, PROTECT_OFF 'Kod Protek kapali
@ DEVICE pic16F873A, XT_OSC 'Dahili osilator kullanilmayacak
@ DEVICE pic16F873A, LVP_OFF
@ DEVICE pic16F873A, BOD_OFF
DEFINE OSC 4
PORTA=0:TRISA=%00000110
PORTB=0:TRISB=%00000000
PORTC=0:TRISC=%00000000
OPTION_REG.7=1
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 20h ' Enable transmit, BRGH = 0
DEFINE HSER_SPBRG 25 ' 2400 Baud @ 4MHz, 0,17%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically
VER VAR BYTE
CLEAR
PORTA=0
PORTB=0
PORTC=0
SYMBOL TUS1=PORTA.1
SYMBOL TUS2=PORTA.2
SYMBOL LED=PORTB.4
PAUSE 300
BASLA:
IF TUS1=1 THEN
LED=1:VER=12
GOSUB GONDER
lED=0
ENDIF
IF TUS2=1 THEN
LED=1:VER=24
GOSUB GONDER
LED=0
ENDIF
goto basla
GONDER:
hserout [REP$AA\5,REP$00\5,REP$FF\5]
hserout [REP$AA\5,REP$00\5,REP$FF\5]
hserout ["A","R","A",VER]
hserout ["A","R","A",VER]
return
END
alıcı
@ DEVICE pic16F873A 'islemci 16F628A
@ DEVICE pic16F873A, WDT_OFF 'Watch Dog timer kapali
@ DEVICE pic16F873A, PWRT_OFF 'Power on timer acik
@ DEVICE pic16F873A, PROTECT_ON 'Kod Protek kapali
@ DEVICE pic16F873A, XT_OSC 'Dahili osilator kullanilmayacak
@ DEVICE pic16F873A, LVP_OFF
@ DEVICE pic16F873A, BOD_OFF
Define OSC 4
PORTA=0:TRISA=%00000000
PORTB=0:TRISB=%00000000
PORTC=0:TRISC=%10000000
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 20h ' Enable transmit, BRGH = 0
DEFINE HSER_SPBRG 25 ' 2400 Baud @ 4MHz, 0,17%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically
SYMBOL GIE =INTCON.7 'genel interruptlar? aç?yor
SYMBOL PEIE =INTCON.6 'peripheral interruptlar? aç?yor
SYMBOL RCIE =PIE1.5 'USART Recive interrupt enable bit
SYMBOL RCIF =PIR1.5 'USART Receive interrupt flag bit
PORTA=0
PORTB=0
SYMBOL LED1=PORTC.3
SYMBOL LED2=PORTC.2
SART VAR BYTE
TEMP VAR BYTE
AL VAR BYTE
I VAR BYTE
ON INTERRUPT GOTO KESME
CLEAR
PAUSE 200
RCIE=1
PEIE=1
GIE=1
BASLA:
IF AL=12 THEN
SART=1:LED1=1
For I=0 to 1000
pauseus 5
next
LED1=0:AL=0
ENDIF
IF SART=1 AND AL=24 THEN
LED1=1:LED2=1
For I=0 to 1000
pauseus 2
next
LED1=0:LED2=0:AL=0
ENDIF
GOTO BASLA
'_________________________________________________________
DISABLE
KESME:
GIE=0
hSerIn 5,ATLA,[WAIT("ARA"),AL]
ATLA:
TEMP=RCREG
GIE=1
Resume
enable
end
adcon1=7 ile analog portları (A)dijital yapman gerekmiyormu
16F87xA serisinde A portu önseçimli (default) olarak Komparatör pinleri olarak açılır.
Komparatörü iptal etmek için CMCON=7 komutunu kullanman gerekir.
Komparatörü iptal edince bu seferde aynı pinler Analog pin olarak çalışmaya başlar.
O halde ikinci yapılacak iş Analog pinleride iptal edip aynı pinleri digital giriş/çıkış pini haline getirmek olacaktır.
Bunu yapmak içinde ADCON1=7 komutunu vermen gerekiyor. Bu aşamadan sonra senin program ancak çalışmaya başlayacaktır.
Bu tür bilgiler data sheet de yazıyor. Bakmayı alışkanlık haline getirmelisiniz.
Ete
Alıntı yapılan: ete - 14 Ekim 2012, 16:37:39
16F87xA serisinde A portu önseçimli (default) olarak Komparatör pinleri olarak açılır.
Komparatörü iptal etmek için CMCON=7 komutunu kullanman gerekir.
Komparatörü iptal edince bu seferde aynı pinler Analog pin olarak çalışmaya başlar.
O halde ikinci yapılacak iş Analog pinleride iptal edip aynı pinleri digital giriş/çıkış pini haline getirmek olacaktır.
Bunu yapmak içinde ADCON1=7 komutunu vermen gerekiyor. Bu aşamadan sonra senin program ancak çalışmaya başlayacaktır.
Bu tür bilgiler data sheet de yazıyor. Bakmayı alışkanlık haline getirmelisiniz.
Ete
Bu seri PIClerden çok kullandım. 628A ya göre oldukça gelişmiş. SPI,I2C,USART arayüzlerini tek bir PIC de gömülü barındıran PIC16 serisinin efsanevi serisi bence!
Bu arada yazdığım programlarda ilk setuplara bir göz geçirdim de evet uyarılarda ki gibi PORTA yı eğer I/0 olarak kullanmak istiyorsan
ADCON1 registerine 0x06 veya 0x07 yani ilk 3 bit (xxxx011x) yüklemelisin böylece tüm AN ler I/0 olur.
Alıntı yapılan: ete - 14 Ekim 2012, 16:37:39
16F87xA serisinde A portu önseçimli (default) olarak Komparatör pinleri olarak açılır.
Komparatörü iptal etmek için CMCON=7 komutunu kullanman gerekir.
Komparatörü iptal edince bu seferde aynı pinler Analog pin olarak çalışmaya başlar.
O halde ikinci yapılacak iş Analog pinleride iptal edip aynı pinleri digital giriş/çıkış pini haline getirmek olacaktır.
Bunu yapmak içinde ADCON1=7 komutunu vermen gerekiyor. Bu aşamadan sonra senin program ancak çalışmaya başlayacaktır.
Bu tür bilgiler data sheet de yazıyor. Bakmayı alışkanlık haline getirmelisiniz.
Ete
Hocam CMCON 16f62x lerde var. 16F87x lerde sadece ADCON1 = 7 yapmak yeterlidir.
Belırtğiniz noktalar doğru aslında programla okadar uğraştımki programın son şeklinde fark etmeden silerek göndermişim :-[ belirtiğiniz anda fark ettim aslında.Ama yinede program ısıs te çalışıyor ama halen pıratik devrede çalışmamaktadır.Acaba donanım kesmesinde mi sorun var.
Vericide yer alan Hserout satırlarını çifter çifter yazmışsın gerek yok faydası olmadığı gibi senkronu bozacağı için zararı dokunur.
Bir satı preambl ve bir satır veri yollama şeklinde yaz fazlalıkları sil.
Programın isiste çalışp gerçekte çalışmaması demek isisin varsayımlarını kontrol etmen demek oluyor.
1. İsis MCLR pininde Pullup varmıdır diye bakmaz var kabul eder. İşlemcinin 1 nolu pininde pullup direnci yok ise bağlamalısın.
2. İsis besleme yi var kabul eder. O halde işlemcilere +5V ulaşıyormu bakıver. Tabiiki GND olması gereken pinlerinde de GND olmalıdır.
3. İsis işlemciye kristal bağlımı bakmaz. Var kabul eder. O halde işlemciye 4 Mhz lik kristal takılımı ve kristal kullanılıyorsa kristal bacakları 22pf ile GND ye bağlanmışmıdır kontrol et. Yada Rezonatör kullandın ise dıştaki bacakların işelmcinin OSC bacaklarına bağlımı. Ortadaki bacağında GND ye bağlı olması gerekir. Bunları kontrol ediver.
4. Butonları pull-down 'lı olarak kullanmışsın. Her bir buton pininde pull-down direnci bağlımıdır ve buton pinleri low da beklemektemidirler kontrol et. Butona basılınca pine +5V tatbik ediliyormu kontrol et.
Şİmdilik aklıma gelenler bunlar. SOnucu bildirirsen memnun olacağım.
Ete
Ete hocam,
Belirttiğiniz noktalardan hepsini yaptım.dediğiniz noktadan pıc lere MCLR ayağına direnç bağlamamıştım.MCLR ayağına
direnç bağlandıktan sonra verici çalıştı. Bilgi gönderiyor ama alıcıya bilgi gitmiyor.
Alıcın bozuktur o zaman. Başkada bir sebep kalmadı çünkü.
Ete
Alıntı yapılan: SERCE - 14 Ekim 2012, 20:57:30
Ete hocam,
Belirttiğiniz noktalardan hepsini yaptım.dediğiniz noktadan pıc lere MCLR ayağına direnç bağlamamıştım.MCLR ayağına
direnç bağlandıktan sonra verici çalıştı. Bilgi gönderiyor ama alıcıya bilgi gitmiyor.
Hangi arayüzü kullanıyorsun seri haberleşme için?
Usart? spi? I2C? veya USARTA bağlı RS485...vs?
Alıcın belkide çalışıyor sen farkedemiyorsun. Programda gecikme yaratmak için kullandığın I değişkenini byte cinsinden tanımlamışsın ama döngü kurar ken 0 to 1000 olarak kurmuşsun. Bu döngüler hep 0 to 255 olarak çalışır. Buda epeyce kısa bir süredir ve ledlerin yanıp söndüğünü pek göremezsin.
Ete
Haberleşme sistemi olarak USART kullanıyorum.I değişkenini WORD cinsinden tanımladım.Alıcıyı değiştirdim.Yinede herhangi
bir değişim olmadı.Acaba programın haberleşme kısmında mı sorunvar?
İsiste çalıştığını kendin söyledin. Ohalde yazılımda bir sorun yok demektir. Zaten programa baktım ve olası sorunları da sana söyledim. Onların haricinde bir sorun göreremedim ben.
Ete