PIC BASIC PRO Öğreniyoruz soru cevapları

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

firtina

Dostlar ben bir şey danışacağım
Servo motoru önce sola sonra sağa, durdurulana kadar döndüren bir program yazmaya çalışıyorum.

devre şeması:
[IMG]http://img145.imageshack.us/img145/666/servodeneme.png[/img]

kondanstörler arasındaki eleman 4MHz'lik kristaldir

16f628a çipi kullamak amacı ile hazırladığım program alttaki gibi
b0 var byte
b2 var byte
b0 = 100
b2 = 1
basla:
pulsout 2, 150
pause 20
b2 = b2 + 1
if b2 > 100 then sol
goto basla
sol:
pulsout 2, b0
pause 20
b0 = b0 + 1
if b0 > 199 then sag
goto sol
sag:
pulsout 2, b0
pause 20
b0 = b0 - 1
if b0 < 101 then sag
goto sag

ama -20 derece dönüp sağa dönüyor ve duruyor.
Öneriniz nedir?




bircan

mrb ete hoca bende sizin baslatiginiz sayenizde ogrendigimiz pic basic i ogreniyorum. geldigim asama olarak suan 5. derse gelmis durumundayim fakat bu derslen ilgili olarak biraz sikinti yasiyorum. bunlardan birincisi:ADC kismindaki sayisal hesaplama boyutu ikincisi ise uygulama olarak orneklerin kisitli olmasindan kaynakli. bu konuda sizin bu konuya yonelik hem anlatim hemde uygulama olarak onereceginiz yontem veya kaynak var mi?
GEREK YOK HER SOZU LAF ILE BEYANA , BIN SOZ EDER BIR BAKIS BAKISTAN ANLAYANA... MEVLANA

ete

Fırtına,
Servo motorlar puls ile konum alan motorlardır.  Piyasa motorları genelde 50-200 us arasındaki pulsları kabul eder.
Denemeni simulasyon programındamı yapıyorsun yokse gerçek motorlamı yapıyorsun.?
Şayet gerçek motorla yapıyor isen puls aralığını öğrenmen gerekiyor. 0,5-2ms şeklkinde veriliyor bu aralık. Seninki nedir.?

Ona göre öneride bulunacağım.


Bircan,

Derlerdeki örnekler bence yeterli . Bir çok kişi bunlardan öğrendi . Senin takıldığın yer neresidir yada öğrenmek istediğin nedir? Daha fazla detay verirsen yardımcı olabilirim.

Ete

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

firtina

Simulatör programında test ediyorum.Benim yazdığım koddaki puls değeri pulsout komutunun mikrosaniye x 10 komutundan dolayı 1,0 ve 2,0 milisaniye arasında gidip geliyor, ama servo motordaki oynama dalgalarla orantılı değil.

ete

Fırtına,

Aşağıdaki örnekleri bir incele bakalım .
Simulasyondaki motorlar 500us - 2000us arası palslarla çalışır.
Pulsout süresi 1250 us  (pulsout değeri 125) olursa motor orta noktada durur.
Pulsout süresi 2000 us (pulsout değeri 200) olursa motor sola döner
Pulsout süresi   500 us (pulsout değeri 50) olusa motor sağa döner
500us lik puls ile motor maksimum sağ noktasına gelir. 2000us lik puls ile motor maksimum sol noktasına gelir. Aradaki değelerde motoru sağ ile sol arasında gezdirir. Orta nokta için 1250us puls verilmesi gerekir.

http://www.upload.gen.tr/d.php/www/1e0wqhxs/SERVO_ETE.rar.html

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

sorridente

İyi geceler bnm de bir sorum olacaktı.PıcBasic dilini bilmiyorum ve Elimde klavyeden girilen sayıya kadar sayan bir program var bu programı girilen sayıdan sıfıra doğru saymasını sağlamak için programda hangi kodlarda değişiklik yapmalıyım.
YATAY_A VAR PORTB.4 
YATAY_B VAR PORTB.5 
YATAY_C VAR PORTB.6 
YATAY_D VAR PORTB.7 
DIKEY_1 VAR PORTB.1 
DIKEY_2 VAR PORTB.2 
DIKEY_3 VAR PORTB.3 

DEFINE LCD_DREG PORTD 
DEFINE LCD_DBIT 4 
DEFINE LCD_EREG PORTD 
DEFINE LCD_EBIT 1 
DEFINE LCD_RSREG PORTD 
DEFINE LCD_RSBIT 0 


ZAMAN VAR WORD 
TUS VAR WORD 
'------------------------------------------------------------- 

TRISB=%0001110 
TRISA=%00000000 
OPTION_REG.7=0 

'-------------------------------------------------------------

RESET :
TUS=0 
ZAMAN=0
YATAY_A=1
YATAY_b=1
YATAY_c=1
YATAY_d=1
LCDOUT $FE,1, "SAYIYI GIRINIZ"
GOTO BASLA

SAYDIR: 
LCDOUT $FE,1, "ZAMAN=", #ZAMAN 
If DIKEY_1=0 Then 
GOTO RESET 
While DIKEY_1=0 
Wend 
Endif 
IF ZAMAN=TUS+1 THEN 
GOTO RESET 
LCDOUT $FE,1, "SAYMA TAMAMLANDI"
ELSE 
PAUSE 1000
ZAMAN=ZAMAN+1
GOTO SAYDIR 
ENDIF 
RETURN

EKRAN: 
Lcdout $FE,1, "GIRILEN SAYI= ",#tus 
pause 50 
RETURN 
'------------------------------------------------------------ 

BASLA:

YATAY_A=0
PAUSE 50
If DIKEY_1=0 THEN 
Tus=1
GOSUB EKRAN 
While DIKEY_1=0 
Wend 
Endif 

If DIKEY_2=0 Then 
Tus=2
PAUSE 50
GOSUB EKRAN 
While DIKEY_2=0 
Wend 
Endif 

If DIKEY_3=0 Then 
Tus=3
PAUSE 50
GOSUB EKRAN 
While DIKEY_3=0 
Wend 
Endif 

YATAY_A =1
YATAY_B =0 

If DIKEY_1=0 Then 
Tus=4
PAUSE 50
GOSUB EKRAN 
While DIKEY_1=0 
Wend 
Endif 

If DIKEY_2=0 Then 
Tus=5
PAUSE 50
GOSUB EKRAN 
While DIKEY_2=0 
Wend 
Endif 

If DIKEY_3=0 Then 
Tus=6
PAUSE 50
GOSUB EKRAN 
While DIKEY_3=0 
Wend 
Endif 

YATAY_B=1
YATAY_C=0 

If DIKEY_1=0 Then 
Tus=7
PAUSE 50
GOSUB EKRAN 
While DIKEY_1=0 
Wend 
Endif 

If DIKEY_2=0 Then 
Tus=8
PAUSE 50
GOSUB EKRAN 
While DIKEY_2=0 
Wend 
Endif

If DIKEY_3=0 Then 
Tus=9
PAUSE 50
GOSUB EKRAN 
While DIKEY_3=0 
Wend 
Endif 
YATAY_C=1
YATAY_D=0 

If DIKEY_1=0 Then 
PAUSE 50
GOTO RESET 
While DIKEY_1=0 
Wend 
Endif 

If DIKEY_2=0 Then 
Tus=0
PAUSE 50
GOSUB EKRAN 
While DIKEY_2=0 
Wend 
Endif 

If DIKEY_3=0 Then 
PAUSE 50
GOSUB SAYDIR 
While DIKEY_3=0 
Wend 
Endif 
YATAY_D =1
pause 50

ete

#276
Aşağıdaki kısmı yazdığım şekilde değiştir. Bu hali ile sayıdan itibaren sıfır da dahil olmak üzere sayar. Şayet sıfırda kalmasını istersen
"IF ZAMAN=255 THEN"   satırını   "IF ZAMAN=0 THEN " olarak değiştir.
Programda bazı kusurlar var.  Birincisi GOSUB ile gidilen yerden yeniden goto ile dönülüyorki bu stack taşmasına sebep olur. Program bir müddet sonra kitlenir yada abuk subuk çalışmaya sebep olur.
İkincisi tuş tarama sonunda her hangi bir yönlendirme komutu koyulmamış buda bir eksiklik bence.

SAYDIR: 
          ZAMAN=TUS
SAYBIR:          
          LCDOUT $FE,1, "ZAMAN=", #ZAMAN 
          If DIKEY_1=0 Then 
            GOTO RESET 
            While DIKEY_1=0 : Wend 
          Endif 
          IF ZAMAN=255 THEN 
            GOTO RESET 
            LCDOUT $FE,1, "SAYMA TAMAMLANDI"
          ELSE 
            PAUSE 1000
            ZAMAN=ZAMAN-1
          GOTO SAYBIR 
          ENDIF 
          RETURN


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

emrah

merhaba;

UART kesmesini tam olarak anlatırmısınız, bazı sayfalardan bakıyorum ama tam bahsedilmedigi için ne işe yaradıgını tam bilmiyorum.


uart kesmesinden benim anladıgım şu;

rx ve tx pin özelligi olan piclerde uart kesmesini kullandıgımızda örneğin; seri data alacaksak bu kesme altında bekleyerek picin normal döngüsünü mesgul etmemiş oluruz.  bu mudur ?

bu özelligi bilmedigim için yapmıs oldugum bir saat devrede RF kitinden gelecek olan seri bilgi ile saat ayarlayacaktım fakat seri bilgi beklerken bu sefer saat programı çalısmıyordu çünkü program seri bilgi alma komutunda takılıp kalıyor, nezaman bir bilgi gelse 1 kez döngü oluyor tekrar orada takılı kalıyordu. bende baska bir picte rf den seri datayı alıp 4 bitlik paralel çıkıs yapıp, saat devresindeki pic e  paralel olark yapmıştım.

bu şekilde yapılacak projelerde uart kesmesını nasıl kullanmalıyım yani, hem istenilen program sürekli çalısacak hemde seri bilgi geldigi zaman alınacak.

ete

USART kesmesi demek istedin sanırım. Universal Serial Port anlamına gelmekte olup geri planda takip edilen bir işlemdir.
Tahminin doğru, Dışarıdan ön tanımlı RX pinine geçerli bir sinyal geldiği zaman Pic hemen kesme oluşturup programın gelen bilginin alınmasını sağlar. Böylece sen RX pininden bilgi geliyormu diye sürekli bakmak zorunda kalmazsın. Aynı şekilde pic in kendi registerlerini kullanarak da TX pinine verdiğin bilgiyide dışarıya yollama işinide yapar. Ancak yollama için bir kesme gerekmediğinden genelde yalnızca RX için kesme kullanılır.

Bir USART kesmeini aktif edebilmek için Önce Global Kesmeler (INTCON.7) aktif edilir. Daha sonra peripheral Kesmelerde açılrı (INTCON.6)
Daha sonra USART receive Kesmesi (PIE1.5) aktif hale getirilir.
Bu işlemler Usart kesmesini açar. Tabiiki Basic de program yazılıyor ise bir de ON INTERRUPT GOTO KESME şeklinde bir satır daha ilave edilmesi gerekir.

Kesme kısmında ise ;
Gelen Bilgi Hesrin komutu ile alınır. varsa işaretçi önce beklenir ardından gelen bilgiler alınır. Örnek vermek gerekir ise;
HSerIn , [WAIT("TMR"),zaman,GUC]     şeklinde olabilir.
Bazen istenmeyen sinyaller kesmenin açılmasına veya bir başka vericiden gelen sinyaller de kesmenin aktif olmasına sebep olur.
Bu durumda Hserin komutunda program en azından 65535 ms beklemek zorunda kalır. Halbuki bizim istediğimiz bir kaç ms istenen bilgi gelmez ise yada gelen bizim istediğimiz değil ise oradan çıkılmasıdır. Bu nedenle komuta bir timeout (zamanaşımı) süresi ile gidilecek etiket adı ilave edilir.
HSerIn ,5,ATLA, [WAIT("TMR"),zaman,GUC] 
Burada 5 rakamı en fazla 5 ms gelen bilgi beklenecek anlamınadır. Gelmez ise ATla isimli etikete gidilecektir.
Bir diğer önemli konu ise Kesme bayrağının sıfırlanması olayıdır. Kesme bayrağı yalnızca okunabilir bir bayraktır ve ancak RCREG registerinin bir başka değişkene eşitlenmesi halinde bayrak sıfırlanır.
Bu nedenle kesme kısmında gelen bilgi alındıktan sonra ;
TEMP=RCREG  şeklinde bir satır ilave edilir.
Bu satırdan sonra  kesmeden çıkılabilir. Gerekirse yukarıda anlattığım Atla isimli etiket bu satırdanöncesine yazılabilir. Yani,
ATLA:
TEMP=RCREG
Resume
Enable
şeklinde kesme sona erdirilir.
Hepsi bu kadar umarım anlaşılmıştır.

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

Andromeda

ete  güzel anlatmış...
bende bir ara uğraşmıştım.
benim 1 ms bile  beklemeye tahammülüm olmadığı için alıcı modülüne
bilgi geldiğini anlamak için asm ile bir register kontrolu yapmıştım..
ama nasıl yapmıştım hatırlamıyorum :)
bu kontrol birkaç mikrosaniyede bitiyordu...
" Tanrı, iradesini hakim kılmak için yeryüzündeki iyi insanları kullanır, yeryüzündeki kötü insanlar ise kendi iradelerini hakim kılmak için Tanrı'yı kullanırlar." ..." Tanrı'dan mesaj gelmiyor, biz Tanrı'ya mesaj gönderiyoruz"

emrah

ete hocam çok teşekkür ederim usart kesmesi anlaşıldı kısa zamanda uygulamasını yaparak daha da net anlayacagım.

usart kesmesini kullandıgımız zaman tmr0,b0,b4-b7 kesmelerinide kullanabiliyormuyuz aynı program içinde ?

varsa usart ile ilgili RF li bir örnek program gönderebilirmisiniz ?

ete

Bütün kesmeler birlikte kullanılabilir. Her kesme oluştuğunda program tek bir yere yönelmeli Oda KESME isimli etiket.
Burada kimin kesmeyi oluşturduğuna bakıp ona göre işlem yapılmalıdır. Kimin kesme yarattığını anlamak için kesme bayraklarına bakmak gerekir.

Örnek programa pek gerek yok öyle değilmi. Yukarıda ne yapman gerektiğini açıkladım. Uygula ve örneğini kendin yarat istersen.
Yapamazsan devreye girelim ne dersin.

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

emrah

tamam çok teşekkür ederim destekleriniz için .malzemeleri toplayıp devreyi yapıyım aksi durumda tekrar dönerim, saygılar ....

emrah

selam,

ETE hocam,  sitenden buldugum bir programı deneme amaçlı düzenledim ve programı derlerken TEMP=RCREG kısmında hata verdı (  ERROR Line 86: Syntax error. (RFAL.pbp) )   şeklinde.

usart ayarlarını bilmedigim için siteden aldıgım bir programın ayarları ile aynı.




@ 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  1200 
DEFINE  HSER_SPBRG 207 
DEFINE  HSER_CLROERR 1   
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=%00000100
TRISC=%00000000
TRISD=%00000000
TRISE=%000

OPTION_REG.7=1
VERI VAR BYTE
PAUSE 500

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

 
ANADONGU:


IF VERI=100 THEN
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

ENDIF

VERI=0

GOTO ANADONGU

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



ATLA:
TEMP=RCREG
GIE=1
Resume
enable

ete

#284
Değişken tanımlamalarında ;
Temp Var Byte şeklinde Temp değişkenini tanımlaman gerekemzmi sence?
O hata değişkenin tanımlanmaması nedeni ile verilmiş.

Usart ayarlarını bilmiyorum demişsin ama yukarıdaki mesajlarımıda okumamışsın anlaşılan. Ayarları sana verdim zaten.
Alıntı YapBir USART kesmeini aktif edebilmek için Önce Global Kesmeler (INTCON.7) aktif edilir. Daha sonra peripheral Kesmelerde açılır (INTCON.6)
Daha sonra USART receive Kesmesi (PIE1.5) aktif hale getirilir.
Bu işlemler Usart kesmesini açar. Tabiiki Basic de program yazılıyor ise bir de ON INTERRUPT GOTO KESME şeklinde bir satır daha ilave edilmesi gerekir.

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