İpuçları
- 10 yıl önce, Fırat DEVECİ tarafından yazılmıştır.
- 0 Yorum
Bu bölümde özellikle mesleki alanda özellikle mesleki alanda karşılaştığım bazı sorunlar ve bunlara karşı bulduğum küçük ayrıntıları bulabileceksiniz.
Keil Boyut Sorununa Çözüm
Program yazarken özellikle optimizasyon kullanımına ayrıca dikkat edilmeliyse de özellikle boyutsal anlamda sıkıntı yaşanan bazı projelerde kullanılması bir zorunluluk haline gelebilir. Bunun yanında kütüphaneler içerisinde kullanılmayan fonksiyonların da derlenmemesi özellikle boyutsal anlamda projelerimize büyük katkılar sağlar. Keil’da bunun için ise “One ELF Section Per Function” seçeneği açık olmalıdır. Bu konuda özellikle Keil’ın yayınladığı buradaki not okunabilir. Bu seçeneğin açık olan ve olmayan durumdaki örnek boyutsal değişim ise aşağıda görülebilir, resmin üzerine basarak büyütebilirsiniz.
Arduino Özel PWM ve Timer Ayarları
Arduino’yu hızlı işlemler yapmak için kullanan arkadaşlar, özellikle konu yüksek frekanslı PWM ve Timer kesmesi konusunda sorun yaşayabilirler. Arduino IDE’si arka planda Atmega328’in register birimlerine erişebildiğinden kullanıcılar genellikle bunu görmezler ve hazır fonksiyonlarla işlemleri yönetirler. Arduino ile yüksek frekanslı PWM ve Timer işlemleri için de bu registerlara (normal işlemcilere kod yazar gibi) erişmek gerekebilir. Aşağıda 1kHz’lik Timer ve 16kHz’lik PWM ayarları görülebilir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
// PWM 16 bit Timer1 birimi kullanilarak yapilacak // Frekans 16kHz olarak ayarlanacak void PWM_Init(void) { TCCR1B &= ~(1 << CS12); TCCR1B &= ~(1 << CS11); TCCR1B |= (1 << CS10); ICR1=1000; TCCR1B |= (1 << WGM13); // Timer B clear bit 4 TCCR1B |= (1 << WGM12); // set bit 3 TCCR1A |= (1 << WGM11); // Timer A set bit 1 TCCR1A &= ~(1 << WGM10); // set bit 0 pinMode(9, OUTPUT); analogWrite(9, 0); } // (16.000.000Hz/64)/250=1000Hz void Timer0_Init(void) { TCCR0A = 0; // Basta ayarlar sifirlaniyor TCCR0B = 0; // Basta ayarlar sifirlaniyor TCNT0 = 0; // Basta ayarlar sifirlaniyor OCR0A = 250; // 1kHz'lik sinyal icin timer degeri TCCR0A |= (1 << WGM01); TCCR0B |= (1 << CS01) | (1 << CS00); // On bolucu 1:64 TIMSK0 |= (1 << OCIE0A); // Timer compare interrupt'ı aciliyor } // Timer0 kesmesi bu kisima geliyor, kesme frekansi 1kHz ISR(TIMER0_COMPA_vect) { // Timer kesmesi kodu buraya yazilmali } |
PIC12F683 ve Türevleri İçin 8MHz İç Kristal Ayarı
Microchip’in mikrodenetleyicileri yani PIC serisi şu an için fiyat/performans anlamında çok gerilerde olsa da geçmişten gelen bir çok alışkanlık ve bulunabilirlik nedeniyle özellikle Türkiye’de hâlâ bir çok kişi tarafından kullanılmakta ve tercih edilmektedir. Özellikle fuse ayarlarındaki yanlışlıklar bir çok kullanıcı için zaman kaybı oluşturabilir. Bu anlamda aşağıdaki kod PIC12F683 için 8MHz içsel kritalin kullanılmasını sağlamaktadır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
// CONFIG #pragma config FOSC = INTOSCIO // Oscillator Selection bits (INTOSCIO oscillator: I/O function on RA4/OSC2/CLKOUT pin, I/O function on RA5/OSC1/CLKIN) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled) #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config MCLRE = OFF // MCLR Pin Function Select bit (MCLR pin function is digital input, MCLR internally tied to VDD) #pragma config CP = ON // Code Protection bit (Program memory code protection is enabled) #pragma config CPD = OFF // Data Code Protection bit (Data memory code protection is enabled) #pragma config BOREN = OFF // Brown Out Detect (BOR disabled) #pragma config IESO = OFF // Internal External Switchover bit (Internal External Switchover mode is disabled) #pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is disabled) int main(void) { OSCCONbits.IRCF =0b111; OSCCONbits.SCS =1; while(OSCCONbits.OSTS); for(;;); } |
STM32 İçin ReadOut Protection (Okuma Koruması)
Yaptığımız uygulamalarımızın bir çoğunda devrelerimiz yalın olduğundan, kopyalamak da kötü niyetli kişiler için oldukça kolay hale gelmiştir. Donanımdan ziyade yazılım üzerine çalışan çoğu kişi için ham koddan ziyade çalışan uygulamanın kodunu korumak önemlidir. Bunun için denetleyicilerin çoğunda işlemci hafızasının okunmasını engelleyen özellikler bulunmaktadır. Aşağıda STM32 işlemciler için okuma korumasını aktif hale getirme fonksiyonunu bulabilirsiniz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#define READ_PROTECT 1 // 1: Read Protect Active, 0: Read Protect Deactive void ReadOutProtection(void) { #if READ_PROTECT == 1 if (FLASH_OB_GetRDP() == RESET) { FLASH_Unlock(); FLASH_OB_Unlock(); FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPERR); FLASH_OB_RDPConfig(OB_RDP_Level_1); FLASH_OB_Launch(); FLASH_OB_Lock(); FLASH_Lock(); } #endif } |
dsPIC Serilerinde (long/int) Hızlı Bölme
dsPIC işlemciler günümüzde bir çok alanda sıklıkla kullanılmaya devam etmektedir. Yeni işlemciler yanında performans anlamında geri kalsa da gelişmiş PWM/ADC bloğu hâlâ çoğu işlemciyi geride bırakır. dsPIC’de en büyük promlemlerden biri long/int (32bit/16bit) bölümleridir. Bu konuda kullanıcılar bir çok problem yaşamış bazıları ise ASM kodları ile hız kazandırmış. XC16 ile birlikte Microchip buna çözüm olarak “Math.h” kütühanesine eklediği “__udiv3216(unsigned long, unsigned int)” ve “__div3216(long, int)” komutlarının bu iş için özelleştiği unutulmamalıdır.
Eagle Gerber Oluşturma Aşamaları
Elektronik devre çizimi ile ilgilenen arkadaşların yakından bileceği Eagle güncellenen versiyonları ile birlikte oldukça fazla özelliğe sahip oldu. Çizilen bir PCB’nin, üretime aktarılabilmesi için Gerber adı verilen ve ilgili makinelerin kullanacağı dosyalar gereklidir. Eagle kullanarak bu dosyaları hızlı bir şekilde aşağıdaki sırayla elde etmek mümkündür:
1) “run drillcfg” komutu kullanılarak projede kullanılan deliklerin mm ya da inc şeklinde karşılıkları .drl uzantısı ile karşımıza gelir.
2) Excellon üretim standardı için ise CAM Processor bölümüne tıklayıp; File/Open/Job sekmeleri takip edilerek “excellon.cam” işi çağrılır ve “Process Job” butonuyla ilgili “.drd” ve “.dri ” uzantılı dosyalar oluşturulur.
3) Son olarak komponent yerleşimleri için eğer tek katlı bir çizim oluşturduysanız “Gerber_RS274x.cam“, çift ya da üstü tasarım ile çizim oluşturduysanız “gerb274x-4layer.cam” işini çağırıp, işletmek gerekmektedir. bu işlem sonucunda tek katlı çizim için “.gpi“, “.cmp“, “.sol“,”.plc“, “.stc“, “.sts” uzantılı, çift ve üstü katlı çizim için ise “.gpi“, “.cmp“, “.sol“,”.plc“, “.stc“, “.sts“,”.pls“,”.l15“, “.ly2“, “.crc” uzantılı dosyalar oluşacaktır.
Oluşan gerber çıktılarını, uygun gerber izleme programları ile görmek ve kontrol etmek mümkündür. Bunun için önerim kullanımı ücretsiz olan “Gerberlogix” programını kullanmanız yönünde olacaktır.