Direnç deyince akla bir tek resistans değeri mi gelir, genellikle öyle, biraz ilerlesek tölerans gelir, direncin değerinin yüzde kaç aşağı yukarı eksik fazla olacağı bilgisidir.
Direnç Parametreleri
Usb Devre Tasarımı - Part I - Usb Giriş koruma devreleri
Mikrodenetleyici içeren bir devre tasarladık, mikrodenetleyicimizin güncellemelerini yüklemek için devremize bir port 'pin header group' bırakarak, programlanmasını sağlayabiliriz, ama bu aynı zamanda devre kapalı bir kutu içerisinde olacaksa, her defasında sökmeye ve toplamaya ihtiyaç duyulacağı anlamına gelir. Programlayıcımızı da devreye dahil edip bir USB port aracılığıyla bunu yapsak daha makul olur gibi. Bunun için USB to TTL ailesinden bir devre sisteme dahil edilebilir.
İlk adımda, bir devrede USB protokolü kullanılacaksa, gerekli koşullar nelerdir diye bir bakalım o vakit.
USB tip B ("USB Series B Receptacle" diye geçer) PN61729 konnektör kullandığımızı düşünerek senaryomuzda ilerliyelim. Konnektörün dış kasasındaki metal "Shield" ismini alıyor, diğer 4 pinler ise sırasıyla, resme bakarak üst soldaki 1- 5V (Vbus), 2 sağındaki D- (DM diye de geçer) alt soldaki 3, D+ (DP) sağındaki 4, Ground olarak belirlenmiş.
İncelediğim uygulama notların tamamında benim gördüğüm koruma önlemleri başlıca şöyle
- Aşırı akım koruması (Usb bus üzerinden beslenen cihazlar için mutlaka) - tasarladığımız cihaz tarafında olası bir kısadevre veya bozulmadan dolayı host cihazı korumak amacıyla, ancak bazı cihazlar ilk bağlandıklarında yüksek akımlar çekebilmektedir, bu normal bir hal olmakla birlikte tasarlanacak aşırı akım korumasının, buna müsade edebilmesi de gerekir, 100µs gibi diyebiliriz.
- Aşırı voltaj koruması, host tarafından kaynaklanan bir sıkıntıdan dolayı Vbus hattına gelebilecek olan yüksek voltaj, aslında özellikle cihazların, - usb yapısal olarak canlı,çalışan sistemler üzerinde sökülüp takılma yeteneğine sahip olasından sebeple - sökülüp takılırken neden olabileceği spike dediğimiz anlık voltaj yükselmelerine karşı da koruma sağlanmalıdır.
- ESD, ElectroStaticDiscarge, koruması için de özellikle tüm uygulama notlarına yer verilmiş, kablo soyulmaları ya da açıkta pin olması gibi durumlarda ya da kullanıcının kasıtlı olarak pinlere dokunması sonucu host ya da cihaz tarafında sorunlara sebebiyet verebilir, biraz daha anlamak için mevzuyu :ESD testlerinde kullanılan model olan Human Body Model'e kısa bi bakalım: 100pf kondansatör 1500 ohm discharge direnci üzerinden 2kV, 4kV, 6kV,8kV gibi yüksek voltajlarla şarj edilmiş olarak boşaltılır, bu şu demek, insan kendi üzerinden bir elektronik sisteme 100pf lık bir kondansatörün 1,5K bir direnç üzerinden 2kV - 8kV arası voltajlar boşaltabilmektedir.(*1) dolayısıyla bu leveldeki bir durum göz ardı edilmemelidir.
- Bir de son olarak eğer ki cihazımız sadece usb üzerinden beslenmeyecekse, yani dışardan bir güç kaynağı ile usb bağlamadan da çalışacaksa (ki senaryomuz usb bağlantısını sadece firmware güncellemek üzere düşünülmüş) güç kaynağı seçici tasarlamak gerekiyor, şöyle ki, hem usb hem de dış güç kaynağı bağlıyken bu kaynaklar birbirini besleme girişiminde bulunmasın.
Aşırı Akım Koruması, için PTC, Polymer Temperature Coefficient, (PTC dirençle tam olarak aynı şey değildir.-genelde resetlenebilir sigorta diye anılır, resettable fuse) uygun bir elemandır. Cihazdan geçen akım bir nominal sınırı aştığında, polimer tabaka ısınmaya başlayacak ve katı halden sıvı hale dönecek ve bu şekilde genişleyecektir. Genleşme, polimerin içindeki iletken katmanların kırılmaya başlamasına ve böylece elemanın düşük direnç durumundan yüksek direnç durumuna geçmesine neden olur. Sonuç olarak, elemandan geçen akım akışı önemli ölçüde düşer. Arıza onarıldıktan ve akım akışı normale döndüğünde, polimer soğur ve büzülür, iletken zincirler birbiriyle tekrar temas ettikçe düşük direnç durumuna geri döner.
Peki hangi PTC? önemli parametrelerimiz:
- Holding Current: "Tutma akımı" : nominal dediğimiz değer, bu değere kadar herşey normal seyrinde devam eder, usb VBUS hattı için bu akım USB specification içeriğinde 500mA max olarak belirlenmiştir.
- Trip Current : "Anlık Maksimum izin verilen akım" : cihazlar ilk bağlandığında anlık yüksek akım çekebilir ve buna izin vermeliyiz dediğimiz akım. 1A gibi uygun mudur?
- Time-Trip de bu akıma müsade edilecek zaman zarfı, bu sürenin üzerindeki bir trip current e maruz kalırsa korumaya geçer , devrenin tamamını burdan beslemeyeceğiz sadece USB to TTL dönüştürücü entegremiz ve çevre birimleri için 0.15s gibi maksimum değer fazlasıyla yeterli olacaktır.
- Ek olarak Voltage değerinin 5v üzerinde olduğundan emin olalım, minimum ve maksimum resiztansın da mümkün oldukça düşük olması işimize gelir, üzerindeki voltaj düşümünün az olacağını düşünürsek.
Şöyle Bir kaç örnek bırakabiliriz: Ozdisan'dan
Aşırı Gerilim Koruması, için MultiLayer varistorler uygun olabilir.Varistörün direnci, terminalleri boyunca gelişen yüksek voltaj durumunda önemli ölçüde düşer. Sonuç olarak, yük, güç rayından "Power Rail" veya sinyal hattından toprağa yönlendirilir ve gerilimi çok daha düşük bir seviyeye sıkıştırarak aşağı akım devresini korur. Yarı iletken seramiklerden yapılan MLA serisi varistörler, geniş bir sıcaklık aralığında çalışır ve seramik kondansatörünkine benzeyen küçük bir pakette - genellikle plastik ambalajlı bileşenlerden çok daha küçük bir alan kaplar - iyi bir aşırı gerilim koruması sağlar.
Usb Shield "Konnektörün kasasındaki metal" ile GND arasına ve yine USB shield ile VBus arasına bağlanır, bazı devrelerde ESD koruması için D+ ve D- hatlarına bağlandıklarını da gördüm, ancak varistörlerin kapasitansı göreceli olarak (TVS diyotlara göre) daha yüksektir. (tipik olarak 600-700pF) ground ve Vbus hatları -dc olmalarından dolayı ek kapasitans kullanışlı bile olabilir, ancak data hatlarında yüksek veri transferinde kapasitans gecikmelere sebep olur.
5V luk bir varistor kullanılabilir : CG0603MLC-05E
ElectroStaticDischarge, için MLV :MultiLayerVaristor de kullanılabilir, ki dediğim gibi data hattı üzerinde distorsiyona ve gecikmelere sebep olur, USB 1.1 ve üzeri için TVS diyot kullanılması genellikle önerilmiş. Kapasitansları oldukça düşük: 0.05pF seviyelerinde dolayısıyla distorsiyon ya da gecikmelere asla sebep olmuyor. Data hatları ile USB Shield arasına bağlıyoruz iki adet. D- den Usb Shielde bir adet, D+ dan usb shield e bir adet. 5.5v luk TVS (Transient Voltage Suppressor) diyotlar kullanılabilir, 5.5v tercih edildiğinde, usb için tasarlanmış 2 li 4 lü paketlerde bulmak mümkün, Vbus için kulanılan MLV yerine boşta kalan bir TVS de kullanışlı.
Atmega328p Benzersiz Seri Numarası, Kod koruma
Arduino UNO üzerinde bulunan mikrodenetleyici : atmega328p-u kullanarak bir kod yazdık, derledik, bir hex dosyamız var, yazdığımız kodun, sadece "herhangi bir" atmega328p-u üzerinde çalışmasını istiyoruz, yani farklı bir mikrodenetleyiciyede çalışmasın, ya da "sadece" tek bir atmega328p-u üzerinde çalışsın istiyoruz, bir nevi kod koruma gibi, bir şekilde yazılı olan mikrodenetleyici üzerindeki kod okutularak başka bir mikrodenetleyiciye kopyalandığında çalışmasın istiyoruz.
İlk seçenek sadece kod uyumluluğunu denetlemek için kullanılabilir, hex kodu alınıp örnek olsun diye Atmega2560 a yüklendiğinde "uyumsuz olacağı düşünülerek" çalışması engellenebilir.
İkinci seçenekse, farklı bir atmega328p-u ya da atılmış olsa çalışmasın, burada kod korumadan söz edebiliriz. Peki bunu sağlamak için ne yapabiliriz? Örnek olsun diye atmega328p nin kendine özgü, her mikrodenetleyici için "benzersiz" bir seri numarası olsa, yine örnek olsun diye bu seri numarası 6F 75 57 37 37 57 FF 25 98 olsa, ve kodumuzun en başında desek ki, mikrodenetleyicinin seri numarasını oku, bizim bildiğimiz seri numarası ile karşılaştır doğru değilse sonsuz bir döngüye gir, dolayısıyla kodun geri kalanı hiç çalışmasın. Uygun bir çözüm gibi, peki atmega328p-u bize böyle bir olanak sağlıyor mu? Datasheet e bir göz atalım:
31.5 Serial Number The product has a serial number which offers a unique ID to identify a specified part while it is in the field. It consists of several bytes, which can be accessed from the signature address space. The Signature row includes factory-programmed data:
- ID for each device type
- Serial number for each device
- Calibration bytes for factory calibrated peripherals
burda bahsettiğine göre böyle bir imkan var, ancak nedir nerden buluruz nasıl okuruz gibi bir bilgi malesef yok.Ancak bu bilgiye aynı ailenin farklı bir ferdi olan atmega328pb için yayınlanan datasheet üzerinde rastlıyoruz.
Table 31.5 Signature Row Adressing
Siganure Byte | Z-Pointer |
Device Signature Byte 1 | 0x0000 |
Device Signarure Byte 2 | 0x0002 |
Device Signature Byte 3 | 0x0004 |
Rc Oscillator Calibration Byte | 0x0001 |
Serial Number Byte 1 | 0x000E |
Serial Number Byte 0 | 0x000F |
Serial Number Byte 3 | 0x0010 |
Serial Number Byte 2 | 0x0011 |
Serial Number Byte 5 | 0x0012 |
Serial Number Byte 4 | 0x0013 |
Serial Number Byte 6 | 0x0015 |
Serial Number Byte 7 | 0x0016 |
Serial Number Byte 8 | 0x0017 |
Şair burada ne anlatmak istemiş? ID for each device type ile kasıt mikrodenetleyicinin imzası yani kim olduğu bilgisi: Device Signature Byte ile verilmiş, Serial Number ise "biraz karışık olmakla birlikte" 9 ayrı adres üzerinde 8 bitlik veriler olacak şekilde; Serial Number Byte 0 ile Serial Number Byte 8 olarak kodlanmış.
Nasıl ulaşacağız bu bilgilere ? Bu noktada boot.h yardımıza koşuyor ve bize
boot_signature_byte_get(addr) gibi bir fonksiyon sunuyor.
boot.h main.cpp ye include edilip kullanılabilir, ;Atmel Studio için örnek kod:
#ifndef F_CPU
#define F_CPU 16000000UL
#endif
#include <avr/boot.h>
char devSignature[3];
char devSerial[9];
void getDevSignature(char* devsign)
{
for (size_t i = 0; i<3; i++)
{
devsign[i] = boot_signature_byte_get(i*2);
}
}
void getDevSerial(char* devSerial)
{
uint8_t add = 0;
for (size_t i = 0; i<9; i++)
{
if(i>=6)add=1;
devSerial[i+add] = boot_signature_byte_get(0x0E + i + add);
}
char tmp = devSerial[0];
devSerial[0]=devSerial[1];
devSerial[1]=tmp;
tmp = devSerial[2];
devSerial[2] = devSerial[3];
devSerial[3] = tmp;
tmp = devSerial[4];
devSerial[4] = devSerial[5];
devSerial[5] = tmp;
}
int main(void)
{
getDevSignature(devSignature);// Device Signature -hangi mikrodenetleyici
getDevSerial(devSerial); // Serial Number - seri numarası
}
Arduino IDE için örnek kod:
char devSerial[9];
#include <avr/boot.h>
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
Serial.println("Device Signature : ");
for (uint8_t i = 0; i < 3; i++)
{
Serial.print(boot_signature_byte_get(0x0 + i*2),HEX);
Serial.print(" ");
}
Serial.println("");
getDevSerial(devSerial);
Serial.println("Device Serial Number : ");
for (uint8_t i = 0; i < 9; i++)
{
Serial.print(devSerial[i],HEX);Serial.print(" ");
}
}
void loop() {
// put your main code here, to run repeatedly:
}
void getDevSerial(char* devSerial)
{
uint8_t add = 0;
for (size_t i = 0; i<9; i++)
{
if(i>=6)add=1;
devSerial[i+add] = boot_signature_byte_get(0x0E + i + add);
}
char tmp = devSerial[0];
devSerial[0]=devSerial[1];
devSerial[1]=tmp;
tmp = devSerial[2];
devSerial[2] = devSerial[3];
devSerial[3] = tmp;
tmp = devSerial[4];
devSerial[4] = devSerial[5];
devSerial[5] = tmp;
}
Elimdeki 3 değişik atmega328p ile denedim her birinde farklı seri numaraları elde ettim, bir eşleşme olacağını düşünmüyorum, deneyenler yorumlara yazabilir.
-Kolay gelsin.
Arduino UNO, Atmel Studio üzerinden programlamak | AVR Programlama - Registers
Arduino üzerinde bazı şeyleri öğrendik, hazır kütüphaneler üzerinde projelerimizi çalıştırdık, ama sanki IDE üzerinde eksik bişey var gibi, mesela bir IntelliSense olaydı ne güzel olmaz mıydı? hani şu değişken adını yazmaya başladığımızda tamamlama önerileri çıkartan, ya da nesne tabanlı programlamada kullandığımız; nesne. yazınca nesnenin tüm özelliklerine ulaşabildiğimiz yardımcı pencere açan.. bunun için Arduino yu bir adım ileriye taşıyan Atmelin kendi kodlayıcısı Atmel Studio (artık yerini MicroChip Studio alıyor) mevcut, Visual Studio kullananların hemen alışacağı (neredeyse aynısı) bir kodlama arayüzü, kod yazmak için biraz datasheet karıştırmak gerekiyor. Ancak kontrolün sizde olduğunu bilmek bir ayrıcalık, Arduino IDE ile yazılmış bir led yakın söndürme kodu :
void setup() {
// initialize digital pin LED_BUILTIN as an output.
pinMode(LED_BUILTIN, OUTPUT);
}
// the loop function runs over and over again forever
void loop() {
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
avrdude: 924 bytes of flash written,
924 bytes yer kaplarken, aynı işi yapan Atmel Studio ile register seviyesinde yazılmış olan şu kod :
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
DDRB |= (1 << DDB5);
while (1)
{
PORTB |= (1<<PORTB5);
_delay_ms(1000);
PORTB = 0;
_delay_ms(1000);
}
}
avrdude.exe: writing flash (176 bytes):
sadece 176 bytes yer kaplıyor, yaklaşık 5.25 katı, 176 bytes ile yapılabilecek işi 924 bytes ile yapmak, nerden baksak bir mühendisin fiyat/performans tarzına uymuyor.
Peki konu sadece kodun hafızada kapladığı alan mı acaba? Hıza da bakalım mı ?
void setup() { pinMode(3,OUTPUT); } void loop() { digitalWrite(3,HIGH); digitalWrite(3,LOW); }
yukarıda gördüğünüz Arduino ide de yazılmış bir kod sizce hangi frekanslarda 3 pini açıp kapatabiliyordur?
112 Khz mi? Hey dostum tek yapabildiğin bu mu? hadi onu geçtim, 1ms lik aralıklarla yaptığın gecikmeler de neyin nesi ?
Studio 'ya ve register level 'e geçelim :
#include <avr/io.h>
int main(void)
{
DDRD |= (1<<DDD3);
/* Replace with your application code */
while (1)
{
PORTD = 8;
PORTD = 0;
}
}
Evet şimdi konuşmaya başladın : 3.2 Mhz :) 27.8 kat daha hızlı ve alt tarafta görebileceğiniz üzere 1ms lik gecikemeler de artık YOK.
Tamam, kararımızı verdik, kodumuzu yazdık, başka hiçbir ek donanım gereksinimi olmadan kodumuzu nasıl Arduino UNO kartımıza yükleyeceğiz?
Atmel Studio, Atmel ICE, Arduino UNO Hata Ayıklama
Tekrar Deniyoruz, Debug menüsünden Start debugging and break e tıklıyorum,:
Türksat Saat Kanalı ve IRIG-B Time Code
Türksat Saat Kanalından Saat Bilgisi Nasıl Alınır? Uyduda kanalları dolaşırken, şu Türksat Saat kanalı hep dikkatimi çekmiştir. Özellikle S...

-
Bu yazıda, Arduino ile ssd1306 oled ekranın SSD1306TUR kütüphanesiyle kullanımına ve tüm fonksiyonlarına bakıyor olacağız. Arduino demişke...
-
Bu yazımızda Arduino UNO 'nun güç bölümünü inceliyoruz. Bu hemen hemen aynı yapıda olan arduino kartları için benzer özellikler gö...
-
Arduino güç özellikleri konusunda detaylıca anlattığımız üzere, Arduino UNO için konuşuyorsak; mikro denetleyicimizin anlamlandırab...
-
Arduino ile 5v 'tan daha yüksek bir voltajı ölçmek için ; ya da herhangi bir mikro denetleyici için analog referans değerinin üzeri...
-
Birçok projede hem ucuz olması hem de kolay bulunması bakımından 16x2 LCD ekranları kullanıyoruz. Bu yazımızda Arduino ile LCD Ekran Kulla...
-
DMD2TUR P10 Panel Türkçe Karakter Kullanımı Arduino P10 panel kullanımında yardımımıza koşan DMD2 kütüphanesi ve içerisindeki fontlar Türkç...
-
Arduino ile ADC ölçümlerinde hep 5V kullanıldığı dikkatinizi çekmiştir. İşin aslı AVR 'nin bize sunduğu analog reference voltage de...
-
16 Şubat 2022 tarihinde yayınladığım yazımda P10 led panel devre incelemesi 'ni konu almıştım. O yazının sonuna eklediğim video ( ...
-
LiquidCrystalTUR kütüphanesi nihayetinde hazır, biraz uğraştırdığını söyleyebilirim ancak neticeye de ulaşmış bulunmaktayım. Arduino '...
-
DHT11 & Arduino UNO DHT 11 içerisinde NTC (Negative Temprature Coefficient) direnç ve nem sensörü bulunduran data kağıdında ...