CCS-C Encoder okuma ve seri iletişim


Sonsuz döngü içerisinde enable_interrupts(int_rda); yazmanızın bir anlamı yok. Sadece döngüye girmeden önce yazmanız yeterli.

Hyperterminalden alacağınız sayıyı ya scanf ile veya tek tek getch ile alabilirsiniz.

say1=getch();

Hyperterminalden aldığınız sayı 1 ise sayı değişkeninde 0x31 sayısı yani ('1') bulunur o nedenle say1-=0x30; yapmalısınız.

8 bitlik sayılardan 16 bitlik sayı elde etmek için ya make16 fonksiyonunu kullanacaksınız veya union tip tanımından 16 bitlik değişkeni iki adet 8 bitlik değişkenlerle aynı yerde tanımlayacaksınız veya;
*(&say16)=say1;
*(&say16+1)=say2;

yapacaksınız. Yalnız gelecek olan sayı 3 basamaklı ve 255 ten büyük ise o zaman say16=say3*100+say2*10+say1; ile 16 bitlik sayıyı elde edeceksiniz.
 
Sonsuz döngü içerisinde enable_interrupts(int_rda); yazmanızın bir anlamı yok. Sadece döngüye girmeden önce yazmanız yeterli.

Hocam int_rda kesmesinde disable edildiğinden

Kod:
#int_rda   // RX ucuna veri gelince meydane gelen kesme
void serihaberlesme_kesmesi (){
   disable_interrupts(int_rda); // int_rda kesmesini pasif yap
   atol(gets(git)); // String ifadeyi al git degiskenine aktar
}

sonsuz döngü içinde sürekli açmayı düşündüm, farklı ve daha efektif bir kullanım öneriniz varsa memnun olurum.


Hocam bu hocaların ne istediği ne yapacağı belli olmuyor, şimdi bilgisayardan veriyi almak ve encoder pulse değerini göstermek için vb 6.0 ile bir arayüz istiyorlar, hyper işi iptal yani.

Anlatımınızı anlamaya gayret ediyorum henüs ccs'ye tam hakim değilim doğal olarak yanlız aldığım kitapta gets komutu şöyle tarif edilmiş:

Kod:
RS232 iletişimde RX pini üzerinden string ifade alımı için kullanılır. Enter tuşuna basıldığında o ana kadar yazılan string değeri ile geri döner.

Bende bu sebeple int_rda kesmesinde

Kod:
#int_rda   // RX ucuna veri gelince meydane gelen kesme
void serihaberlesme_kesmesi (){
   disable_interrupts(int_rda); // int_rda kesmesini pasif yap
   [B][COLOR="Red"]atol[/COLOR]([COLOR="Blue"]gets[/COLOR](git));[/B] // String ifadeyi al git degiskenine aktar
}

şeklinde bir kullanımı düşündüm. atol ile veriyi işaretli 16 bit sayıya çevirmek için.

Mesela 400 değerini send ettiğimde git değişkeninde bu değerin depolanmasını arzu ediyorum ben, bu kullanımla istediğim şeyi elde etmiş olur muyum?
 
Sondan başlayayım.
stringi gets ile okutuyorsanız (hiç kullanmadığım için bilmiyorum bu komutu) 16 bit işaretli sayıya dönüştürmek için :

deg16bit = atoi(sss); // sss[]={"123"} gibi bir sayı olacak.

hyperterminal kullanmayacaksanız VB de sayıyı '1' mi yoksa 1 mi olarak kullandığınıza göre pic tarafındaki yazılımınız değişecektir. VB de sayı '1' olarak turuluyorsa pic tarafında atoi kullanmanız gerekir.

Kesme içerisinde disable_interrupts(int_rda); // int_rda kesmesini pasif yap
komutunu kullanmanıza gerek yok. Aynı şekilde ana döngüdede enable etmenize gerek yok. Pic te kesmeye gittiğinizde rda kesmesi hala etkindir ama GIE pasifleştirilir. İnterrupt dönüşü retwie komutuyla yapıldığı için otomatik olarak global interrupt enable edilir.

rda kesmesini ana döngüden önce aktifleyin, gie de, gerisini pic donanımı halleder. Derleyici context saving/restoring ve dönüşte retwie ekler kesme rutinine. Ayrıca pic16 ve 18 lerde 1 ve 2 kesme vektörü vardır. Diğer kesmeler bu vektöre yerleşen adreste CCS tarafından tanınır ve ayırt edilir. Siz bunlara karışmayın. Derşeyiciye bırakın gerisini.
 
Sondan başlayayım.
stringi gets ile okutuyorsanız (hiç kullanmadığım için bilmiyorum bu komutu) 16 bit işaretli sayıya dönüştürmek için :

deg16bit = atoi(sss); // sss[]={"123"} gibi bir sayı olacak.

Hocam bu sayısal dönüştürme işi galiba biraz karışık, sandığım kadar kolay olmayacak ve vb arayüzünü yapıp uygulamada test etmedikçe sonuçtan emin olamayacağım.


Bendeki kitapta bunlar hep kullanıldığından bende kullanma gereği duymuştum, o halde dediğiniz gibi rda kesmesinden çıkarıyorum bu kısmı ve while döngüsü içinden de çıkarıyorum ve döngü öncesi şu atamayla yetiniyorum:

Kod:
 enable_interrupts(int_ext);
 enable_interrupts(int_rda);
 enable_interrupts(global);
   
  while(1){
 //dongu icinde islemler
 
kesme ile ilgili kısım doğru.

VB de sayılar sayı olarak tutulabilir ama textbox veya memo alanına yazdırırken sanıyorum stringe gönüştürülüyor. Bu durumda text alanından alacağınız (kullanıcının girdiği) sayıyı (karakter olarak) vb de sayıya dönüştürüp doğrudan pic e yollayabilirsiniz. Bu durumda peşpeşe okuduğunuz iki baytı hiç bir işleme tabi tutmadan yukarıda bahsettiğim şekilde 16 bitlik sayıya dönüştürebilirsiniz.
 

Hocam vb ile eskiden kalma haşır neşirliğim var, diyelim text1 alanına yazılan metni send edicem, kod şöyle olur:

Kod:
MSComm1.Output = Val(Text1)

Bu text1 içindeki veriyi sayısal veriye dönüştürür.

Yukarıdaki yöntem dediğiniz 11. numaralı mesajdaki yöntem olmalı, benim burada merak ettiğim bilgisayardan bir seferde gönderdiğim veri örneğin 400 aynı kesme içinde pice gidiyormu, dolayısıyla o tek ve aynı kesme içinde yapacağımız ardışık işlemle bu sayıyı elde edebiliyor muyuz.
 
gets fonksiyonunu kesmede kullanacaksanız en son 0 sayısı gelene kadar gelenleri alır. Bu durumda kesme içerisinde bekleyip bütün stringi alabilir.

gets fonksiyonu madem ki string sonu olarak 0 sayısını bekliyor, o zaman vb den sayıları string olarak göndereceksiniz.

MSComm1.Output = Val(Text1) bu şekilde gönderecekseniz pic te gets fonksiyonunu kullanmayacaksınız.

Her baytı ayrı ayrı alacaksınız, sonra 16 bit sayıya dönüştüreceksiniz.
 

Hocam selamlar.

Makinamda isisi nihayet çalıştırabildiğim için teoride mümkün gibi görünenin pratikte pek öyle olmadığını gördüm

Şimdi bazı deneme kodlarını çalıştırıyorum, mesela bu gets fonskiyonunu kullandığımda isiste hata alıyorum çünkü bu satırdan sonrası çalışmıyor mesela led sönmüyor.

O yüzden getch kullandım.

Yine hocam gördümki while içinde enable_interrupts(int_rda); demezsem de kod düzgün çalışmıyor.

Ben isiste projeyi çalıştırdığımda virtual terminalde bozuk karakterler görüyorum.

Metin düzgün çıkmıyor ayrıca klavyeden bir karaktere bastığımda da bu lcd'ye yansımıyor.

Sizce nerede hata yapıyorum?
 
lcd ekranda bir sorun var. uart çalışıyor. lcd bağlantısını değiştirdim ama olmadı. Eski sürüm ccs lerdeki lcd.c dosyasını bulup çalıştığınız klasöre kopyalayın, programda include <lcd.c> kısmını include "lcd.c" olarak değiştirin ve isiste portb ye yeniden bağlayın.

isiste uart bağlantısı yaparken max323 gibi sürücü tanımlamanıza gerek yok. Terminal ekranında datayı invert etmenize gerek yok. 877 hızı 1 MHz te kalmış.

kesme içerisindeki disable interrupt fonksiyonunu kaldırmadığınız için ana döngüde enable yapmak zorunda kalıyorsunuz. Bunu daha önce yazmıştım ama uygulamıyorsunuz.
 

Hocam max232 entegresi kitapta yer aldığından bende koydum, onu çıkardığımda ise belki yanlış bağladığımdan rda kesmesi oluşmuyor.

Disable interrupt meselesinde dediğinizi uyguladım hocam ama isiste çalışmadı, yani isiste disableyi kaldırdığım halde kesme oluşmuyor ve veri gönderilmiyor bu yüzden sonsuz döngüde enable_interrupts(int_rda); kullanıp kesmede disable yaptım.

Birde rapidden şu an dosyayı indiremiyorum premium üyeliğim olmadığı için, indirebildiğimde bakcağım teşekkür ederim ilginize.
 
Bu siteyi kullanmak için çerezler gereklidir. Siteyi kullanmaya devam etmek için onları kabul etmelisiniz. Daha fazla bilgi edin…