CCS ile Ilk bir Led-Flash örnegi icin neleri uygulamam gere

Başlatan Digimensch, 27 Aralık 2005, 23:48:38

Digimensch

Bu CCS'i yeni ögrenen biri olarak kisaca bi Program yazarken nelere dikkat etmeliyiz?
Yada söyle sorayim.
Ben Bir Led lambaya flash yaptirmak istiyorum.CCS ile bu Kodu yazarken Programin akisina göre nasil bir yöntem uygulmaliyim?
ilk olarak Calismak itedigim PIC'i tanimlamam gerek,
#include <16F84.h>
Simdi yapmam gerekenler neler ??
Bundan sonra tanimlamam gereken Degiskenleri,bitleri veya portlar yani kisaca dikkat etmem gereken olaylari bana Kodu yazarak ve aciklama yaparak anlatabilirmisiniz?Cünkü CCS Kod akisinda bayagi bir tanimlama yapiliyor.
Lütfen kisa sekilde değilde tam anlayabilecegim sekilde anlatirsaniz sevinirim.

Erol YILMAZ

CCS examples klasorunde   en basitinden en karmaşığı na kadar onlarca örnek var. Onları incelesen daha faydalı olur. Dikkat et yalnız orada üç grup 8 bit PIC ailesi için de tanımlama yapılmış.

sen 14 bit kelime uzunluklu olanı bırak diğerlerinin tanımlamalarını sil.
Kolay Gelsin....

Digimensch

Bu CCS examples Klosörüne eve gidince bakacagim.
Insallah basitinden zoruna kadar iceren kodlar vardir.
Birde güzel Almanca anlatim klavuzu buldum , isteyen oluirsa gönderebilirim.
ama dedigim gibi almanca...

Digimensch

@Erol
bu bahsettigin examples klosörüne göz attim orda bu ise yeni baslayanlar icin basit kodlar yokki.
Hepsi yeni baslayan bir kisi icin karmasik kodlar.
Bu isi basit baslangic seviyesindeki bir kisiye yönelik sekilde anlatan döküman veya kod bankasi yokmu ki??

Erol YILMAZ

Google da  aratirsan CCS ile yapilmis cok proje var.
oradan bir arastir....

ama CCS ile nereden baslayacaksin ki ?
Led yakip sondurme sana baslangic olur mu ?

Digimensch

Hic yoktan su ana Funktionlar yeni biri icin önemli:
Örnegin:
Bir Port'un tüm Bitlerini Low ve High yapan Kod.
Istenilen bir Portun sadece istenilen bir Bitini Low ve High yapan Kod.
Bekleme Süresi
Portun herhangi bir Pinin o anki halini gösteren Kod.
ne bileyim bunun gibi baslangic Kodlari.
Bu Kodlar ve anlamlari  yeni baslayanlar icin cok önemlidir.
Ben Pic Basic ögrenirken önce bu tür Kodlari ögrenerek baslamistim.Sizler nasil ögrendiniz bilemem.. :D

SpeedyX

Merhaba
Ben manual ini okumuştum ccs nin, ondan önce aslında yeterince öğrenmiştim ama examples ile zor oluyor, önce manual i oku derim. C++ da biliyorsan öğrenmemen için bir sebep yok.

CaFFeiNe

output_a(255) - A portunun tüm pinlerini high yapar
output_high(PIN_A0) - A portunun 0. pinini high yapar
output_low(PIN_A0) - A portunun 0. pinini low yapar
delay_ms(200) - 200ms bekleme
durum = input(PIN_A0) - A portunun 0. bitini kontrol eder 1 ise durum = true (1) mesela

bunlara help tende ulaşabilirsin

Digimensch

@CaFFeiNe
Saol dostum iste bu tür aciklamalar cok ise yariyor yeni baslayan biri icin.

kemalak

//Bu basit uygulama PortA,0 a bağlı Ledi  1 Herz frekansında yakıp söndürür
// Led PortA,0 dan şaseye   330 ohm direnç üzerinden  bağlıdır
#include <16f84.h>    

#use delay(clock=4000000)   //4 MHZ OSC


#byte port_a=5   //portA yı tanımlıyoruz


main() {
  set_tris_a(0xFE); //PortA,0 çıkış  diğer pinler giriş  

 while(1)
 {
 
bit_set(port_a,0); //ledi yak
delay_ms(500);     // yarım saniye yanık kalsın
bit_clear(port_a,0);  // led sönük
delay_ms(500);      // yarım saniye sönük
}
}

SpeedyX

Ufak bir analiz yapalım mı?

Önce yukarıdaki hemşehrimin yazdığı kodu CCS ile derleyip nekadar yer tuttuğuna bakalım.
CCS PCM C Compiler, Version 4.038, 59982

               ROM used: 47 words (5%)
                         Largest free fragment is 977
               RAM used: 6 (9%) at main() level
                         7 (10%) worst case
               Stack:    1 locations

*
0000:  MOVLW  00
0001:  MOVWF  0A
0002:  GOTO   018
0003:  NOP
.................... #include <16f84.h> 
.................... //////// Standard Header file for the PIC16F84 device //////////////// 
.................... #device PIC16F84 
.................... #list 
....................  
....................  
.................... #use delay(clock=4000000) //4 MHZ OSC 
0004:  MOVLW  13
0005:  MOVWF  04
0006:  MOVF   00,W
0007:  BTFSC  03.2
0008:  GOTO   017
0009:  MOVLW  01
000A:  MOVWF  0D
000B:  CLRF   0C
000C:  DECFSZ 0C,F
000D:  GOTO   00C
000E:  DECFSZ 0D,F
000F:  GOTO   00B
0010:  MOVLW  4A
0011:  MOVWF  0C
0012:  DECFSZ 0C,F
0013:  GOTO   012
0014:  GOTO   015
0015:  DECFSZ 00,F
0016:  GOTO   009
0017:  RETLW  00
....................  
....................  
.................... #byte port_a=5 //portA y? tan?ml?yoruz 
....................  
....................  
.................... main() { 
0018:  CLRF   04
0019:  MOVLW  1F
001A:  ANDWF  03,F
.................... set_tris_a(0xFE); //PortA,0 c,?k?s, dig(er pinler giris, 
001B:  MOVLW  FE
001C:  TRIS   5
....................  
.................... while(1) 
.................... { 
....................  
.................... bit_set(port_a,0); //ledi yak 
001D:  BSF    05.0
.................... delay_ms(500); // yar?m saniye yan?k kals?n 
001E:  MOVLW  02
001F:  MOVWF  12
0020:  MOVLW  FA
0021:  MOVWF  13
0022:  CALL   004
0023:  DECFSZ 12,F
0024:  GOTO   020
.................... bit_clear(port_a,0); // led so"nu"k 
0025:  BCF    05.0
.................... delay_ms(500); // yar?m saniye so"nu"k 
0026:  MOVLW  02
0027:  MOVWF  12
0028:  MOVLW  FA
0029:  MOVWF  13
002A:  CALL   004
002B:  DECFSZ 12,F
002C:  GOTO   028
.................... } 
002D:  GOTO   01D
.................... } 
002E:  SLEEP

Configuration Fuses:
   Word  1: 3FF3   RC NOWDT PUT NOPROTECT

Tüm dosya 85 satır ve 2 tane uyarı veriyor;



* Yukarıdaki örneği biraz optimize edip, CCSnin özel fonksiyonlarından biraz olsun kurtulalım;
//Bu basit uygulama PortA,0 a bağlı Ledi  1 Hertz frekansında yakıp söndürür
// Led PortA,0 dan şaseye 330 ohm direnç üzerinden bağlıdır.
#include <16f84.h>
#fuses NOWDT,XT // wdt kapalı, xt osilator
#use delay(clock=4000000) //4 MHZ OSC

#byte TRISA=0x85 // TRISAyı tanımlıyoruz
#bit led=0x05.0 // led i tanımlıyoruz

void main() {
   TRISA=0xFE; //PortA,0 çıkış diğer pinler giriş
   for(;;) { 
     led=1; //ledi yak
     delay_ms(500);     // yarım saniye yanık kalsın
     led=0;  // led sönük
     delay_ms(500);      // yarım saniye sönük
   }
 }


Asm çıktısı:
CCS PCM C Compiler, Version 4.038, 59982

               ROM used: 49 words (5%)
                         Largest free fragment is 975
               RAM used: 6 (9%) at main() level
                         7 (10%) worst case
               Stack:    1 locations

*
0000:  MOVLW  00
0001:  MOVWF  0A
0002:  GOTO   018
0003:  NOP
.................... //Bu basit uygulama PortA,0 a bag(l? Ledi  1 Hertz frekans?nda yak?p so"ndu"ru"r 
.................... // Led PortA,0 dan s,aseye 330 ohm direnc, u"zerinden bag(l?d?r. 
.................... #include <16f84.h> 
.................... //////// Standard Header file for the PIC16F84 device //////////////// 
.................... #device PIC16F84 
.................... #list 
....................  
.................... #fuses NOWDT,XT // wdt kapal?, xt osilator 
.................... #use delay(clock=4000000) //4 MHZ OSC 
0004:  MOVLW  13
0005:  MOVWF  04
0006:  MOVF   00,W
0007:  BTFSC  03.2
0008:  GOTO   017
0009:  MOVLW  01
000A:  MOVWF  0D
000B:  CLRF   0C
000C:  DECFSZ 0C,F
000D:  GOTO   00C
000E:  DECFSZ 0D,F
000F:  GOTO   00B
0010:  MOVLW  4A
0011:  MOVWF  0C
0012:  DECFSZ 0C,F
0013:  GOTO   012
0014:  GOTO   015
0015:  DECFSZ 00,F
0016:  GOTO   009
0017:  RETLW  00
....................  
.................... #byte TRISA=0x85 // TRISAy? tan?ml?yoruz 
.................... #bit led=0x05.0 // led i tan?ml?yoruz 
....................  
.................... void main() { 
0018:  CLRF   04
0019:  MOVLW  1F
001A:  ANDWF  03,F
....................    TRISA=0xFE; //PortA,0 c,?k?s, dig(er pinler giris, 
001B:  MOVLW  FE
001C:  BSF    03.5
001D:  MOVWF  05
....................    for(;;) {  
....................      led=1; //ledi yak 
001E:  BCF    03.5
001F:  BSF    05.0
....................      delay_ms(500);     // yar?m saniye yan?k kals?n 
0020:  MOVLW  02
0021:  MOVWF  12
0022:  MOVLW  FA
0023:  MOVWF  13
0024:  CALL   004
0025:  DECFSZ 12,F
0026:  GOTO   022
....................      led=0;  // led so"nu"k 
0027:  BCF    05.0
....................      delay_ms(500);      // yar?m saniye so"nu"k 
0028:  MOVLW  02
0029:  MOVWF  12
002A:  MOVLW  FA
002B:  MOVWF  13
002C:  CALL   004
002D:  DECFSZ 12,F
002E:  GOTO   02A
....................    } 
002F:  GOTO   01F
....................  } 
0030:  SLEEP

Configuration Fuses:
   Word  1: 3FF1   XT NOWDT PUT NOPROTECT

Bu da 85 satır ama program olarak biraz küçüldü ve hiç uyarı yok;


* Şimdi toggle yöntemiyle bir kod yazalım ve derleyelim... Kod şöyle olsun.
//Bu basit uygulama PortA,0 a bağlı Ledi  1 Hertz frekansında yakıp söndürür
// Led PortA,0 dan şaseye 330 ohm direnç üzerinden bağlıdır.
#include <16f84.h>
#fuses NOWDT,XT // wdt kapalı, xt osilator
#use delay(clock=4000000) //4 MHZ OSC

#byte TRISA=0x85 // TRISAyı tanımlıyoruz
#bit led=0x05.0 // led i tanımlıyoruz

void main() {
   TRISA=0xFE; //PortA,0 çıkış diğer pinler giriş
   for(;;) { 
     led=~led; //led toggle
     delay_ms(500); // yarım saniye bekle
   }
 }


Asm çıktısı :
CCS PCM C Compiler, Version 4.038, 59982               19-Aaeaiage-07 18:59

               ROM used: 43 words (4%)
                         Largest free fragment is 981
               RAM used: 6 (9%) at main() level
                         7 (10%) worst case
               Stack:    1 locations

*
0000:  MOVLW  00
0001:  MOVWF  0A
0002:  GOTO   018
0003:  NOP
.................... //Bu basit uygulama PortA,0 a bag(l? Ledi  1 Hertz frekans?nda yak?p so"ndu"ru"r 
.................... // Led PortA,0 dan s,aseye 330 ohm direnc, u"zerinden bag(l?d?r. 
.................... #include <16f84.h> 
.................... //////// Standard Header file for the PIC16F84 device //////////////// 
.................... #device PIC16F84 
.................... #list 
....................  
.................... #fuses NOWDT,XT // wdt kapal?, xt osilator 
.................... #use delay(clock=4000000) //4 MHZ OSC 
0004:  MOVLW  13
0005:  MOVWF  04
0006:  MOVF   00,W
0007:  BTFSC  03.2
0008:  GOTO   017
0009:  MOVLW  01
000A:  MOVWF  0D
000B:  CLRF   0C
000C:  DECFSZ 0C,F
000D:  GOTO   00C
000E:  DECFSZ 0D,F
000F:  GOTO   00B
0010:  MOVLW  4A
0011:  MOVWF  0C
0012:  DECFSZ 0C,F
0013:  GOTO   012
0014:  GOTO   015
0015:  DECFSZ 00,F
0016:  GOTO   009
0017:  GOTO   026 (RETURN)
....................  
.................... #byte TRISA=0x85 // TRISAy? tan?ml?yoruz 
.................... #bit led=0x05.0 // led i tan?ml?yoruz 
....................  
.................... void main() { 
0018:  CLRF   04
0019:  MOVLW  1F
001A:  ANDWF  03,F
....................    TRISA=0xFE; //PortA,0 c,?k?s, dig(er pinler giris, 
001B:  MOVLW  FE
001C:  BSF    03.5
001D:  MOVWF  05
....................    for(;;) {  
....................      led=~led; //led toggle 
001E:  MOVLW  01
001F:  BCF    03.5
0020:  XORWF  05,F
....................      delay_ms(500); // yar?m saniye bekle 
0021:  MOVLW  02
0022:  MOVWF  12
0023:  MOVLW  FA
0024:  MOVWF  13
0025:  GOTO   004
0026:  DECFSZ 12,F
0027:  GOTO   023
....................    } 
0028:  BSF    03.5
0029:  GOTO   01E
....................  } 
002A:  SLEEP

Configuration Fuses:
   Word  1: 3FF1   XT NOWDT PUT NOPROTECT

Dosyamız 75 satıra düştü ve ROM ve RAM kullanımlarımızda birazcık azaldı..



* Şimdide #use delay.. direktifinden kurtulalım ve kendimize döngü yoluyola bir kafadan sallama delay rutini yazalım.. Bunu yazarken, kodun ufak olması için arttırma değil, azaltma yöntemini kullanalım... Kod şöyle olsun;
//Bu basit uygulama PortA,0 a bağlı Ledi  1 Hertz frekansında yakıp söndürür
// Led PortA,0 dan şaseye 330 ohm direnç üzerinden bağlıdır.
#include <16f84.h>
#fuses NOWDT,XT // wdt kapalı, xt osilator

#byte TRISA=0x85 // TRISAyı tanımlıyoruz
#bit led=0x05.0 // led i tanımlıyoruz

void main() {
   int16 sayac=65000; degiskenimize ilk degeri verelim..
   TRISA=0xFE; //PortA,0 çıkış diğer pinler giriş
   for(;;) { 
     led=~led; //led toggle
     for(;sayac!=0;sayac--); // biraz bekle    
   }
 }

Eğer for döngüsü yerine while(sayac!=0) --sayac; kullansaydık derleyici yine aynı assembly kodunu üretecekti...

Asm çıktısı:
CCS PCM C Compiler, Version 4.038, 59982

               ROM used: 31 words (3%)
                         Largest free fragment is 993
               RAM used: 7 (10%) at main() level
                         7 (10%) worst case
               Stack:    0 locations

*
0000:  MOVLW  00
0001:  MOVWF  0A
0002:  GOTO   004
0003:  NOP
.................... //Bu basit uygulama PortA,0 a bag(l? Ledi  1 Hertz frekans?nda yak?p so"ndu"ru"r 
.................... // Led PortA,0 dan s,aseye 330 ohm direnc, u"zerinden bag(l?d?r. 
.................... #include <16f84.h> 
.................... //////// Standard Header file for the PIC16F84 device //////////////// 
.................... #device PIC16F84 
.................... #list 
....................  
.................... #fuses NOWDT,XT // wdt kapal?, xt osilator 
....................  
.................... #byte TRISA=0x85 // TRISAy? tan?ml?yoruz 
.................... #bit led=0x05.0 // led i tan?ml?yoruz 
....................  
.................... void main() { 
0004:  CLRF   04
0005:  MOVLW  1F
0006:  ANDWF  03,F
....................   int16 sayac=65000; 
0007:  MOVLW  E8
0008:  MOVWF  12
0009:  MOVLW  FD
000A:  MOVWF  13
....................   TRISA=0xFE; //PortA,0 c,?k?s, dig(er pinler giris, 
000B:  MOVLW  FE
000C:  BSF    03.5
000D:  MOVWF  05
....................   for(;;) {  
....................     led=~led; //led toggle 
000E:  MOVLW  01
000F:  BCF    03.5
0010:  XORWF  05,F
....................     for(;sayac!=0;sayac--); // biraz bekle 
0011:  MOVF   12,F
0012:  BTFSS  03.2
0013:  GOTO   017
0014:  MOVF   13,F
0015:  BTFSC  03.2
0016:  GOTO   01C
0017:  MOVF   12,W
0018:  BTFSC  03.2
0019:  DECF   13,F
001A:  DECF   12,F
001B:  GOTO   011
....................   } 
001C:  BSF    03.5
001D:  GOTO   00E
.................... } 
001E:  SLEEP

Configuration Fuses:
   Word  1: 3FF1   XT NOWDT PUT NOPROTECT

Dosyamız 63 satıra düştü ve aşağıdaki farkıda gözlemliyoruz..



* Şimdi aynı programı timer0 kullanarak yazmayı deneyelim..
// Led PortA,0 dan s,aseye 330 ohm direnc, u"zerinden bag(l?d?r.
#include <16f84.h>
#fuses NOWDT,XT // wdt kapal?, xt osilator

#byte TRISA=0x85 // TRISAy? tan?ml?yoruz
#bit led=0x05.0 // led i tan?ml?yoruz

int sayac=0;

#int_RTCC
void RTCC_isr() {
  sayac++;
  if(sayac>15){ // 1sn için 30 ise yarım saniye -> 15
    led=~led; //led toggle
    sayac=0;
  }
}
void main() {
  TRISA=0xFE; //PortA,0 c,?k?s, dig(er pinler giris,
  setup_counters(RTCC_INTERNAL,RTCC_DIV_128); // RTCC = 33.3ms | 30*RTCC=1 Saniye
  enable_interrupts(INT_RTCC);
  enable_interrupts(global);
  for(;;);
}

Ama burda CCS nin kendi fonksiyonlarıyla, kod çok büyük oldu...

Asm çıktısı:
CCS PCM C Compiler, Version 4.038, 59982               19-Aaeaiage-07 20:54

               ROM used: 100 words (10%)
                         Largest free fragment is 924
               RAM used: 15 (22%) at main() level
                         15 (22%) worst case
               Stack:    1 worst case (0 in main + 1 for interrupts)

*
0000:  MOVLW  00
0001:  MOVWF  0A
0002:  GOTO   045
0003:  NOP
0004:  BTFSC  03.5
0005:  GOTO   00A
0006:  MOVWF  11
0007:  SWAPF  03,W
0008:  MOVWF  12
0009:  GOTO   00F
000A:  BCF    03.5
000B:  MOVWF  11
000C:  SWAPF  03,W
000D:  MOVWF  12
000E:  BSF    12.1
000F:  MOVF   0A,W
0010:  MOVWF  19
0011:  CLRF   0A
0012:  BCF    03.7
0013:  SWAPF  11,F
0014:  MOVF   04,W
0015:  MOVWF  13
0016:  MOVF   0C,W
0017:  MOVWF  14
0018:  MOVF   0D,W
0019:  MOVWF  15
001A:  MOVF   0E,W
001B:  MOVWF  16
001C:  MOVF   0F,W
001D:  MOVWF  17
001E:  MOVF   10,W
001F:  MOVWF  18
0020:  BCF    03.5
0021:  BTFSS  0B.5
0022:  GOTO   025
0023:  BTFSC  0B.2
0024:  GOTO   03A
0025:  MOVF   13,W
0026:  MOVWF  04
0027:  MOVF   14,W
0028:  MOVWF  0C
0029:  MOVF   15,W
002A:  MOVWF  0D
002B:  MOVF   16,W
002C:  MOVWF  0E
002D:  MOVF   17,W
002E:  MOVWF  0F
002F:  MOVF   18,W
0030:  MOVWF  10
0031:  MOVF   19,W
0032:  MOVWF  0A
0033:  SWAPF  12,W
0034:  MOVWF  03
0035:  BCF    03.5
0036:  SWAPF  11,W
0037:  BTFSC  12.1
0038:  BSF    03.5
0039:  RETFIE
.................... //Bu basit uygulama PortA,0 a bag(l? Ledi  1 Hertz frekans?nda yak?p so"ndu"ru"r 
.................... // Led PortA,0 dan s,aseye 330 ohm direnc, u"zerinden bag(l?d?r. 
.................... #include <16f84.h> 
.................... //////// Standard Header file for the PIC16F84 device //////////////// 
.................... #device PIC16F84 
.................... #list 
....................  
.................... #fuses NOWDT,XT // wdt kapal?, xt osilator 
....................  
.................... #byte TRISA=0x85 // TRISAy? tan?ml?yoruz 
.................... #bit led=0x05.0 // led i tan?ml?yoruz 
....................  
.................... int sayac=0; 
*
0048:  CLRF   1A
....................  
.................... #int_RTCC 
.................... void RTCC_isr() { 
....................   sayac++; 
*
003A:  INCF   1A,F
....................   if(sayac>15){ 
003B:  MOVF   1A,W
003C:  SUBLW  0F
003D:  BTFSC  03.0
003E:  GOTO   042
....................     led=~led; //led toggle 
003F:  MOVLW  01
0040:  XORWF  05,F
....................     sayac=0; 
0041:  CLRF   1A
....................   } 
.................... } 
0042:  BCF    0B.2
0043:  BCF    0A.3
0044:  GOTO   025
.................... void main() { 
0045:  CLRF   04
0046:  MOVLW  1F
0047:  ANDWF  03,F
....................   TRISA=0xFE; //PortA,0 c,?k?s, dig(er pinler giris, 
*
0049:  MOVLW  FE
004A:  BSF    03.5
004B:  MOVWF  05
....................   setup_counters(RTCC_INTERNAL,RTCC_DIV_128); // RTCC = 33.3ms | 30*RTCC=1 Saniye 
004C:  MOVLW  06
004D:  BCF    03.5
004E:  MOVWF  0C
004F:  BTFSS  0C.3
0050:  GOTO   059
0051:  MOVLW  07
0052:  CLRF   01
0053:  MOVLW  81
0054:  MOVWF  04
0055:  MOVF   00,W
0056:  ANDLW  C0
0057:  IORLW  0F
0058:  MOVWF  00
0059:  CLRWDT
005A:  MOVLW  81
005B:  MOVWF  04
005C:  MOVF   00,W
005D:  ANDLW  C0
005E:  IORWF  0C,W
005F:  MOVWF  00
....................   enable_interrupts(INT_RTCC); 
0060:  BSF    0B.5
....................   enable_interrupts(global); 
0061:  BSF    0B.7
....................   for(;;); 
0062:  GOTO   062
.................... } 
0063:  SLEEP

Configuration Fuses:
   Word  1: 3FF1   XT NOWDT PUT NOPROTECT

Dosyamız 144 satır oldu  8O ve RAM - ROM uçtu...


* Şimdide son olarak, bu işi bildiğimiz gibi (asm deki gibi) yapalım...
Tabi bunun için biraz tanımlama yapmamız gerekecek ve şu include direktifindende kurtulalım. Son olarakda kesme alt programı içindeki karşılaştırmanın mantığını değiştirelim...
//Bu basit uygulama PortA,0 a bag(l? Ledi  1 Hertz frekans?nda yak?p so"ndu"ru"r
// Led PortA,0 dan s,aseye 330 ohm direnc, u"zerinden bag(l?d?r.
#device PIC16F84
#nolist
#fuses NOWDT,XT // wdt kapal?, xt osilator

#byte TRISA=0x85 // TRISAy? tan?ml?yoruz
#byte OPTION=0x81
#bit GIE=0x0b.7
#bit T0IE=0x0b.5
#bit T0IF=0x0b.2
#bit T0CS=0x81.5
#bit led=0x05.0 // led i tan?ml?yoruz

int sayac=15;

#int_RTCC
void RTCC_isr() {
  if(sayac==0){
    led=~led; //led toggle
    sayac=15;
  }
  sayac--;
  T0IF = 0;
}
void main() {
  TRISA=0xFE; //PortA,0 c,?k?s, dig(er pinler giris,
  OPTION = 0b0111;   // tmr0 : 256
  T0CS = 0;         // select internal clock
  T0IE = 1;         // enable timer interrupt
  GIE = 1;         // enable global interrupts
  for(;;);
}


Asm çıktısı:
CCS PCM C Compiler, Version 4.038, 59982

               ROM used: 86 words (8%)
                         Largest free fragment is 938
               RAM used: 15 (22%) at main() level
                         15 (22%) worst case
               Stack:    1 worst case (0 in main + 1 for interrupts)

*
0000:  MOVLW  00
0001:  MOVWF  0A
0002:  GOTO   046
0003:  NOP
0004:  BTFSC  03.5
0005:  GOTO   00A
0006:  MOVWF  11
0007:  SWAPF  03,W
0008:  MOVWF  12
0009:  GOTO   00F
000A:  BCF    03.5
000B:  MOVWF  11
000C:  SWAPF  03,W
000D:  MOVWF  12
000E:  BSF    12.1
000F:  MOVF   0A,W
0010:  MOVWF  19
0011:  CLRF   0A
0012:  BCF    03.7
0013:  SWAPF  11,F
0014:  MOVF   04,W
0015:  MOVWF  13
0016:  MOVF   0C,W
0017:  MOVWF  14
0018:  MOVF   0D,W
0019:  MOVWF  15
001A:  MOVF   0E,W
001B:  MOVWF  16
001C:  MOVF   0F,W
001D:  MOVWF  17
001E:  MOVF   10,W
001F:  MOVWF  18
0020:  BCF    03.5
0021:  BTFSS  0B.5
0022:  GOTO   025
0023:  BTFSC  0B.2
0024:  GOTO   03A
0025:  MOVF   13,W
0026:  MOVWF  04
0027:  MOVF   14,W
0028:  MOVWF  0C
0029:  MOVF   15,W
002A:  MOVWF  0D
002B:  MOVF   16,W
002C:  MOVWF  0E
002D:  MOVF   17,W
002E:  MOVWF  0F
002F:  MOVF   18,W
0030:  MOVWF  10
0031:  MOVF   19,W
0032:  MOVWF  0A
0033:  SWAPF  12,W
0034:  MOVWF  03
0035:  BCF    03.5
0036:  SWAPF  11,W
0037:  BTFSC  12.1
0038:  BSF    03.5
0039:  RETFIE
.................... //Bu basit uygulama PortA,0 a bag(l? Ledi  1 Hertz frekans?nda yak?p so"ndu"ru"r 
.................... // Led PortA,0 dan s,aseye 330 ohm direnc, u"zerinden bag(l?d?r. 
.................... #device PIC16F84 
0055:  SLEEP

Configuration Fuses:
   Word  1: 3FF1   XT NOWDT PUT NOPROTECT

Kodun biraz öncekinden daha ufak olduğu kesin ama yinede kesme kullanmadan yaptığımız programdan daha uzun oldu... Dosyamız 74 satır oldu fakat sakın kanmayın!


Eğer include kısmını kaldırmasaydık asm çıktısı olarak şunu verecekti:
CCS PCM C Compiler, Version 4.038, 59982

               ROM used: 86 words (8%)
                         Largest free fragment is 938
               RAM used: 15 (22%) at main() level
                         15 (22%) worst case
               Stack:    1 worst case (0 in main + 1 for interrupts)

*
0000:  MOVLW  00
0001:  MOVWF  0A
0002:  GOTO   046
0003:  NOP
0004:  BTFSC  03.5
0005:  GOTO   00A
0006:  MOVWF  11
0007:  SWAPF  03,W
0008:  MOVWF  12
0009:  GOTO   00F
000A:  BCF    03.5
000B:  MOVWF  11
000C:  SWAPF  03,W
000D:  MOVWF  12
000E:  BSF    12.1
000F:  MOVF   0A,W
0010:  MOVWF  19
0011:  CLRF   0A
0012:  BCF    03.7
0013:  SWAPF  11,F
0014:  MOVF   04,W
0015:  MOVWF  13
0016:  MOVF   0C,W
0017:  MOVWF  14
0018:  MOVF   0D,W
0019:  MOVWF  15
001A:  MOVF   0E,W
001B:  MOVWF  16
001C:  MOVF   0F,W
001D:  MOVWF  17
001E:  MOVF   10,W
001F:  MOVWF  18
0020:  BCF    03.5
0021:  BTFSS  0B.5
0022:  GOTO   025
0023:  BTFSC  0B.2
0024:  GOTO   03A
0025:  MOVF   13,W
0026:  MOVWF  04
0027:  MOVF   14,W
0028:  MOVWF  0C
0029:  MOVF   15,W
002A:  MOVWF  0D
002B:  MOVF   16,W
002C:  MOVWF  0E
002D:  MOVF   17,W
002E:  MOVWF  0F
002F:  MOVF   18,W
0030:  MOVWF  10
0031:  MOVF   19,W
0032:  MOVWF  0A
0033:  SWAPF  12,W
0034:  MOVWF  03
0035:  BCF    03.5
0036:  SWAPF  11,W
0037:  BTFSC  12.1
0038:  BSF    03.5
0039:  RETFIE
.................... //Bu basit uygulama PortA,0 a bag(l? Ledi  1 Hertz frekans?nda yak?p so"ndu"ru"r 
.................... // Led PortA,0 dan s,aseye 330 ohm direnc, u"zerinden bag(l?d?r. 
.................... #include <16f84.h> 
.................... //////// Standard Header file for the PIC16F84 device //////////////// 
.................... #device PIC16F84 
.................... #list 
....................  
.................... #fuses NOWDT,XT // wdt kapal?, xt osilator 
....................  
.................... #byte TRISA=0x85 // TRISAy? tan?ml?yoruz 
.................... #byte OPTION=0x81 
.................... #bit GIE=0x0b.7 
.................... #bit T0IE=0x0b.5 
.................... #bit T0IF=0x0b.2 
.................... #bit T0CS=0x81.5 
.................... #bit led=0x05.0 // led i tan?ml?yoruz 
....................  
.................... int sayac=15; 
*
0049:  MOVLW  0F
004A:  MOVWF  1A
....................  
.................... #int_RTCC 
.................... void RTCC_isr() { 
....................   if(sayac==0){ 
*
003A:  MOVF   1A,F
003B:  BTFSS  03.2
003C:  GOTO   041
....................     led=~led; //led toggle 
003D:  MOVLW  01
003E:  XORWF  05,F
....................     sayac=15; 
003F:  MOVLW  0F
0040:  MOVWF  1A
....................   } 
....................   sayac--; 
0041:  DECF   1A,F
....................   T0IF = 0; 
0042:  BCF    0B.2
.................... } 
0043:  BCF    0B.2
0044:  BCF    0A.3
0045:  GOTO   025
.................... void main() { 
0046:  CLRF   04
0047:  MOVLW  1F
0048:  ANDWF  03,F
....................   TRISA=0xFE; //PortA,0 c,?k?s, dig(er pinler giris, 
*
004B:  MOVLW  FE
004C:  BSF    03.5
004D:  MOVWF  05
....................   OPTION = 0b0111;   // tmr0 : 256 
004E:  MOVLW  07
004F:  MOVWF  01
....................   T0CS = 0;         // select internal clock 
0050:  BCF    01.5
....................   T0IE = 1;         // enable timer interrupt 
0051:  BCF    03.5
0052:  BSF    0B.5
....................   GIE = 1;         // enable global interrupts 
0053:  BSF    0B.7
....................   for(;;); 
0054:  GOTO   054
.................... } 
0055:  SLEEP

Configuration Fuses:
   Word  1: 3FF1   XT NOWDT PUT NOPROTECT


-------------------------------------------------------
Denemelerimiz bitti ve aşağıdaki kodu en hızlı kod seçtik, fakat zaman ayarlamasıda oldukça zor bu kodun...
//Bu basit uygulama PortA,0 a bağlı Ledi  1 Hertz frekansında yakıp söndürür
// Led PortA,0 dan şaseye 330 ohm direnç üzerinden bağlıdır.
#include <16f84.h>
#fuses NOWDT,XT // wdt kapalı, xt osilator

#byte TRISA=0x85 // TRISAyı tanımlıyoruz
#bit led=0x05.0 // led i tanımlıyoruz

void main() {
   int16 sayac=65000; degiskenimize ilk degeri verelim..
   TRISA=0xFE; //PortA,0 çıkış diğer pinler giriş
   for(;;) { 
     led=~led; //led toggle
     for(;sayac!=0;sayac--); // biraz bekle    
   }
 }


Benden bukadar, devam etmek isteyen olursa buyursun. :)

(Sürç-i lisan ettiysek affola)

ferdem

Alıntı yapılan: "SpeedyX"
for(;sayac!=0;sayac--); // biraz bekle

Bu satırın sadece bir defalık bekleme yapacağını düşünmüştüm, proteusta baktım her defasında bekleme yapıyor..!

Normalde 6500 gibi bir değeri olan sayac degiskeni ilk döngüde içteki for döngüsünde 0 alacak, 0 olana kadar bir eksilt demişsiniz. Burası tamam. Anacak sonsuz döngünün 2. seferinde bekleme yapacağı for a girmemesi gerekir çünkü sayac zaten ilk döngüden sıfırlanmıştı, içteki for un şartı "sayac 0 değilse", bu şart sağlanmadığı sürece for a uğramaması lazım. Enteresan geldi. Açıklaması olan arkadaşımız?

asadam

merhabalar

Daha önceden asm kullanan fakat yeni yeni ccs ye giren birisi olarak şu tavsiyelerde bulunabilirim.

Öncelikle windows altında C uygulamaları geliştirmeye başlayın. Fazla ileri gitmenize gerek yok ancak windows altında C çalışırken neyin ne olduğunu çok daha iyi öğrenirsiniz. yaklaşık 1 yıldır freelance C programcılığı yapmaktayım(ccs değil windows) CCS ye yeni başladım. Herhangi bir pic i programlamak için include dosyasında ki giriş - çıkış yada adc yada her ne kullanacaksak fonksiyonlarını bakmam yeterli olmakta.

Asla ASM öğrenmeden başka bir dil öğrenmeye çalışmayın. Böyle yaparsanız pic in nasıl çalıştığı sizin için daima bir sır olarak kalacaktır.

C dediğiniz dil zaten topu topu 25-30(kesin sayıyı bilmiyorum) anahtar kelime dediğimiz keywordlerden oluşur ki windows bile bunlar ile yazılmıştır.(dikkat C++ değil C)

Keywordlerin ne işe yaradığını bilmeniz yeterli olacaktır. Tabiki öğrenmek için uygulama yapmak zorundasınız. örn:for, break, int...

Asla fonksiyon ezberlemeye kalkmayın zaten hem kullandıkça hafızanıza oturacaktır. Hemde lazım olanı başlık dosyasını açıp bakarsınız.
örnek vermek gerekirse ccs de output_low(pin_a1); bir komut değildir. Sadece header dosyalarında parametreleri tanımlı olan bir fonksiyondur.
eğer C bilmeden CCS ye geçerseniz fonksiyon nedir belki bir muamma olarak aklınızda kalacaktır. ve belki keyword ile fonksiyon yada ön işlemci ayrımını bile yapamayacaksınız.

Benim CCS hakkında söyleyebileceklerim bunlar.

DumrulBey

Alıntı yapılan: "SpeedyX"...
Benden bukadar, devam etmek isteyen olursa buyursun. :)

(Sürç-i lisan ettiysek affola)
Dostum eline sağlık, epey emek harcamış olmalısın. Algoritma iyileştirme (code optimization) gerçekten çok önemli bir mevzu. Ama yukarıdaki gibi küçük bir uygulama da çok şey değişmeyecektir. Çünkü kodun büyük bir kısmını geçikme algoritması oluşturmaktadır. Gerisi için togle da kullansanız sonuçta sırayla BCF ve BSF assembly komutları çalışmaktadır.

Büyük kodlar da ise kararlılık (stability) ön plana çıkıyor. Yani iyileştirmeden daha önemlidir kararlılık. Eğer kodunuz daha kararlı çalışacaksa bir kaç baytlık RAM/ROM harcamanızın hiç bir mahsuru yoktur. Artık ne PIC modelleri çıkmakta, hafızayı bir kaç kuruşa (cent) arttırmanız (hafızası farklı ara modeller) mümkün olmaktadır.

Aslında en kısa kod kesinlikle assembly ile yazılır! Yani derleyici ile yapacağınız türlü cambazlıklar assembly ile yapacaklarınızı geçemez. Çünkü assembly o kadar basittir ki üst üste duran iki algoritmayı öyle etkileştirirsiniz ki aradan bir kaç tane satır silmeniz, kaynakları daha az kullanmanız dışında hiç bir şey değiştirmeyecektir. Bazen yüksek seviyle bir dil ile derlenen assembly kodlarına bakıyorum da bir ton gereksiz kod görüyorum. Tabii düzeltmek için harcayacağım zamanı yeniden yazmak için harcasam vakit kazanırım...:)

Kodlarınız kısa, başarınız uzun olsun...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)

DumrulBey

Forumda önemli bir sorun mu var? Mesajlar gitmiyor tekrar göndermek gerekiyor sonra bakmışız iki defa gitmiş. Hatta üç defa gönderen arkadaşlar olmuş! Bu mesajı da silme hakkım olmadığı için böyle bir not ile dikkat çekeyim dedim. :roll:
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)