PIC BASIC PRO Öğreniyoruz soru cevapları

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

ete

Tarif ederken kendin sorunun cevabını veriyorsun aslında;
Önce PortB.2 =1 olmuşmu ona bakacağız.

IF PORTB.2=1 then  'portB.2=1 olmuş ise bu satırdan sonraki komutlar işlev görecek değilse hespi atlanacak demektir
  pause 2000  'burada 2 sn bekliyoruz 2sn=2000 ms demektir
  IF  PortB.0=1 and PortB.1=1 then  'bu pinlerin her ikiside 1 olmuş ise devam
     PORTA.1=1
  else
    PORTA.1=0
  ENDIF
ENDIF

Hepsi bu kadar.
Tamamen mantık sırası. Komutlarda çok basit üstelik. Anlaşılmayacak bir şey yok sanırım.
Tabiiki bu komutlar çalışır ancak bir kötü tarafı var. Şayet bu yapılanları yaparken başka işlerinde yapılması gerekiyor ise program,
PAUSE 2000 komutunda  2sn müddetle kilitlenecek ve başka işe bakamayacaktır. Bunu aşmanın yolu tabiiki ya kesme metodu ile bir saat sistemi kullanmak ve siz diğer işlerinize bakarken saatinde bir yandan saymasını sağlamak yada harici bir saat kaynağı kullanmak olur.
Ancak bu iş anlattığım kadar kolay değil biraz karmaşık elbette. Bu işi ancak programcılıkta iyi bir seviyeye geldikten sonra kıvırabilirsiniz.
Şimdilik kafanızınbir köşesinde yer alsın ve ileride buna kafa yorarsınız.

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

erkanert

Öncelikle cevap için çok ama  çok teşekür ederim... Bu kadar hızlı cevaplamanız inanılmaz. Bu bilgi Çok işime yaradı Tekrar Teşekkürler...

bolanka

Sevgili Ete ilk dersi bitirdim şimdi ve yazmadan edemedim. Harika bir anlatım olmuş. Çok teşekkür ederim. İnanın para verip aldığım kitaptan hiçbir şey anlamadım ama senin anlatımınla herşey net. Teşekkür ederim.

microlight

ETE hocam 6.dersdeki KESM-TMR0 projenize bir kaç kod ekledim, eklediğim kodlar  isteğim gibi programı çalıştırdı. LCD yi iptal ederek aynı yazdığım programı çalıştıramıyorum. senin yazdığın LCD ile ilgili kodlarını sildim ama  program çalışmadı. yardımcı olabilirmisin

bu programda LCD yi nasıl iptal ederim. LCD yi kullanmak istemiyorum. programım içeriği, çalar saata benzer bir uygulama. kodları ekleyeceğim ama şu an için mümkün değil. eve döndüğüm zaman ekleyebilirim
kolay gelsin

eistain_54

DEFINE OSC 4
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 1
DEFINE LCD_RWREG PORTB
DEFINE LCD_RWBIT 2
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 3
DEFINE LCD_BIT 4
DEFINE LCD_LINES 2
DEFINE  HSER_RCSTA 90h   
DEFINE  HSER_TXSTA 24h    
DEFINE  HSER_BAUD  2400  
DEFINE  HSER_SPBRG 207  
DEFINE  HSER_CLROERR 1    
SYMBOL  GIE  =INTCON.7   
SYMBOL  PEIE =INTCON.6   
OPTION_REG.7=0
ADCON1=7
PEIE=1
KARAKTER VAR WORD
low portb.1
LCDOUT $FE,1
lcdout "muhammet"

BASLA:
HSERIN [KARAKTER]
LCDOUT $FE,$C0,"GELEN VERI:",#KARAKTER
GOTO BASLA
END

Abi kodu yazıyorum ama ekranda çıkan sadece 255 değeri oluyor.Normalde beklentim klavyeden girdiğim karakterlerin ekranda gözükmesi.Ama nerde hata yapıyorum bilmiyorum?Devre şeması aşağıda


Her gün 24 altın verilirken bunun için kime şükredersin ey ademoğlu!?!

ete

#260
Microlight,

Bir programdan LCD nin çıkartılması için önce programınbaşında yer alan LCD ye ait define komutlarını kaldırman gerekiyor.
Sonra program içinde yer alan bütün LCDOUT ile başlayan komutlarıda kaldırman gerekiyor. Hepsi bu kadar.
Tabiiki LCD programın görsel olarak çalıştığının bir ispatıdır. Onu kaldırınca programın çalıştığını ancak bağladığın led vs. gibi elemanlar aracılığı ile anlayabilirsin.  ANladığımkadarı ile programda yalnızca TMR0 kesmesi kullanmak istiyorsun. O halde kendi programına bu kesmeyi ilave etsen daha uygun olmazmı.?
Bütün yapacağın iş;
- Option registerini TMR0 için ayarlayacaksın. Bölücü değerini buradan yarlayacaksın.
- INTCON registerini ise yine TMR0 sayacı için ayarlayıp global kesmeleri açacaksın.
- Kesme başlığı altında bir alt program yaratıp orada yapacaklarını belirleyecek ve sonunda TMR0 kesme bayrağını sıfırlayıp kesmeden çıkacaksın
hepsi bu.
Bana kalırsa programın çalışınca ne ile çalıştığını belli edecek ona kafa yormalısın.



@Eistain_54,
Bildiğimiz PC klavyesinden bahsediyor isen bu kadarcık kod ile o sistemin çalışmasını bekleme lütfen. Klavye sistemi senin bildiğinden çok daha karmaşık çalışır. Bir ara uğraşmış idim.  PC tarafından klavyede herhangi bir tuşa basmanın bir kodu ve tuşu bırakmanın ayrı bir kodu vardır.
Bunun yanında combine tuşlar ise ayrı kod alırlar. Epeyce karmaşık bir konudur ve bu kadar basit kodlarla klavye bilgisi LCD ye verilemez.
Çok merak ediyorsan klavye okuma aşağıdaki gibi bir programdır, Bu program MHK isimli arkadaş tarafından yazılmıştır. Bende üzerinde biraz değişiklik yaparak klave deneme programı haline getirdim.
@ DEVICE pic16F877A  
@ DEVICE pic16F877A, WDT_OFF 
@ DEVICE pic16F877A, PWRT_ON 
@ DEVICE pic16F877A, PROTECT_OFF 
@ DEVICE pic16F877A, HS_OSC 
 DEFINE OSC  20
TRISB=0 

DEFINE LCD_DREG     PORTB       'LCD DATA BACAKLARI PORTB'DE BAĞLI
DEFINE LCD_DBIT     0           'LCD DATA BACAKLARI PORTB.0 DAN BAŞLIYOR
DEFINE LCD_RSREG    PORTB       'LCD RS PINI PORTB'YE BAGLI 
DEFINE LCD_RSBIT    4           'LCD RS PINI PORTB.4'E BAGLI 
DEFINE LCD_EREG     PORTB       'LCD ENABLE PINI PORTB'YE BAGLI 
DEFINE LCD_EBIT     5           'LCD ENABLE PINI PORTB.5'E BAGLI 
DEFINE LCD_BITS     4           'LCD 4 BIT HABERLESIYOR 
DEFINE LCD_LINES    2           'LCD 2*16 
DEFINE LCD_COMMANDUS 2000 'Command delay time in us 
DEFINE LCD_DATAUS 50 'Data delay time in us 


ADCON1 = 7                  ' PORTA ve  E dijital giris çikis olarak ayarla 

TRISA = %00111111              ' A portunu giris olarak tanimla 
TRISC = %00000000            ' B portunu giris olarak tanimla 
TRISB = %00000000
TRISD = %00000000            ' D portunu giris olarak tanimla 
PORTC=0:portc=0:portd=0 

CLKPIN   var     PORTC.6        ' Klavye clock pin PORTC.0 olarak tanimla 
DATAPIN  var     PORTC.7       ' Klavye Data pin PORTC.1 olarak tanimla 

'************** Degisken tip tanimlama bloklari ********* 
klavyedeg  var   byte 
dvm01 var byte 
dvm02 var byte 
dvm03 var byte 
dvm04 var byte 
dvm05 var byte 
deg var BYTE 
satir var byte 
kodcozdeg var byte 
harf var byte 
parity var bit 
bitsay var byte 
parbit var byte 
txdeg var byte 
rx_byte var byte 
LEDs var byte 
rx_ok var byte 

'**************** degisken baslangiç degerleri *********** 
klavyedeg=0 
dvm01=0 
dvm02=0 
dvm03=0 
dvm04=0 
dvm05=0 
kodcozdeg=0 
deg=0 
satir=0 
harf=1 
txdeg=0 
rx_byte=0 
LEDs=0 
bitsay=0 
rx_ok=0 

gosub ekransil                   ' LCD ekran temizleme alt programina git. 
lcdout $Fe,2,"PC AT Klavye" 
lcdout $Fe,$C0,"Deneme programi" 
pause 300
'********* LCD TÜRKÇE KARAKTER OLUSTURMA ************** 
LCDOUT $FE,$40,$0E,$00,$0E,$11,$11,$0F,$01,$0E 
LCDOUT $FE,$48,$00,$0E,$11,$10,$11,$0E,$04,$08
LCDOUT $FE,$50,$00,$0A,$00,$11,$11,$11,$0E,$00 
LCDOUT $FE,$58,$00,$0F,$10,$0E,$01,$1E,$04,$00 
LCDOUT $FE,$60,$00,$00,$0C,$04,$04,$04,$0E,$00 
LCDOUT $FE,$68,$0A,$00,$0E,$11,$11,$11,$0E,$00 

pause 1000 
gosub ekransil 
LEDs =0                
txdeg=$ED             ' PC AT klavye caps num ve scrlock ledlerini söndür. 
GOSUB TX_hazir 
GOSUB tx_gonder 
            
'AAAAAAAAAAAAAAAAAAAAAAA-------  Ana Program ------AAAAAAAAAAAAAAAAA 

anaprogram: 
          rx_byte =0 
          gosub RX_klavye 
          if rx_ok=0 then anaprogram 
          rx_ok=0 

          IF rx_byte=$12 or rx_byte=$59 THEN M4 ' Eger shift tusuna basilmissa M4 e git    
  
          if rx_byte=$F0 then dvm02=1:goto anaprogram ' Eger klavye tusu birakilma kodu olan F0 gelmisse 
          if rx_byte=$E0 then dvm05=1:goto anaprogram ' Eger klavye tusu birakilma kodu olan E0 gelmisse 

          if dvm02=1 then dvm02=0:goto anaprogram     ' Eger klavye tusu birakildiginda tus tekrarini önler 

          IF rx_byte = $FA THEN                   ' Klavye caps num ve scrlock ledlerini yakmaya hazir  
            GOSUB TX_hazir 
            txdeg=LEDs 
            GOSUB ledcaps 
            rx_byte =0 
          ENDIF 

          IF rx_byte = $12 THEN                   ' Eger shift tusuna basilmissa if blogu içindekileri yap 
M4: 
             LEDs = LEDs | %00000001          ' scroll lock LED'i 1 ile OR islemi yaparak 1' le 
             IF dvm02 = 1 THEN                  
               LEDs =LEDS ^ %00000001         ' Scroll lock LED'i değille 
               dvm02=0 
             ENDIF  
             txdeg=$ED 
             GOSUB TX_hazir 
             GOSUB tx_gonder 
             GOTO anaprogram 
          ENDIF        

    IF rx_byte = $58 THEN                   ' Eger shift caps lock basilmissa if blogu içindekileri yap 
       LEDs = LEDs ^ %00000100           ' Caps ledini değilleyerek her basista yanmasi yada 
       txdeg=$ED                         ' sönmesini saglar 
       GOSUB TX_hazir 
       GOSUB tx_gonder 
       goto anaprogram 
    ENDIF  

      IF LEDs = 0 THEN                    ' caps = 0, shift = 0 
         harf=1                             ' ( Caps ve Shift basilmamissa normal durum) 
         gosub kodcoz 
         GOTO anaprogram 
      ENDIF 

      IF LEDs = 1 THEN                    ' caps = 0, shift = 1 
         harf=2                             ' Normal durumda klavyede shift tusuna basilma islemi 
         gosub kodcoz 
         GOTO anaprogram 
      ENDIF       

      IF LEDs = 4 THEN                       ' Caps = 1, shift = 0 
         harf=3 
         gosub kodcoz 
         GOTO anaprogram 
      ENDIF 

      harf=4 
      gosub kodcoz 
      goto anaprogram 

'*************** KLAVYE OKUMA ****************************** 
RX_klavye: 
          gosub clock 
          if deg=1 then RX_klavye 

          if deg<10 then 
            klavyedeg=klavyedeg>>1 
            klavyedeg.7=DATAPIN               
          endif        
        
          if deg>10 then deg=0:rx_byte=klavyedeg:rx_ok=1:return 
          GOTO RX_klavye 
          return 
'******************** CLOCK ************************ 

      if CLKPIN=1 then dvm01=0:goto clock 
      if dvm01=1 then clock 
      
      if CLKPIN=0 then 
        deg=deg+1 
        dvm01=1 
      endif 
      return 
'************* Seri bilgi gönderme alt programi ******** 

tx_gonder: 
           gosub clock            
           if deg<9 then 
              datapin=txdeg.0 
              txdeg=txdeg>>1 
           endif        
           
           if deg=9 then datapin=1 
           
           if deg=10 then 
             INPUT CLKPIN                ' Clock ve 
             INPUT DATAPIN               ' data giris tanimlandi 
           endif 
    
           if deg=11 then deg=0:return              ' 11. bite ulasildiysa geri dön 

           goto tx_gonder 
           return 
'******************************************************* 
ledcaps: 
'parity bit hesaplama: Gönderilen 1 ler çift ise parity=1, tek ise parity=0 olacak 
        gosub clock 

        if deg<9 then 
           datapin=txdeg.0 
           txdeg=txdeg>>1 
        endif        
        
        if deg=9 then 
           datapin=parity 
        endif 

        if deg=10 then 
           TRISC = %11000000 
        endif 
   
        if deg=11 then deg=0:return 

        goto ledcaps 
        return 
'******************************************************* 

      parbit=LEDs 
      for deg=0 to 2 
        if parbit.0=1 then bitsay=bitsay+1    ' Parity bit hesaplama için gönderilecek  
        parbit=parbit>>1                       ' bilgideki 1 lerin sayisi bitsay degiskeninde saklanir. 
      next                                          
      
      parity=0 
      if bitsay//2=0 then parity=1                  ' Eger bitsay çift ise parity=1 
      bitsay=0:parbit=0                             ' değilse parity=0 olarak hesaplanir. 
      deg=0 
      OUTPUT CLKPIN
      OUTPUT DATAPIN
      clkpin=0:pauseus 80 
      datapin=0:pauseus 20 
      INPUT CLKPIN   
      return 
'****************** KOD COZME ****************************** 
kodcoz: 

        if rx_byte=$66 then                       ' ESC tusunun kodu , eger bu tusa basilmissa 
          kodcozdeg=" ":satir=satir-1             ' LCD ekran temizlenir. 
          if satir>15 then satir=0          ' 2x16 LCD ekranda 16.satira gelindiginde ekran 
          gosub lcdgoster                   ' temizlenir ve satir basi yapilir. 
          return 
        endif 

        if rx_byte=$0E then kodcozdeg=34:goto gec02 ' OE kodu " karakterini olusturmak için kullanilir. 
        if rx_byte=$54 then kodcozdeg=0:goto gec02  ' Türkçe G karakteri 
        if rx_byte=$49 then kodcozdeg=1:goto gec02  ' Türkçe Ç karakteri 
        if rx_byte=$5B then kodcozdeg=2:goto gec02  ' Türkçe Ü karakteri 
        if rx_byte=$4C then kodcozdeg=3:goto gec02  ' Türkçe S karakteri 
        if rx_byte=$41 then kodcozdeg=5:goto gec02  ' Türkçe ö karakteri 
'if rx_byte=$54 then kodcozdeg=64:goto gec02' @ karakteri 

' Keypad / tusunun aktif yapilmasi için kullanildi. 
        if dvm05=1 THEN 
          if rx_byte=$4A then dvm05=0:kodcozdeg="/":goto gec02 
        endif 
' Bakspace tus kodu, bu tusa basildiginda yazilan son karakter silinir. 
        if rx_byte=$76 then satir=0:kodcozdeg=" ":gosub ekransil:gosub lcdgoster:return 

' Klavyede kullanilmayacak tuslarin ekranda kodlarinin görüntülenmesini engeller. 
        if rx_byte>126 or rx_byte<20 then return 

' Keypad tuslarinin kullanimi ile ilgili kodlari çözmek için kullanilir. 
        if rx_byte>104 THEN harf=5 

gec01: 
       gosub harfbul              
gec02:                      
       if satir>15 then satir=0:gosub ekransil 
       gosub lcdgoster 
       satir=satir+1 
       rx_byte=0 
       return 

'**************************** HARF ÇÖZME ********************** 
         if harf=1 then                                                                              
'************************************************************************************************************ 
           LOOKUP rx_byte-21,["q1   zsaw2  cxde43   vftr5  nbhgy6   mju78   k o09   .l p*=  i  -       ,   <"],kodcozdeg 
'Türkçe i karakteri 
           if rx_byte=$43 then kodcozdeg=4 
         endif 

         if harf=2 then                                                                              
'************************************************************************************************************ 
           LOOKUP rx_byte-21,["Q!   ZSAW'  CXDE+^   VFTR%  NBHGY&   MJU/(   KIO=)   :L P?=  I  _       ;   >"],kodcozdeg 
         endif 

         if harf=3 then                                                                              
'************************************************************************************************************ 
           LOOKUP rx_byte-21,["Q1   ZSAW2  CXDE43   VFTR5  NBHGY6   MJU78   KIO09   .L P*=  I  -       ,   <"],kodcozdeg 
         endif 

         if harf=4 then                                                                              
'************************************************************************************************************ 
           LOOKUP rx_byte-21,["q!   zsaw'  cxde+^   vftr%  nbhgy&   mju/(   k o=)   :l p?=  i  _       ;   >"],kodcozdeg 
         endif 


         if harf=5 then                                                                              
'***************************************************** 
           LOOKUP rx_byte-105,["1 47   0,2568   +3-*9"],kodcozdeg 
         endif 
         return 

'*************** LCD GÖSTERME **************************** 
lcdgoster: 
           lcdout $FE,2,"Kod=",hex2 rx_byte," Satir=",dec2 satir 
           lcdout $FE,$C0+satir ,kodcozdeg'," " 
           return 
'*************** EKRAN TEMIZLEME ALT PROGRAMI ************ 
ekransil: 
          lcdout $FE,1 
          return 

End


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

eistain_54

#261
Anladım.Ancak pc klavyeden gelen veriyi kullanmak gerçekten kolay bir iş değilmiş bunu gördüm. :)Şimdi ikinci bir konu daha var.Seri porttan pice bir takım veri gönderilecek.Yani baya takım.Cümlecik gibi.İçinde bazı bilgiler olacak.Örnek bi cümle yapısı ;

         
Har,Yol,Hız,Der

Başında da "GELEN" diye bir işaret verisi var.Şimdi benim sormak istediğim burda bir de uyandırma sinyali varmış.Nedir bu "Uyandırma Sinyali"?
Ne için kullanılır nasıl kullanılır falan?Birde ben bu verileri hserin ile alıp bir tek değişken içine mi saklayabilirim yoksa aynı anda çok değişkene atabilirmiyim?Şöyle;
           
enable
           kesme:
           HSERIN 300,devam [("GELEN"),değişken1,değişken2....]
           devam:
           resume

falan gibi bişey.Burda "GELEN" adlı başlık içinde yukarıdaki gibi bir veri paketi var.Bu paket içindeki verileri üstteki kodda olduğu gibi sırayla değişken1,değişken2... içine alabilirmiyim.Daha açık olursak "Har" adlı veriyi değişken1 içine "Yol" adlı veriyi değişken2 içine "Hız" adlı veriyi değişken3 içine "Der" adlı veriyi değişken4 içine ayrı ayrı kesme alt programında Hserin ile yapabilirmiyim?Yoksa başk bir yöntemi varmıdır?
Her gün 24 altın verilirken bunun için kime şükredersin ey ademoğlu!?!

ete

Seri haberleşmede en önemli konu senkron tutturmadır. Bu ne anlama geliyor dersen.
Bir veri yolluyorsun. Yollanan veri birim zamanda belirli sayıda bit bilgisi şeklinde yollanıyor.
Bu nedenle yollayan veriyi yolladığı zamanda alacak olan almak için hazır bekliyor olması lazımki gönderilen veri eksiksiz olarak alınabilsin.
Şimdi bir verici düşün. Aynen şu şekilde çalışıyor;
BASLA:
Hız,zaman,adet vs yolla
pause 100
goto BASLA
şimdi bu komutlara bakarsan bir takım bilgiler yollanıyor sonra 100ms bekleniyor ve yeniden yollanıyor.

Şimdi aynı veriyi alan sisteme bakarsak,

BASLA:
Verial
pause 100
Goto basla
Şimdi her iki programda da pause 100 komutu var. Normal şartlarda veri yollama süresi 1-3 ms arasında bir zaman alır.
Verici yolladığı zaman alıcı pause komutunu işliyorsa ne olacak? tabiiki gelecek bilgiyi alamayacaktır. Neden çünki o anda başka işle meşguldür.
Peki pause komutlarını kaldıralım he iki  taraftan. Bu işlem verilerin yollanma ve alınma ihtimalini biraz daha artıracaktır.
Ama veri alacak olan program hemen almaya başlasa direk yollanan veriden başlayacaktır.
Hele birde USART kesmesi kullanırsanız. İlk veri biti ulaştığı zaman kesme oluşacak ve ilk byte güme gidecektir. Peki ne yapmak lazım?
O halde yollanan bilgi paketininbaşına belirli bazı ön bilgi eklenirse o bilgiler USART ı uyandırmış olur ve program kesme kısmına atlar ve ardından gelen asıl bilgi alınarak veri kaybı önlenmiş olur. İşte bu önden yollanan bilgiye uyandırma sinyali adı verilir. Formatı da;
5 byte $AA bilgisi ardından 5 byte $FF bilgisi ardından 5 byte $00 bilgisi şeklinde yollanır. Bu formattaki bilgiye preambl + uyandırma sinyali adı verilmektedir. Bu bilgi usart'a ulaştığında veya aradan alıcı devreye ulaştığında peşinden gelen işaretçi aranarak uyandırma ardındaki asıl veriye ulaşılmış olacaktır.
USART uyandırma sinyali ile kesmeyi oluşturur ve kesme kısmında da işaretçi sorgulaması ile ardındna gelen alınarak veri kaybı önlenmiş olur.

Toparlarsak, Yollanan bilginin eksiksiz alınabilmesi için senkron tutturulması çok önemlidir. Bu nedenle alıcı program çok zaman alan işlerle oyalandırılmamalıdır. Verici aralıklı olarak veri yollayabilir. Ancak alıcı daha sıklıkla gelen veriye bakmalı ve mümkünse USART kesmesi kullanılmalıdır. Kesme kullanılınca da veri başında mutlaka uyandırma sinyali yer almalıdır. Böylece USART erken uyandırılarak kesme oluşturulup gelen veri eksiksiz alınacaktır.
Yollanan bilgi 8 er bitlik birden fazla değişken halinde yollanabilir. Alıcı ise gelen bilgi sırasını bilerek ona uygun değişkenlerle gelenleri alabilir.
Yani ne kadar bilgi gelecek ise o kadar değişken adedi kullanmak gerekir. Bu nedenle yazdıkların doğrudur (degisken1,degisken2....degiskenx  gibi).

Ete


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

eistain_54

Hocam çok teşekkür ederim.Buraya kadar tamam.Şimdi uyandırma sinyalinin formatını da verdiniz ama onu cümlecikler ile aynı bloktamı gönderecez.Yani;
   $AA,$FF,$00,("GELEN")har,YOL,HIZ,DER
Gibi birşeymi olacak yoksa?Aslında sanki bunun alıcı tarafında çok önemi yokmuş gibi?Çünkü zaten bize lazım olan değerler orada değil.Biz alıcı tarafındaki usart kesmesi içinde direkt olarak başlık kontrolünün ardından değişkenlere eşitleme işlemini başlatabiliriz sanırım?
HSERIN 10,DEVAM,[("GELEN"),değişken1,değişken2,değişken3,değişken4] : DEVAM :resume
gibi bişey.Yani uyandırma sinyalinin alıcı tarafında dikkat edilmesi gereken birşey yok öylemi?Doğru anlamışmiyim? Teşekkürler...
Her gün 24 altın verilirken bunun için kime şükredersin ey ademoğlu!?!

ete

Yollama formatı,

       HSEROUT [REP$AA\5,REP$00\5,REP$FF\5]'uyandirma sinyali preambl
       HSEROUT ["G","E","L","E","N",HAR,YOL;HIZ;DER]

şeklinde olacaktır. REP$AA\5  komutunun işlevi şöyledir. RE=REPEAT anlamına gelir  komuttan sonra gelen $AA bilgisini \5 komut parametresi ile verilen adet kadar işletir. Yani $AA bilgisini 5 defa yollar.

USART kesmesi açmak için programın başına aşağıdaki kodları eklemen gerekiyor. Bunlar kesme registerlerini set ederek kesmeyi aktif hale getireceklerdir.
DEFINE OSC 4
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
DEFINE HSER_SPBRG 25  ' 9600 Baud @ 0,16%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically  

INTCON=%11000000

ON INTERRUPT GOTO INT
  
SYMBOL GIE  =INTCON.7   'genel interruptları açıyor
SYMBOL PEIE =INTCON.6   'peripheralinterruptları açıyor
SYMBOL RCIE =PIE1.5     'USART Recive interrupt enable bit
SYMBOL RCIF =PIR1.5     'USART Receive interrupt flag bit

RCIE=1
PEIE=1
GIE=1


Sonra programon kesme kısmıda aşağıdaki şekilde olabilir;

DISABLE
INT:
    GIE=0
    hSerIn , [WAIT("GELEN"),HAR,YOL;HIZ;DER]  
    TEMP=RCREG 
    GIE=1
    Resume
    enable
end

Burada önemli olan kesme bayrağının RCREG registerinin okunması ile silindiğidir.
Bu işide TEMP=RCREG  komutu yapmaktadır.
Umarım artık ekisk bir şey kalmamıştır.

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

eistain_54

Gerçekten biiti gibi.Sadece son bir soru bu konuya dair.Sizin verdiğiniz ikinci kodda yani;
hSerIn , [WAIT("GELEN"),HAR,YOL;HIZ;DER]
Seriden GELEN başlıklı dosya gelecek onu bekle gelen verileri sırayla "HAR,YOL,HIZ,DER" değişkenlerine kaydet mi yoksa GELEN başlıklı dosyayı bekle gelen veriler şu veriler...Nerde kullanacaksan kullan anlamına mı geliyor?Ya çok uzattım biliyorum ama son sorum.(bu konuyla ilgili) TEŞEKKÜRLER.Çok yardımcı oldunuz ÇOK SAOLUN....
Her gün 24 altın verilirken bunun için kime şükredersin ey ademoğlu!?!

ete

Sorun için vermiş olduğun iki yanıt da doğru. Birincisi, GELEN işaretçisi ni bekle ve ardından gelen verileri alıp değişkenlere yerleştir.
SOnra onları nerede kullanırsan kullan. Bu sana kalmış bir iş. Burada dikkatini çekeyim. "Gelen"  işaretçisi peşine 5 adet değişken ismi koyar ve gelen veride 4 adet byte dan oluşur ise sıkıntı yaşarsın. Senkron bozulur. Zira veri4 adet byte dır ve sen 5 adet beklemiş olursun 5. byte beklenirken program orada muhtemelen takılıp kalır.
Ama gelen veri 5 adet byte ve sen yalnızca 4 değişken ismi yazmış ise gelen 4 adet alınır ve beşinci ise bırakılır ve bir yerde atlanmış olur. Bunda sorun yok. Ama doğru kullanım kaç adet veri geliyorsa o kadar değişkenle bunların alınmasıdır.

Ete

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

eistain_54

Yani alıcı kısmında gelen verileri aynı isimde kaydedicilere ekliyoruz.Tercih bizim farklı isimde kaydedici de kullanılabilir mi?Şimdi hemen denemeye koyuluyorum o halde.Yardımlarınız için teşekkür ederim...
Her gün 24 altın verilirken bunun için kime şükredersin ey ademoğlu!?!

microlight

ete derslerindeki  seri iletişim uygulamasını biraz  değiştirmek istiyorum.  verici lamba  alıcı ldr  olacak. 
diğer  formlarda arkadaşlara aynı  soruyu  sordum, onlar  bu uygulamanın 628 ile olmayacağını  söylediler.
bu uygulamayı 16f628 de  neden yapamıyorum. 628 in  AN pinleri  anolog değil mi ?  sorun  nedir ki   AN  pinlerinden  ldr girişi olmuyor.
AN pinleri 628 de nasıl anolog olarak kullanılır.

hocam çalışmalarınızda  başarılar

not:  ETE derslerini 12 ye kadar okudum  torik  olarak,  çok az  uygulama  yaptım.


Maxim

16F628 de ANALOG giriş yoktur, comparator vardır.
her AN yazan giriş analog giriş olmuyor

onun yerine analog girişi olan başka birşey kullanabilirsiniz mesela 16F88 gibi.

direnç okumanın başka yollarıda var olmazmı
ama en doğrusu 16F88 gibi bir işlemci ile yola devam etmek
POT komutuna bakılabilir örnek olarak.