C18 - Adresi verilen SFR'ye değer okuma/yazma

Başlatan NecroCapo, 19 Nisan 2010, 13:58:05

NecroCapo

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)

Tagli

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.
Gökçe Tağlıoğlu

NecroCapo

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.

NecroCapo


PROTECH_

pointer kullanarak ta aynı işlemi sorunsuz olarak yapabilirsin ...
Multi-Core ,RTX,ThreadX, FreeRTOS, MODBUS  RTOS - Electronic-Hardware -- BERLIN