PİC ASSEMBLY ÜZERİNE BAZI ÖNEMLİ NOTLAR

Başlatan XNHCX, 08 Şubat 2004, 23:28:06

XNHCX

DOSTLAR ,
ASSEMBLY İLE PİC PROGRAMLAMA DAİR ÖNEMLİ NOTLARINIZI , DENEYİMLERİNİZİ  BU BAŞLIK ALTINA YAZALIM...

SELAMLAR

XNHCX

INTERRUPT NEDİR?

INTERRUPT ya da Türkçe ifadeyle KESME.

KESME’yi biraz açalım. Diyelim ki VCD Player’ınıza bir güzel film koydunuz , izliyorsunuz.Bu anda cep telefonunuz çaldı.Ne yaparsınız?
Belki ilk anda moraliniz bozulur hatta konsantrasyonunuz kalmaz bile. Ve ne yapacağınıza karar verirsiniz.
Eğer önemli bir telefon ise VCD Player’ınızın PAUSE tuşuna basarak filmi durdurursunuz.Telefon konuşmanız bittikten sonra da filmi durdurduğunuz yerden tekrar izlemeye devam edersiniz.Eğer telefona cevap vermek istemiyorsanız bu kez de kararınız arayanın telesekretere mesaj bırakması olur.Ve böylece filmi bölmemiş olursunuz.
Ya da eşiniz yemek yapma hazırlıkları yaparken telefon çaldı.İşini orada KESER , NEREDE BIRAKTIĞINI HAFIZASINA KAYDEDER ve koşar telefona cevap verir.Konuşma bittikten sonra mutfağa gider , işini nerede KESTİĞİNİ hatırlar.Ve kaldığı yerden işine devam eder.
Peki ne yaptık telefon geldi diye filmi izlemekten vaz mı geçtik.Ya da eşiniz tamamen yemek yapmayı mı bıraktı.Hayır.Diğer işlerini bitirdi.Tekrar öncelikli işine döndü.

İşte , hayatımızda bu ve bunun gibi pek çok örneklerle karşı karşıyayız.Yani bir işi yaparken yarıda bırakıp (yarıda KESİP), başka önemli birşeyle ilgilenip sonra tekrar kestiğimiz işe devam etme olayları..

Günlük hayatımızda farkında olmadan böyle KESMELER yaparız

PIC Kesmeleri de burada anlattığımız olaylara benzer.Buna göre PIC’lerde oluşan kesmeyi şöyle tarif edelim.

PIC’in portlarına ya da PIC’in kendi içindeki bir sayıcısından gelen herhangi bir sinyal nedeniyle belleğinde çalışmakta olan programın kesilmesi olayıdır, INTERRUPT(KESME)

Programın kesildiği andan itibaren önceden hazırlanan bir alt program çalışır.ALT PROGRAM işlevini bitirdikten sonra program kaldığı yerden itibaren çalışmasına devam eder.SONUÇTA bir kesme , ana programın çalışmasını sadece DURAKLATIR , ama hiçbir zaman işlevini devam ettirmesini engellemez.

Dikkat edelim.Kesmeyi herhangi bir alt programı çağırmayla karıştırmayalım. Aralarında önemli bir fark vardır.
Normal alt programını çağırma işi CALL komutuyla yapılır.
Kesme alt programlarının çağrılmasını ise donanımda oluşan değişiklikler yapar.


Bir INTERRUPT oluştuğunda , o anda çalışmakta olan komutun çalışması biter.Programın akışı PICin program belleğinin ----16F84 için --- h’0004’ adresine atlar ve buradaki komutu çalıştırır.Bu komut ile kesme alt programı çağrılır.PIC , kesme alt programı çalıştıktan sonra ana programın hangi adresine döneceğini kesinlikle unutmamalıdır.Bu yüzden MCU bu unutmaya meydan vermemek için kesme oluştuğu anda çalışan komutun adresini STACK (Yığın) registerine kaydeder.Alt program işlevini bitirip , program akışı ana programa geçince az önceki STACK ta saklanan adresten itibaren devam eder.

Bu arada kesme alt programından ana programa dönüş komutunun RETFIE olduğunu hatırlatalım.

INTERRUPT SIRASINDA OLUŞACAK OLAYLARI KISACA ŞÖYLE BİR ÖZETLEYELİM.

1.Kesme olayı başladığında dostumuz , emenetçi STACK registerin olduğu adrese atla.
2.Ana programın kaldığı adres bu STACK registere yazılır ki kesme bittiğinde ana program kaldığı yerden işlemeye devam etsin.
3.Kesme alt programının olduğu adrese atla.
4.Kesme alt programını çalıştır.Bitir ve dön.
5.Dönüşte STACK registere uğra .
6.Emanet olan Ana programa dönüş adresini al.
7.Adrese alınan yerden itibaren yoluna devam et.

XNHCX

Pic 16F84 için 4 değişik kaynaktan INTERRUPT sinyali gelebilir.Bunları aşağıdaki gibi sıralayabiliriz.

1. RB0/INT harici pininden giren sinyal.

2. PORTB High Level Change.RB4 , RB5 , RB6 ve RB7 pinlerinin herhengi birinde oluşacak lojik seviye değişikliği.

3. TMR0 ( Timer / Counter ) 0xFF’den 0x00 ‘a geçerken oluşan kesme, ya da başka bir deyişle TMR0 sayıcısında oluşan zaman aşımı kesmesi.

4. EEPROM’a yazma işlemi tamamlandığında oluşan interrupt.

Bu interrup kaynakların aktif olabilmesi için OPTION Register , INTCON Register gibi özel registerlerde bazı değişiklik yapmamız gerekecekir.Amaca ve kesme kaynağına göre bu özel registerlarda neler yapılacağına sonra değinelim.Bundan önce kısaca şu özel registerlar nelermiş onlar bir tanıyalım.

XNHCX

INTCON ( INTerrupt CONtrol ) Registeri

Bu register Pic'in RAM belleğinin h'0B' adresinde bulunan özel registerlerden birisidir.Bu register içerisinde her bir kesme kaynağı için bir FLAG bir de GLOBAL Kesme Bayrağı bulunur.
TÜM KESME İŞLEMLERİNİ KONTROLÜ BU REGİSTER VASITASIYLA YAPILIR.

Şimdi bu registeri biraz inceleyelim.



Bit 7--> GIE : Tüm Kesme işlemlerini iptal etme bit'idir.
0 = Tüm kesmeler geçersiz (DISABLE)
1 = Aktif yapılmış tüm kesmeler geçerli (ENABLE)


Bit 6--> EEIE : EEPROM belleğe yazma işlemini tamamlama bit'i.
0 = Geçersiz (DISABLE)
1 = Geçerli (ENABLE)


Bit 5--> TOIE : TMR0 sayıcı kesmesini aktif yapma bit'i.
0 = Geçersiz (DISABLE)
1 = Geçerli (ENABLE)


Bit 4--> INTE : Harici kesmeyi aktif yapma bit'i.
0 = Geçersiz (DISABLE).Harici kesmeler kabul edilmiyor.
1 = Geçerli (ENABLE). Harici kesmeler kabul ediliyor.

Bit 3--> RBIE : PORTB ( 4. , 5. ,6. , 7. bitleri) değişiklik kesmesini aktif yapma bit'i.
0 = Geçersiz (DISABLE). PORTB'deki değişiklikler kesme oluşturur.
1 = Geçerli (ENABLE). PORTB'deki değişiklikler kesme oluşturur.


Bit 2--> TOIF: TMR0 sayıcısı zaman aşımı kesme biti.
0 = Zaman aşımı yok.
1 = Zaman aşımı var.( h'FF' adresinden h'00' a geçiş. )

Bit 1--> Harici INTF: Harici RB0/INT kesme bit'i.
0 = Harici kesme meydana gelmediğinde.
1 = Harici kesme oluştuğunda.

Bit 0--> RBIF: PORTB değişiklik kesme biti.
0 = RB4~RB7 uçlarında değişiklik yok.
1 = RB4~RB7 uçlarından en azından birinde değişiklik var.

XNHCX

OPTION REGISTER

OPTION Register , RAM belleğin 1. bankındaki h'81' adresinde bulunan özel bir kaydedicidir.




Bu register'a ait özellikler aşağıdaki gibi sıralanmıştır.

1. PORTB 'nin çıkışlarının PULL-UP yapılma durumunu kontrol eder.
2.TMR0 ve/ veya WDT ‘yi seçme bayrağını bulundurur.
3. TMR0 ve WDT adına frekans bölme sayısı için gerekli bitleri bulundurur.
4.INTERRUPT sinyalinin tetikleme kenarını seçer(Düşen kenarda mı? , yükselen kenarda mı? ).
5.Ayrıca yukardaki şekilde de görüldüğü gibi bu register 8-bitliktir.


Yukarıdaki şekilde görülen bitleri tanıyalım.

Bit 0 -- > PS0 ,
Bit 1 -- > PS1, ------->>> FREKANS BÖLME SAYISI ( PRESCALER VALUE )
Bit 2 -- > PS2 ,


Bit 3--> PSA: Frekans bölücü seçme bit'i
0 = Frekans bölme sayısı TMR0 için geçerli
1 = Frekans bölme sayısı WDT için geçerli

Bit 4--> TOSE: TMR0 Sinyal kaynağı kenar seçme bit'i
1 = RA4/TOCKI ucundan düşen kenar  tetiklemesi.
0 = RA4/TOCKI ucundan yükselen kenar tetiklemesi.

Bit 5--> TOCS: TMR0 Sinyal kaynağı seçme bit'i
0 = Dahili komut saykılı seçilir.
1 = Harici dijital sinyal ( RA4/TOCKI ucu ) seçilir.

Bit 6--> INTEDG: Harici RB0 kesme sinyali kenar seçme bit'i
0 = RB0 / INT ucundan düşen kenar tetikleme.
1 = RB0 / INT ucundan yükselen kenar tetikleme seçilir.

Bit 7--> RBPU: PORTB Pull-Up geçerli yapma bit'i
1 = PORTB uçlarındaki Pull-Up'lar iptal edilir.
0 = PORTB uçlarındaki Pull-Up'lar geçerli yapılır.

XNHCX

PRESCALER'İN KULLANILMASI

OPTION Registerin 0. , 1. , 2. bit'leri –ki bu bitlere sırayla PS0 , PS1 , PS2  demiştik- içerisine yerleştirilen 0 ya da 1 digitleri , TMR0 veya WDT'ye  uygulanan sinyali böler.Bunun sayesinde de dolayısıyla  sayma hızları değiştirilebilir.Buraya yerleştirilen 3 bit'lik bu sayı bize  TMR0'a ve WDT'e biririnden farklı 8 çeşit  oran seçme olanağı sunar.

OPTION Registerin 3. biti olan PSA  bit'i  ki – hatılayalım bu bit, Frekans bölücü seçme bit'i  idi.- bu , prescaler sayısının hangi sayıcıya uygulanacağını belirler.

Eğer bu biti 0 seçerseniz  Frekans bölme sayısı TMR0 için geçerli olur.
Eğer bu biti 1 seçerseniz  Frekans bölme sayısı WDT için geçerli olur.

Aşağıda hangi prescaler değerinde  giriş frekansının   kaça bölünceğini  gösteren tablo bulunmaktadır




Bu tabloya göre örneğin ;
Prescaler değeri b'101'seçilirse , TMR0 oranı  1 / 64  ,  WDT oranı  1 / 32 seçililir.
Prescaler değeri b'111'seçilirse , TMR0 oranı  1 / 256  ,  WDT oranı  1 / 128 seçililir.

XNHCX

TMR0 SAYICISININ ÖZELLİKLERİ

Sayıcı içerisindeki sayının bir arttırılması için lazım olan clock bilgisi 2 farklı kaynaktan sağlanabilir.
1. PIC’in içindeki dahili komut saykılı ile
2.Harici digital sinyal yardımıyla.

*** Harici digital sinyal PORTA’nın 3. bit’i olan RA4/TOCKI ucundan uygulanır.

*** TMRO dediğimiz dahili sinyal kaynağını seçmek için OPTION REGISTER’in 5.bit’i olan TOCS flag’ı kullanılır.Ve bu bit 0 olmalıdır.Aşağıdaki bilgiyi hatırlayalım.


Alıntı YapBit 5--> TOCS : TMR0 Sinyal kaynağı seçme bit’i
0 = Dahili komut saykılı seçilir.
1 = Harici dijital sinyal ( RA4/TOCKI ucu ) seçilir.


*** Frekans bölme sayısı WDT ya da TMR0 ‘a OPTION REGISTER’in 3. bit’i olan PSA flağ’ı ile yönlendirilir. “0” seçtiğimizde TMR0 ‘a , “1” seçtiğimizde ise WDT ‘ye yönlendirmiş oluruz. Aşağıdaki bilgiyi hatırlayalım.


Alıntı YapBit 3--> PSA : Frekans bölücü seçme bit’i
0 = Frekans bölme sayısı TMR0 için geçerli
1 = Frekans bölme sayısı WDT için geçerli



*** Bu registerin 0. , 1. ve 2. bitleriyle de 8 farklı sinyal bölme değeri seçebiliyorduk.Bir üst konudaki tabloyu inceleyiniz.



*** Harici dijital sinyal kullanıldığında TMR0 içindeki sayının , gelen sinyalin hangi kenarında (yükselen mi? , düşen mi?) uygulanacağı OPTION REGISTER’in 4. bit’i olan TOSE ile ayarlanır.Aşağıdaki bilgiyi irdeleyiniz.
Buna göre bu flağ’ı “1” seçerseniz RA4/TOCKI ucundan gelen sinyalin her düşen kenarında TMR0 sayıcısı içerisindeki sayı bir artar. “0” seçtiğinizde ise yükselen kenarda …


Alıntı YapBit 4--> TOSE : TMR0 Sinyal kaynağı kenar seçme bit’i
1 = RA4/TOCKI ucundan düşen kenar tetiklemesi.
0 = RA4/TOCKI ucundan yükselen kenar tetiklemesi.


*** TMR0 sayıcısından çıkış sinyalleri aşağıdaki hallerde oluşur.
------------Sayıcının h’FF’ ‘den h’00’’a geçişinde oluşan taşma sinyalinin INTCON REGİSTER’inin 2. bit’i olan TOIF bayrağına “1” yazılması anında,
------------ RAM belleğinin 0. Bank’ında h’01’ adresindeki TMR0 registeri okununca.



Alıntı YapBit 2--> TOIF : TMR0 sayıcısı zaman aşımı bayrağı.
0 = Zaman aşımı yok.
1 = Zaman aşımı var.( h’FF’ adresinden h’00’ a geçiş. )
[/color]

XNHCX

16F84 için Kesme Kaynaklarından Harici Kesmeler

Bu INTERRUPT türünün aktif olabilmesi için OPTION ve INTCON register’lerine ait bayraklarında gerekli değişiklikleri yapmak gerekecektir.Her iki register’in hangi bayraklarında ne gibi değişiklikleri niçin yapmamız gerektiği aşağıda açıklanacaktır.

RB0/INT harici pininden giren sinyal ile kesme oluşturabiliriz.Bunu yapabilmek için bazı şartların yerine getirilmesi gerekir.Evvela bu uç dışardan gelebilecek kesmeyi alabilecek şekilde hazırlanmalıdır.Bunun için 2 şey yapmalıyız:
1) RB0/INT ucunu giriş olarak ayarlamalı ,
2) Daha önce de belirttiğimiz gibi INTCON Registerin 4. bit’i olan INTE (Harici kesmeyi aktif yapma bayrağı ) bayrağı harici kesme işlemi için aktif , geçerli ( yani 1) yapılmalıdır.


Alıntı YapBit 4--> INTE : Harici kesmeyi aktif yapma bayrağı
0 = Geçersiz (DISABLE).Harici kesmeler kabul edilmiyor.
1 = Geçerli (ENABLE). Harici kesmeler kabul ediliyor.


Bir de bu uçtan alınacak sinyalin alçalan kenarda mı yoksa yükselen kenarda mı INTERRUPT oluşturacağına karar vermek gerekir.Bunun için de OPTION Register’de ayarlama yapmamız gerekiyor.
OPTION Register’in 6. bit’i olan INTEDG ( Harici kesme sinyali kenar seçme bit’i ) bayrağı ile bir karara varılır.


Alıntı YapBit 6--> INTEDG : Harici kesme sinyali kenar seçme bit’i
0 = RB0 / INT ucundan düşen kenar tetikleme.
1 = RB0 / INT ucundan yükselen kenar tetikleme seçilir.


Kesme alt programımız çalışıyorken başka bir kesmenin oluşmasını engellemek için , kesme oluşturulduğu zaman harici kesmeler kabul edilmemeli prensibiyle yani INTE -->0 yapılmalıdır.


Alıntı YapBit 4--> INTE : Harici kesmeyi aktif yapma bayrağı
0 = Geçersiz (DISABLE).Harici kesmeler kabul edilmiyor.

Harici kesme oluştuğunda ise INTCON Registerinin 1. bit’i olan INTF bayrağı 1 olur.Bu bayrağı KESME alt programı içerisinde tekrar 0 yapmalıyız.Aksi halde tekrarlanan kesmelerle karşılaşabiliriz.

KISACA şöyle özetleyelim.
Harici bir kesme oluştuğunda ;
• Sonraki kesmeleri iptal için INTE--->0 olsun.
• Kesme alt programı çalışsın.
• INTF ->0 olsun.
• Yeni kesmeleri aktif yapmak için INTE--->1 olsun.

XNHCX

PORTB High Level Change Kesmesi

Daha öncede bahsi geçtiği gibi bu da PIC16F84’deki INTERRUPT çeşitlerinden biridir.PORTB ‘nin üst dört bit’inde meydana gelen herhangi bir değişiklik RBHigh Kesmesini oluşturur. Bu kesme’nin aktif olabilmesi için INTCON register’inin 3.biti olan RBIE biti’inin programın başında “ 1 “yapılması gerekir.


Alıntı YapBit 3--> RBIE : PORTB ( 4. , 5. ,6. , 7. bitleri) değişiklik kesmesini aktif yapma bayrağı
0 = Geçersiz (DISABLE). PORTB’deki değişiklikler kesme oluşturur.
1 = Geçerli (ENABLE). PORTB’deki değişiklikler kesme oluşturur.


PORTB’nin bu bitlerinde oluşan bir değişiklikte ise INTCON register’inin 0. biti olan RBIF ise “1” olur.
Bunun yanısıra Kesme alt programında diğer işlemlerden önce bu flağın sıfırlanması gerekir.



Alıntı YapBit 0--> RBIF : PORTB değişiklik bayrağı.
0 = RB4~RB7 uçlarında değişiklik yok.
1 = RB4~RB7 uçlarından en azından birinde değişiklik var.


Bu interruptun kullanımına bir misal verelim:
PORTB ‘nin üst bitlerine bağlı bir klavyemiz olsun.Bu interrupt'u kullanarak klavye bilgisi okuyacak olalım.Her zamanki gibi programda evvela Portlarımızı tanımlıyor.Sonra da RBHigh interrupt’ını tanımlıyoruz.Eğer klavyemizin herhangi bir tuşuna basılırsa , RBHigh uçlarında bir değişiklik oluşuyor.
Ve INTCON register’inin 0. biti olan RBIF ise “1” oluyor.Program klavye KESME alt programına dallanıyor.Bu kesme alt programında önce RBIF bayrağı resetlenmeli ---hatırlayalım---.Sonra klavye değeri okunur.Sonuç gerekiyorsa , gerekli yerlere gönderilir.KESME alt programından çıkılır.Program normal akışına devam eder

XNHCX

TÜM KESME İŞLEMLERİNİ AKTİF YAPMAK

Tüm kesme işlemlerini aktif yapma bayrağı INTCON register’inin 7. biti olan GIE idi.Bu flag’ı “1” yaparak kesme işlemini aktif yapmış oluruz.

Hatırlayalım:


Alıntı YapBit 7--> GIE : Tüm Kesme işlemlerini iptal etme bayrağıdır.
0 = Tüm kesmeler geçersiz (DISABLE)
1 = Aktif yapılmış tüm kesmeler geçerli (ENABLE)


Bir kesme olayı olduğunda ise bu 7. bit -- > “ 0 ” olur. Bu resetleme işlemi PIC tarafından otomatikman yapılır.Sebebi de KESME alt programının çalışması esnasında yeni bir kesmenin oluşmasını engellemek içindir. KESME alt programı sona erip ana programa dönüldüğü anda ise sonraki KESME’lerin aktif labilmesi için tekrar otmatikman 7. bit “1” yapılır.

XNHCX

KESME GECİKMESİ

  Bir kesme meydana geldiğinde kesme alt programı çalıştırılmadan evvel bir gecikme oluşur.Bu gecikmeye biz “KESME GECİKMESİ” diyoruz.Bu takriben 3 ya da 4 komut saykılı süredir.

XNHCX

KESME ADRESİ

Bir kesme meydana geldiğinde kesme alt programının ilk komutu h’004’ adresine yazılmalıdır.

ORG h’000’ ;-----------------> Ana Program başlangıcı
GOTO BASLA


ORG h’004’ ;-----------------> Kesme alt programı başlangıcı.
ORG INT_ALT_PROG

XNHCX

TMR0 ORANI , bu sayıcıyı seçtiğimizde kaç dahili komut saykılında bir , bir üst sayıya geçişini belirler.Örnek verelim.

TMR0 Oranı 1/4 ise , her 4 komut saykılında bir kez üst sayıya geçiş olur.
TMR0 Oranı 1/128 ise , her 128 komut saykılında bir kez üst sayıya geçiş olur.
----------------------------------------------------------------------------------
WDT ORANI , bu sayıcıyı seçtiğimizde kaç dahili komut saykılında bir , bir üst sayıya geçişini belirler.Örnek verelim.
WDT Oranı 1/2 ise , her 2 komut saykılında bir kez üst sayıya geçiş olur.
WDT Oranı 1/16 ise , her 16 komut saykılında bir kez üst sayıya geçiş olur.


Bu değerler yukardaki PRESCALER’İN KULLANILMASI adlı konu başlığındaki tablodan alındı.

XNHCX

Program belleğine yazdığımız  komutların çalışması için  PIC’e harici bir osilatörden clock sinyali (f osc   ) uygulanması gerekir.
  Bu frekans PIC tarafından 4’e bölünür.Ve  OSC2 / CLK OUT ucundan dışarı verilir.4’e bölünen bu frekansın bir saykılı bir komutun çalışması için geçen süredir.

Örneğin , 20 MHz’lik bir kristal osilatör kullanılan PIC ‘te , dahili komut saykılı (periyodu) süresi şöyle bulunur.


f komut-----> Dahili Komut Saykılı Frekansı
Tkomut ---->  Dahili Komut Saykılı (Periyodu) Süresi

f komut = f osc / 4  =20 MHz / 4 =5 MHz

Tkomut = 1 / f komut =1 / 5 = 0.2 µS


Peki  4 MHz ‘lik  bir osilatör kullansaydık , dahili komut saykılı  süresi ne olurdu?

Bir hesaplayalım:

f komut = f osc / 4  =4 MHz / 4 =1 MHz
Tkomut = 1 / f komut =1 / 1 = 1  ÂµS

XNHCX

TMR0 SAYMA ARALIĞI  SÜRESİ   /  KESME SÜRESİ   HESABI

CLOCK Frekansı bilinen  bir PIC'te  TMR0 sayıcısının kaç µS aralıklarla saydığını hesaplayalım.

Önce bir PRESCALER değeri seçelim. Örneğin Frekans bölme sayısı b'000'olsun.Aşağıdaki tabloya bakın.  



Tablodan da anlaşıldığı üzere  bu prescaler değerin  TMR0 oranı karşılığı 1 / 2 dir.
Bu demektir ki TMR0 sayıcısı  dahili komut saykıl süresinin  2 saykılında 1 kez artıyor


Yine   4 MHz ‘lik  bir osilatör kullandığımızı varsayalım.
Hatırlayalım (Yukarıdaki örnekten) 4 MHz ‘lik  bir osilatör kullanıldığı bir PIC'te dahili komut saykılı  süresi 1  ÂµS idi. TMR0 SAYMA ARALIĞI SÜRESİ  aşağıdaki gibi hesaplanıyor.


TMR0 SAYMA ARALIĞI     SÜRESİ =      Tkomut X TMR0 oranı                              
.............................................= 1  ÂµS x 2 = 2 µS

TMR0 saymaya başladığındaki ilk sayı h'00' ise bu sayı h'FF''ye yani desimal 256'ya  gelince kesme sinyali meydana gelecektir.
Not: TMR0 16f84 de 8 Bitlik sayıcı olduğundan maximum 255'e kadar sayar.Kesme işlemi de TMR0 sayıcısının 255 den tekrar 0'a geçişi esnasında oluşur .Bunları unutmayalım.

KESME GECİKMESİ     =   TMR0 sayma aralığı X 256
............................=  2 µS x 256 = 512 µS  eder.