PIC BASIC PRO Öğreniyoruz soru cevapları

Başlatan aster, 19 Mayıs 2005, 17:33:33

emrah

#285
programı diger konulardan aldıgım için degişken olacagını tahmin edemedim.
TEMP VAR BYTE  olarak tanımladım, temp içeriği ne olacak ?

programda yazılış yerleri ile sizin anlatıgınızın arasında bir baglantı kuramadıgımdan sorum. örnegin kesme içerisindede  gie=1 gie=0 kullanılmıs, bunların nerede kullanılacagını bilmemem önemli değilmi?  define olarak çagrılan kodların karsılarında HSER_BAUD  1200  , HSER_SPBRG 207   gibi tanımlamalrda degişkenler öenmli değilmi.

define HSER_BAUD  1200

kullanmışım ama data gönderdigim programda SEROUT2 PORTB.5,396  kullanmısım buradaki baud ayarları farklı değilmi?  define HSER_BAUD  1200  burdaki 1200 neye göre yazılıyor?

bunların ayarlarının nasıl olacagını sormustum hocam !!!


ete

Emrah,

Define tanımlamaları elbette önemli. Ancak orada herhangi bir değişken kullanılmıyor. Onlar pic in register isimleridir.
Define tanımlamaları için en güzeli  "PicMultiCalc.Exe" isimli programı kullanmaktır. İnternette ararsan bulabilirsin.
Programın USART butonuna tıklayınca  sana osc frekansını , haberleşme hızını zoruyor ve bunları girincede hesabı yapıp bulduklarını hem ekrana hemde bir yere yapıştırabilmen için clipboard a kopyalıyor.

Diğer bilgilere gelince programa bakınca ;
SYMBOL  GIE  =INTCON.7
SYMBOL  PEIE =INTCON.6
SYMBOL  RCIE =PIE1.5   
SYMBOL  RCIF =PIR1.5
atamalarını görebiliyorsundur. Burada GIE nin aslında INTCON.7 olduğunu hemen anlaman gerekir.
PEIE ninde INTCON.6 olduğunu anlaman gerekir.

Sonuçta o program USART kesmesi için bir örnek. Haberleşme hızları benim ayarladığım şekilde değil. Nerden aldın bilemiyorum programı ama doğru ayarlar aşağıdadır;
1200 Baud için
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 20h ' Enable transmit, BRGH = 0
DEFINE HSER_SPBRG 51  ' 1200 Baud @ 4MHz, 0,17%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically

2400 Baud için
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

4800 Baud için
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 20h ' Enable transmit, BRGH = 0
DEFINE HSER_SPBRG 12  ' 4800 Baud @ 4MHz, 0,17%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically

9600 Baud için
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
DEFINE HSER_SPBRG 25  ' 9600 Baud @ 4MHz, 0,16%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically

Bu programı amacına uygun düzenleyerek kullanabilirsin. Yinede anlamadığın kısımlar var ise yalnızca o kısımları sorarsan açıklarım. Soruları çok genel sorunca konu dağılıyor.

Ete


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

emrah

uygulamadan önce programı simulasyonda deniyorum fakat olmuyor.
alıcı ve verici programını veriyorum birde siz inceleyin.
define ayarlarını dediginiz programda 1200 baud a göre ayarladım.

verici:

@ DEVICE PIC16F628A                                                     
@ DEVICE PIC16F628A, WDT_OFF       
@ DEVICE PIC16F628A, PWRT_ON             
@ DEVICE PIC16F628A, PROTECT_OFF         
@ DEVICE PIC16F628A, MCLR_OFF             
@ DEVICE PIC16F628A, INTRC_OSC_NOCLKOUT

CMCON = 07    ;PORTA Dijital
INCLUDE "modedefs.bas"
OPTION_REG.7 = 1   ;PORTB Pull-UP lar aktif
TRISB = %00000001     ' BUTON PORTB0, DATA PORTB5
TRISA = %00000000
VERI VAR BYTE

PAUSE 500

PORTB=0
PORTA=0
VERI=100
ANADONGU:

       IF PORTB.0=1 THEN
       SEROUT2 PORTB.5,1200,[REP$AA\5,REP$00\5,REP$FF\5]  ;Preamble + Sencron Gönderimi   
       SEROUT2 PORTB.5,1200, ["D","A","T","A",dec VERI] 
     
       SEROUT2 PORTB.5,1200,[REP$AA\5,REP$00\5,REP$FF\5]  ;Preamble + Sencron Gönderimi   
       SEROUT2 PORTB.5,1200, ["D","A","T","A",dec VERI]
        ENDIF
       
       PAUSE 10
     
       GOTO ANADONGU

alıcı :

@ DEVICE PIC16F877A                                                     
@ DEVICE PIC16F877A, WDT_OFF       
@ DEVICE PIC16F877A, PWRT_ON             
@ DEVICE PIC16F877A, PROTECT_OFF                     


'DEFINE  HSER_RCSTA 90h 
'DEFINE  HSER_TXSTA 24h   
'DEFINE  HSER_BAUD  396 
'DEFINE  HSER_SPBRG 207 
'DEFINE  HSER_CLROERR 1 

DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 20h ' Enable transmit, BRGH = 0
DEFINE HSER_SPBRG 51  ' 1200 Baud @ 0,17%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically




 
SYMBOL  GIE  =INTCON.7 
SYMBOL  PEIE =INTCON.6 
SYMBOL  RCIE =PIE1.5   
SYMBOL  RCIF =PIR1.5
ON INTERRUPT GOTO KESME
OPTION_REG.7=0
ADCON1=7
RCIE=1
PEIE=1
GIE=1


TRISA=%00000000
TRISB=%00000000
TRISC=%00000000
TRISD=%00000000
TRISE=%000

OPTION_REG.7=1
VERI VAR BYTE
TEMP VAR BYTE
PAUSE 500

PORTB=0
PORTA=0
PORTC=0
PORTD=0
PORTE=0
VERI=0

 
ANADONGU:


   

IF VERI=100 then
HIGH PORTB.2
else
LOW PORTB.2
ENDIF

HIGH PORTB.1
PAUSE 500
LOW PORTB.1
PAUSE 500
HIGH PORTB.1
PAUSE 500
LOW PORTB.1
PAUSE 500
HIGH PORTB.1
PAUSE 500
LOW PORTB.1
PAUSE 500



GOTO ANADONGU

DISABLE
KESME:
GIE=0
HSerIn ,3,ATLA, [WAIT("DATA"),VERI]




ATLA:
TEMP=RCREG
GIE=1
Resume
enable

ete

Alıcı kısmına bir bak ;
Alıcı RF modülden çıkan sinyalin Pic'e girişinde bir giriş pini gerektirir.
Peki nerede senin giriş pinin.
Programa bir bak istersen hiç bir tane TRIS register ayarı yok. Bunları düşünmen gerekir. Öyle değilmi.
USART kullandığın zaman standart USART pinlerini kullanman gerekir. Bunlar 16F877A da;
TX= PortC.6
RX= PortC.7

Bu durumda PORTC.7 nin mutlaka giriş olarak ayarlanması gerekir. TRISC=%10000000 şeklinde
Diğer Tris registerlerinide yazsan iyi olur.

Simulasyon için, Vericide TX pini PortB.5 gözüküyor. Bu pin ALıcıda PortC.7 ye bağlanacaktır.

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

emrah

evet oraları ayarlamayı unutmusm. fakat halen calıstırmadım simulasyonda. size simulasyon ve kodları gönderiyorum hocam, buseferki sorunu bulamıyorum. bilmedigim yerlermı var halen?

http://hotfile.com/dl/117237543/fb7194a/RF.rar.html

ete

Yine bazı eksikler var ama asıl önemlisi, 1200 Baud un bu işe an azından isisde uygun olmaması.
Bu nedenle hızı 2400 Baud'a yükselttim.
Kesme kullanılanbir programda pause komutu kullanılamaz. Zira pause süresi dolana kadar kesme oluşsada program komutu bitirinceye kadar kesme etiketine gidemez. Bu nedenle pause yerine pauseus kullanmak ve bu komut da da süreyi 5 us den fazla yapmamak gerekir.
Bu dediklerimi uyguladığım ve amacına uygun olarak yapmaya çalıştığım program aşağıdaki linktedir.

http://dl.dropbox.com/u/25364674/RF_ete.rar

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

emrah

ete hocam yardımlarınız için çok teşekkür ederim.

simulasyonda data yoluna baglı olan şey ne içindir? olmazsa olmazmı ?

benm program yapmak istedigim şu idi fakat yaptıgınıuz biraz farklı olmus

alıcı devresindeki kırmızı led ana döngüde sürekli yanıp söneceti ve data geldigi zaman usart kesmesi olusup yeşil led yanacaktı.

amacım; ana döngü meşgul olmadan ( kırmızı led sürekli yanıp sönerken) seri bilgi geldiginde yeşil ledin yanması.


ete

Onun adı Virtual Terminal dir. Seri portun çalışıp çalışmadığını oradan gözlemleyebilirsin.
Ona sağ tıkla ve açılan pencerede Baud Rate karşısına 2400 yazıver.
Daha sonra programı çalışıtır ve yukarıda Debug menüsünü açıver.
Açılan pencerede altta yer alan seçeneklerden 2 numarada yer alan "Watch window" a tıkla.
Aynı şekilde 5 numarada yer alan Virtual Terminale de tıkla. Böylece bunlara ait aletler akrana gelecektir.
Butona bastığın zaman Virtual terminalde gönderilenleri görebilirsin.
Gerçek devrede bu alet tabiiki olmayacaktır. Yalnızca simulasyonda yardımcı olan ekipmandır.

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

emrah

sayenizde bunuda ögrendim hocam teşekkürler.

şöyle bir sorun oluyor ;
kırmızı led hızlı yanıp sönerken data göndermeye basılı tuttugumda kırmızı ledin yanıp sönmesi yavaşlıyor,bu simulasyondan dolayımı?

birde programda, data geldigi zaman yaptıracagımız işi kesme alt programı içerisinde yaptırabilirmiyiz ?

şu şekilde

ANADONGU:

PORTB.1=1
GOSUB GECIKME
PORTB.1=0
GOSUB GECIKME



GOTO ANADONGU

GECIKME:
        FOR I=0 TO 255
           PAUSEUS 5
        NEXT
        RETURN   
'-----------------------------------------------------------------
DISABLE
KESME:
GIE=0
HSerIn ,5,ATLA, [WAIT("DATA"),gelen]

IF gelen=100 then
portb.2=1
else
portb.2=0
endif

TEMP=RCREG


ATLA:

GIE=1
Resume
enable



ete

yavaşlama simulasyondan dolayı.
Diğer konuyu dene istersen. Orada yapacağın işin süresi uzun olmamalı. Uzun olursa veri kaçırırsın.

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

emrah

herşey için tekrar teşekkür ederim hocam, iyi çalışmalar ...

emrah

ete hocam sizin gönderdiginiz programda 16f877a için

adcon1=7 kullanmıssınız burayı anladım fakat cmcon=7 ne için?  bu komut 16f628a da copmaratör pinleri iptali için degilmi ?

ete

16F877 de komparatör yoktur ama 16F877A da komparatör vardır.!!!!!!!!!!!!!!!!!!!

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

emrah

hocam dünkü projeyi uygulamak şimd nasp oldu fakat sorun var.

simulasyondaki gibi kesme olustugu zaman, ana menudeki yanıp sönen ledin flas hızı düşüyor.ve  100 bilgisi geldiginde diger ledin yanması gerekirken yanmıyor.

birde  verici programıda data gönderirken baud 396 olarak yazmışız? 2400 olması gerekmezmi? alıcı programında baud 2400 olarak ayarlı. verici programında  2400 yaptıgımda simulasyondada çalışmıyor.

YOLLA:
       SEROUT2 PORTB.5,396,[REP$AA\5,REP$00\5,REP$FF\5]  ;Preamble + Sencron Gönderimi   
       SEROUT2 PORTB.5,396, ["D","A","T","A",VERI] 
       RETURN

ete

2400 Baud un karşılığı 396 dır. Lütfen MCS de komut üzerine kursörü getirip F1 tuşuna basın. Ekrana o komutla ilgili açıklamalar gelecektir. Oradan görebilirsiniz.
O programda flash led kullanmak çok mantıklı değil aslında. Zira ledleri flash yaptırırken bilgi alma kısmında aksamalar olabilir.
Flash işinide timer kesmesi kullanarak yapmak mümkün tabiiki ama iş epeyce uzayacak.
Benim amacım sana çalışanbir USART kesmesi göstermekdi onuda yaptım. Diğer isteklerini kendin geliştirmek durumundasın.

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