Picproje Elektronik Sitesi

DERLEYİCİLER => Microchip MPLAB C serisi => Microchip C18 => Konuyu başlatan: NecroCapo - 19 Nisan 2010, 13:58:05

Başlık: C18 - Adresi verilen SFR'ye değer okuma/yazma
Gönderen: NecroCapo - 19 Nisan 2010, 13:58:05
I2C ile haberleştirdiğim 2 PIC var elimde. Aralarındaki haberleşme protokolünde; daha iyi kontrol sağlamak  için şöyle birşey eklemek istiyorum:

Master : Slave kardeş bana sendeki PORTA,PORTB, SSPCON1, TRISC, SSPBUF vs... değerlerini gönderebilrmisin ? derken, istediği SFR'nin bellek adresini slave'e gönderecek. Slave de o adreste bulunan değeri I2C bus üzerinden master'a iletecek.

Sormak istediğim şey ; C18 ile herhangi bir register (special function register) içeriğini okumak veya yazmak için gerekli syntax ne şekilde olmalıdır ?  memcpypgm2ram vs. fonksiyonu kullanılmadan pointerlar ile bu işlem yapılabilir mi ? (&Y=X; Y=255 gibi ??)

Yani;  PORTB 'ye 255 yaz (PORTB=255) demek yerine, X Adresindeki Register'a 255 yaz demek compiler'a nasıl anlatılır?
(X, masterdan gelen bellek adresi)
Başlık: Ynt: C18 - Adresi verilen SFR'ye değer okuma/yazma
Gönderen: Tagli - 19 Nisan 2010, 19:43:12
C18 bilmiyorum ama "memcpypgm2ram" isminden anladığım kadarıyla assembly'deki TBLRD komutlarının işini görüyor, yani program hafızasındaki veriyi RAM'e alıyor. Bu durumda bu komut bir işine yaramaz, çünkü senin göndermek istediğin veriler zaten RAM'de.

Assembly'de bu iş FSR (File Select Register) ile yapılır. 16 serisinde de mevcut olan bu özellik 18 serisinde biraz daha geliştirilmiş. Bunlardan 3 adet var ve FSRxH ve FSRxL olmak üzere ikiye bölünmüşler (x = 0, 1, 2 olmak üzere). Yapman gereken şey bunları SFR'lerin bulunduğu alanın başını adresleyecek şekilde doldurmak (sadece birini kullansan yeterli olur sanırım). Daha sonra ise INDF register'larından okuma yapacaksın. Bunların da birkaç çeşidi var, örneğin POSTINCx'den okuma yaparsan okumadan sonra adres otomatik olarak arttırılacaktır.

C18'de bu işi yapmak için özel komut var mı bilmiyorum ama öyle sanıyorum ki bu işlem sadece register okumaktan ibaret olduğu için assembly'de yapıldığı gibi C18'de de uygulanabilir.
Başlık: Ynt: C18 - Adresi verilen SFR'ye değer okuma/yazma
Gönderen: NecroCapo - 20 Nisan 2010, 08:28:17
Tagli hocam çok teşekkür ederim; FSR0H,FSR0L ve INDF işimi görecek gibi duruyor. C compiler içerisinde include edilen picXXX.h dosyasında bu tanımlar ve adresleri mevcut. Yani direk olarak

FSR0H = X;
FSR0L = Y;
Z = INDF;

yapabiliyoruz sanırım. Bu şekilde deneyeceğim.
Başlık: Ynt: C18 - Adresi verilen SFR'ye değer okuma/yazma
Gönderen: NecroCapo - 21 Nisan 2010, 00:49:41
Sağolasın şu an sorunsuz çalışıyor :)
Başlık: Ynt: C18 - Adresi verilen SFR'ye değer okuma/yazma
Gönderen: PROTECH_ - 21 Nisan 2010, 00:59:36
pointer kullanarak ta aynı işlemi sorunsuz olarak yapabilirsin ...