Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

CCS'de anlamadigim bir iki nokta

Başlatan Ugur2006, 31 Ağustos 2006, 23:19:30

Ugur2006

Burda CCS ile ilgilenenlerin olmasi ne güzel.
Bende CCS'e yeni basladim bir kac sorum olacak.Cevap veren arkadaslara simdiden tesekkürlerimi sunarim.
1-Arkadaslar ben bir Porta byte gönderme mantigini anlamiyorum.
Örnegin
# byte porta=5  
veya
# byte portb=6   --> gibi ifadeler ne anlama geliyor?

2-Port pinlerinin giris veya cikis olarak ayarlanmasi ne demek?
Neden Pinleri giri veya cikis olarak ayarlamaliyiz? Nerlerde lazim olur.
Örnegin
Set_Tris_B(0b00001111) --> Seklinde PortB'nin ilk 4 bitini giris , 4 son pinini cikis olarak ayarliyoruz.Bu bize ne sagliyor?
Ben bir Portun herhangi bir Pinini veya Pinlerini ne zaman giris ne zaman cikis yapmaliyim?
Simdilik aklima gelen soru bu ikisi.

Ziya

Alıntı yapılan: "Ugur2006"Burda CCS ile ilgilenenlerin olmasi ne güzel.
Bende CCS'e yeni basladim bir kac sorum olacak.Cevap veren arkadaslara simdiden tesekkürlerimi sunarim.
1-Arkadaslar ben bir Porta byte gönderme mantigini anlamiyorum.
Örnegin
# byte porta=5  
veya
# byte portb=6   --> gibi ifadeler ne anlama geliyor?

porta 8 bitlik bir değişken diyorsunuz. Bellekteki adresi de 0x005 yani PORTA bacakları. Aynısı PORTB için (adresi 0x006).

Alıntı Yap2-Port pinlerinin giris veya cikis olarak ayarlanmasi ne demek?
Neden Pinleri giri veya cikis olarak ayarlamaliyiz? Nerlerde lazim olur.
Örnegin
Set_Tris_B(0b00001111) --> Seklinde PortB'nin ilk 4 bitini giris , 4 son pinini cikis olarak ayarliyoruz.Bu bize ne sagliyor?
Ben bir Portun herhangi bir Pinini veya Pinlerini ne zaman giris ne zaman cikis yapmaliyim?
Simdilik aklima gelen soru bu ikisi.
porta yada port b nin bacaklarına direnç üzerinden led bağlamışsan ve ledleri yakmak istiyorsan ledleri bağladığın bacakların yönünü çıkış yapacaksın. Bu set_tris_b komutunda girdiğin sayılardaki sıfırlarla yapılır (baştaki 0b girilen sayının binary olduğunu belirtir). Port_b nin boşta kalan bacaklarına buton bağlarsan, butona basılı olup olmadığını anlaman için port b nin buton bağlanan bacaklarına karşılık gelen yönler giriş olacak (input yada kısaca 1). set_tris_b(0x0F) yada aynısı Set_Tris_B(0b00001111) portb nin b0, b1, b2, b3 bacakları giriş için (buton okuyacak), b4, b5, b6, b7 bacakları çıkış için (led yakacak) kullanılacak demektir.

portb = 0x3F yazarsan b4 ve b5 e bağlı ledlerin yanacak, b6 ve b7 ye bağlananlar sönük kalacak demektir. b0-b3 arası zaten giriş tanımlandığı için F sayısı bu bacaklarda bir değişiklik yapmaz.

Buton bilgisi okurken de
okunan = portb yazarsan sana ilk 4 biti senin için önemli olan bir sayı verir. Sayıyı değerlendirmek sana kalmıştır.

Bu konular CCS ile doğrudan ilgili değildir ve her programlama dilinde bunları yapmak zorundasın. Bazılarında standart isimlerle port_a, port_b gibi tanımlar var.
Bu günden sonra hiç kimse sarayda, divanda, meclislerde ve seyranda Türk dilinden başka dil kullanmaya. (13 Mayıs 1277) Karamanoğlu Mehmet Bey

Ugur2006

@ziya ,
cok tesekkür ederim cok güzel aciklamissin.
Simdi prort Pinlerinin Cikis olmasi demek PIC'in O PIN'nden disari dogru hareketin olacagi,Giris demek Disardan O PIN'den PIC'e hareket olacagi anlamina geliyor.
Yani PIC bir ledi yakacaksa O bit Cikis ayarlanmali, Eger bir Buttona basildiginda O pine veri gelecekse o Pin giris ayarlanmali yani.
Peki RS232 üzerinden biz bir Pine veri göndereceksek o Pin'demi giris ayarlanmali?

Ilk sorumda
# Byte PortA=5
# Byte PortB=6  --> Ifadeleri bu Portlarin bellekteki adresleri diyorsun burayi anladim

Kod icinde bazen  söyle ifedler görüyorum bunlar ne ifade ediyorlar peki?
porta=portb=0;
gibi peki bu ne oluyor.
örnegin:
#byte porta = 5 
#byte portb = 6 
#bit  led = portb.1 -----------> Burdaki ifade ??

char arx; 

void main() { 
     SET_TRIS_A(0x01);  ------>Bu ifader icin Kod icinde #use fast_io(a) 
     SET_TRIS_B(0x00);  ------>Ve #use fast_io(b) olmasi gerekmiyormu?
     porta=portb=0;  ----------> Burdaki ifade ??


Bu konularda beni bilgilendirdigin icin tesekkürlerimi sunarim.

zafzaf82

porta=portb=0;

ifade asm'de de oldugu gibi başlangıçta portların temizlenmesini sağlıyor.
#use fast_io(x)

ifadesi hızlı giriş çıkış için yani tris registerleri başlangıçta ne olarak ayarlandıysa pinlerin ona göre kullanılmasını sağlar.
Yani CCS nin asm kodlarını incelersen
#use fast_io(x)
kullanılmadan yapılan bi derlemede; Örnegin;
output_high(PIN_B0)
kodunu kullanmış olalım. Bu durumda önce bank0 dan bank1 e geçilir. Pic'in trisb nin 0. biti 0 yapılır ( yani B0 ucu çıkış olarak atanır). Daha sonra ise tekrar bank0'a geçilir ve PIN_B0 ucu high yapılır. Bu durum her pin için tekrarlanır. #use fast_io ifadesi bu tekrarlanan rutinleri önler ve başlangıçta ayarlanan tris değerlerine bağlı kalmayı sağlar.

#use fast_io komutunun kullanılmasının sakıncalı oldugu yerlerde vardır. Örnegin RS232, LCD veya RTC gibi seri haberleşme vs. kullanıyorsak bir pin hem giriş hemde çıkış çalışır. Bu durumda  #use fast_io yerine  
#standart _io(x)
ifadesi kullanılması da uygundur.

Kolay gelsin....
Mikroişlemci bi araçtır, amaç değil.....

zafzaf82

basit bi programla fast_io farkını göstereyim.
#include <16F628A.h>

#FUSES NOWDT                 	//No Watch Dog Timer
#FUSES INTRC                 	//Internal RC Osc
#FUSES NOPUT                 	//No Power Up Timer
#FUSES NOPROTECT             	//Code not protected from reading
#FUSES NOBROWNOUT            	//No brownout reset
#FUSES NOMCLR                	//Master Clear pin used for I/O
#FUSES NOLVP                 	//No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD               	//No EE protection

#use delay(clock=4000000,RESTART_WDT)

void main()
{

set_tris_b(0x00); //PORTB çıkış olarak ayarlandı

   while(true)
   {
   output_high(PIN_B0); //RB0=1 yap
   delay_ms(200);
   output_low(PIN_B0);  //RB0=0 yap
   delay_ms(200);
   }
}

Programın ürettiği asm listi ise şu şekilde;
CCS PCM C Compiler, Version 3.249, 28193               01-Eyl-06 07:58

               Filename: C:\Documents and Settings\ZAFER\Desktop\test\test.lst

               ROM used: 53 words (3%)
                         Largest free fragment is 1995
               RAM used: 5 (3%) at main() level
                         6 (3%) worst case
               Stack:    1 locations

*
0000:  MOVLW  00
0001:  MOVWF  0A
0002:  GOTO   01B
0003:  NOP
.................... #include <16F628A.h>
.................... //////// Standard Header file for the PIC16F628A device ////////////////
.................... #device PIC16F628A
.................... #list
....................
....................
.................... #FUSES NOWDT                 	//No Watch Dog Timer
.................... #FUSES INTRC                 	//Internal RC Osc
.................... #FUSES NOPUT                 	//No Power Up Timer
.................... #FUSES NOPROTECT             	//Code not protected from reading
.................... #FUSES NOBROWNOUT            	//No brownout reset
.................... #FUSES NOMCLR                	//Master Clear pin used for I/O
.................... #FUSES NOLVP                 	//No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
.................... #FUSES NOCPD               	//No EE protection
....................
.................... #use delay(clock=4000000,RESTART_WDT)
0004:  MOVLW  21
0005:  MOVWF  04
0006:  MOVF   00,W
0007:  BTFSC  03.2
0008:  GOTO   01A
0009:  MOVLW  01
000A:  MOVWF  78
000B:  MOVLW  BF
000C:  MOVWF  77
000D:  CLRWDT
000E:  DECFSZ 77,F
000F:  GOTO   00D
0010:  DECFSZ 78,F
0011:  GOTO   00B
0012:  MOVLW  4A
0013:  MOVWF  77
0014:  DECFSZ 77,F
0015:  GOTO   014
0016:  NOP
0017:  CLRWDT
0018:  DECFSZ 00,F
0019:  GOTO   009
001A:  RETLW  00
....................
.................... void main()
.................... {
001B:  CLRF   04
001C:  MOVLW  1F
001D:  ANDWF  03,F
001E:  BSF    03.5
001F:  BSF    0E.3
0020:  MOVLW  07
0021:  BCF    03.5
0022:  MOVWF  1F
....................
.................... set_tris_b(0x00); //PORTB çıkış olarak ayarlandı
0023:  MOVLW  00
0024:  TRIS   6
....................
....................    while(true)
....................    {
....................    output_high(PIN_B0); //RB0=1 yap
0025:  BSF    03.5
0026:  BCF    06.0
0027:  BCF    03.5
0028:  BSF    06.0
....................    delay_ms(200);
0029:  MOVLW  C8
002A:  MOVWF  21
002B:  CALL   004
....................    output_low(PIN_B0);  //RB0=0 yap
002C:  BSF    03.5
002D:  BCF    06.0
002E:  BCF    03.5
002F:  BCF    06.0
....................    delay_ms(200);
0030:  MOVLW  C8
0031:  MOVWF  21
0032:  CALL   004
....................    }
0033:  GOTO   025
....................
.................... }
0034:  SLEEP


Aynı programı şu şekilde değiştirirsek (yani fast_io kullanırsak);

#include <16F628A.h>

#use fast_io(b) //---> bu kod eklendi 

#FUSES NOWDT                 	//No Watch Dog Timer
#FUSES INTRC                 	//Internal RC Osc
#FUSES NOPUT                 	//No Power Up Timer
#FUSES NOPROTECT             	//Code not protected from reading
#FUSES NOBROWNOUT            	//No brownout reset
#FUSES NOMCLR                	//Master Clear pin used for I/O
#FUSES NOLVP                 	//No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD               	//No EE protection

#use delay(clock=4000000,RESTART_WDT)

void main()
{

set_tris_b(0x00); //PORTB çıkış olarak ayarlandı

   while(true)
   {
   output_high(PIN_B0); //RB0=1 yap
   delay_ms(200);
   output_low(PIN_B0);  //RB0=0 yap
   delay_ms(200);
   }
}


Bu programın ASM listi ise şu şekilde oluyor.
CCS PCM C Compiler, Version 3.249, 28193               01-Eyl-06 08:02

               Filename: C:\Documents and Settings\ZAFER\Desktop\test\test.lst

               ROM used: 47 words (2%)
                         Largest free fragment is 2001
               RAM used: 5 (3%) at main() level
                         6 (3%) worst case
               Stack:    1 locations

*
0000:  MOVLW  00
0001:  MOVWF  0A
0002:  GOTO   01B
0003:  NOP
.................... #include <16F628A.h>
.................... //////// Standard Header file for the PIC16F628A device ////////////////
.................... #device PIC16F628A
.................... #list
....................
....................
.................... #use fast_io(b)
....................
.................... #FUSES NOWDT                 	//No Watch Dog Timer
.................... #FUSES INTRC                 	//Internal RC Osc
.................... #FUSES NOPUT                 	//No Power Up Timer
.................... #FUSES NOPROTECT             	//Code not protected from reading
.................... #FUSES NOBROWNOUT            	//No brownout reset
.................... #FUSES NOMCLR                	//Master Clear pin used for I/O
.................... #FUSES NOLVP                 	//No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
.................... #FUSES NOCPD               	//No EE protection
....................
.................... #use delay(clock=4000000,RESTART_WDT)
0004:  MOVLW  21
0005:  MOVWF  04
0006:  MOVF   00,W
0007:  BTFSC  03.2
0008:  GOTO   01A
0009:  MOVLW  01
000A:  MOVWF  78
000B:  MOVLW  BF
000C:  MOVWF  77
000D:  CLRWDT
000E:  DECFSZ 77,F
000F:  GOTO   00D
0010:  DECFSZ 78,F
0011:  GOTO   00B
0012:  MOVLW  4A
0013:  MOVWF  77
0014:  DECFSZ 77,F
0015:  GOTO   014
0016:  NOP
0017:  CLRWDT
0018:  DECFSZ 00,F
0019:  GOTO   009
001A:  RETLW  00
....................
.................... void main()
.................... {
001B:  CLRF   04
001C:  MOVLW  1F
001D:  ANDWF  03,F
001E:  BSF    03.5
001F:  BSF    0E.3
0020:  MOVLW  07
0021:  BCF    03.5
0022:  MOVWF  1F
....................
.................... set_tris_b(0x00); //PORTB çıkış olarak ayarlandı
0023:  MOVLW  00
0024:  TRIS   6
....................
....................    while(true)
....................    {
....................    output_high(PIN_B0); //RB0=1 yap
0025:  BSF    06.0
....................    delay_ms(200);
0026:  MOVLW  C8
0027:  MOVWF  21
0028:  CALL   004
....................    output_low(PIN_B0);  //RB0=0 yap
0029:  BCF    06.0
....................    delay_ms(200);
002A:  MOVLW  C8
002B:  MOVWF  21
002C:  CALL   004
....................    }
002D:  GOTO   025
....................
.................... }
002E:  SLEEP


Farkı görebiliyormusun. İlk programda  ROM used: 53 words (3%) iken 2. programda ROM used: 47 words (2%) olmakta.

ilk programda RB0=1 yapmak için
....................    output_high(PIN_B0); //RB0=1 yap
0025:  BSF    03.5
0026:  BCF    06.0
0027:  BCF    03.5
0028:  BSF    06.0


4 satır kullanılırken, 2. programda ise bu işlem
....................    output_low(PIN_B0);  //RB0=0 yap
0029:  BCF    06.0

tek satırda halledilmektedir.

Umarım
#use fast_io(x)
kodunun ne işe yaradığını anlamışsındır.

Kolay gelsin.....
Mikroişlemci bi araçtır, amaç değil.....

Ugur2006

Tek kelimeyle harika cok tesekkürler.

hemen sunuda sorayim burda;
#use fast_io(x)
satiri tanimlanadan kod icinde PortB pinlerini cikis veya giris yapmak icin
SET_TRIS_X(0b00000001) ifadesini kullanirsak bu bir anlam ifade etmez değilmi?
Illaki Kodlarimizin basinda Hangi Port pinleri icin giris/cikis belirleeyeceksek o Port icin
#use fast_io(x)  belirlememiz gerekli değilmi?

zafzaf82

aslında ccs de ilginç bi durum var. trisb'ye ayarlamadıgım halde RB0'ı çıkış olarak kullanabiliyoz. Program herhangi bir hata vermiyor. TrisB ayarlanmadıgı için RB0'a gönderdiğimiz veriyi PIC'in çıkışından alamıyoruz.
Yani bu durumdan şu anlaşılıyor. #use fast_io(x) komutu kullanıyorsak; mutlaka trislerde ayarlarmalı. Program hata vermiyo ancak devrede isteğimiz çıkışı vermiyor.
Mikroişlemci bi araçtır, amaç değil.....

Ugur2006

Dogru bunu bende fark ettim.
Örnegin
#use fast_io(B)  // Burda PortB Bitlerini o/i olarak ayarlamak istedigimizi belirtiyoruz
                   
void main()
{
Set_tris_b(0b11111110);  //--- >  Burda bu ifadeyi belirtmez isek
output_high(PIN_B0);     //--- >  PortB'nin  0.Bitine bagli bir led yanmiyor. 
}

SpeedyX

Alıntı yapılan: "zafzaf82"aslında ccs de ilginç bi durum var. trisb'ye ayarlamadıgım halde RB0'ı çıkış olarak kullanabiliyoz. Program herhangi bir hata vermiyor.
Assembly de hata mı veriyor?

Ziya

Alıntı yapılan: "zafzaf82"aslında ccs de ilginç bi durum var. trisb'ye ayarlamadıgım halde RB0'ı çıkış olarak kullanabiliyoz. Program herhangi bir hata vermiyor. TrisB ayarlanmadıgı için RB0'a gönderdiğimiz veriyi PIC'in çıkışından alamıyoruz.
Yani bu durumdan şu anlaşılıyor. #use fast_io(x) komutu kullanıyorsak; mutlaka trislerde ayarlarmalı. Program hata vermiyo ancak devrede isteğimiz çıkışı vermiyor.
Normalde mcu'ya elektrik verildiğinde portA giriş, portb çıkış olur. Ancak CCS baştan bunların hepsinin yönünü girişe dönüştürüyor olabilir. Assemblerda da tanımlama yapmayın ve port b ye bilgi gönderin, çıkışı görürsünüz.

Düzeltme: Özür, yanlış bildiğim bir şeyi anlatmışım. Bütün portlar başlangıçta giriş olarak düzenleniyor ...
Bu günden sonra hiç kimse sarayda, divanda, meclislerde ve seyranda Türk dilinden başka dil kullanmaya. (13 Mayıs 1277) Karamanoğlu Mehmet Bey

CaFFeiNe

Alıntı yapılan: "Ugur2006"Dogru bunu bende fark ettim.
Örnegin
#use fast_io(B)  // Burda PortB Bitlerini o/i olarak ayarlamak istedigimizi belirtiyoruz
                   
void main()
{
Set_tris_b(0b11111110);  //--- >  Burda bu ifadeyi belirtmez isek
output_high(PIN_B0);     //--- >  PortB'nin  0.Bitine bagli bir led yanmiyor. 
}

işlemciye ilk enerji verildiğinde portlar giriş olacak şekilde ayarlanmıştır örneğin 16F877 için aşağıdaki gibi


#use fast_io(B) direktifi ile TRISB yazmacının CCS tarafından değilde kendi tarafımızdan ayarlanacağı belirtilir

bu sebepten eğer set_tris_b(0b11111110) ile portb'nin 0. bitini çıkış olarak ayarlamazsanız haliyle giriş olarak kalacağından bağladığınız led yanmaz