16F873A pic'i nasıl kullanılır

Başlatan SERCE, 14 Ekim 2012, 16:14:36

SERCE

  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

halilgalic

adcon1=7 ile analog portları (A)dijital yapman gerekmiyormu

ete

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
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

Pyrodigy

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.
Persistance is the name of the game in this business....

XX_CİHAN_XX

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.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

SERCE

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.

ete

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
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

SERCE

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.

ete

Alıcın bozuktur o zaman. Başkada bir sebep kalmadı çünkü.
Ete

Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

Pyrodigy

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?
Persistance is the name of the game in this business....

ete

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
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

SERCE

 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?

ete

İ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
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com