STM32F407 Cortex M4 şamataları

Başlatan bunalmis, 16 Ekim 2011, 17:14:50

Valiant2023

Alıntı yapılan: Klein - 12 Şubat 2012, 19:30:28
main.c içindeki  #include "delay.c" ve #include"hd44780.c" satırlarını  #include "delay.h"  ve  #include"hd44780.h" olarak değiştir

hd44780.c içerisine
#include "stm32f4xx.h"
#include "delay.h"

satırlarını ekle
teşekkurler oldu. cok sagolun derleyebıldım

fryrmnd

hocam derleyici hd44780 deki fonksiyon prottiplerini görünce main dosyada hd44780.c yi include etmesek bile hd44780.h dan bulurmu. nedir bunun püf noktası

Klein

#857
Yok doğrudan bulamaz.  Bu işin iki yolu var.

ya kaynak dosyayı doğrudan include edeceksiniz #include"xxx.c"  gibi.  Ama bu durumda ilgili koda ait header dosya varsa onu include etmeyeceksiniz.

ya da
kaynak kodu project managerden dprojeye dahil edecek  , dosyanıza da *.h dosyasını include edeceksiniz.


fryrmnd

bazı microchip application library demolarında sanki aynı isimli dosyaların hem header hem de c kaynak dosyası eklenmiş. o yüzden sormuştum. headerı da eklemenin sakıncası varmıdır. bunların mantığı tam olarak nedir. derleyici çalışmasını mı bilmek gerekiyor.

Klein

bir dosyayı #include  yöntemiyle eklemek ile projeye eklemek arasında şöyle bir fark var. include edilen dosyalar doğrudan dosyaya bağlanır,
derleme esnasında iki dosya tek dosyaymış gibi birleştirilerek derlenir.  projeye eklediğinizde ise, her iki dosya da ayrı ayrı derlenir ve link esnasında birbirine bağlanır.

Hem kaynak kodu hem de header dosyayı include edebilirsiniz.  Az dosya ile çalışıyorsanız pek sorun olmaz. Ama çok dosya ile çalışıyorsanız, aynı header dosyasını birden fazla kaynak kod kullanıyorsa bazı sorunlar çıkabilir. eğer header dosyanın içinde çift tanımlamayı engelleycek kod yoksa , isim çakışması hatası alırsınız. 
şöyle örnekleyeyim :

main.c
#include"display.h"
#include"display.c"

display.c
#include"display.h"

bu şekilde tanımlı main.c'yi derlediğinizde dosyalar tek dosya gibi birleştirileceği için aşağıdaki gibi bir durum ortaya çıkar

display.h tanımları
..
..

display.h tanımları
...
..

display.c tanımları
..
..

main.c tanımları
..
..

Görüldüğü gibi , display.h içeriği dosaya iki kez eklendi. Doğal olarak  da derleyici hata verdi.
Tabi bu durumu engellemenin çeşitli yolları var.  display.c içindeki include satırını kaldırabilirsiniz., display.h içerisine çift tanımları engelleyecek kilit atabilirsiniz.  Ama çok fazla dosya ile çalışıyorsanız , o zaman organişze olmak çok zorlaşır. hangi dosyanın hangisinden önce veya sonra include edileceği gibi bir çok sorunla boğuşursunuz.

Bu sebeple  sadece fonksiyon protatiplerini içeren dosyayı include edip, kaynak kodu link esnasında bağlamak daha kolay organize olmanızı sağlar.

f15eagle

#860
merhaba

önceki mesajlarda geçen Lcd örneğini denemek istedim fakat lcd ekranda görüntü oluşturamadım. Lcd nin datasheetine baktığımda hd44780dan farklı bir kontrol IC vardı. Bu önemli bir farkmıdır yoksa ben başka bir hata mı yapıyorumdur ? Eğer önemli ise diğer ICleri olan Lcd ekranları nasıl kullanabiliriz ?
mesela elimde bu lcdden var
http://www.azdisplays.com/PDF/acm1602k.pdf     Controller IC SPLC780D
kütüphane yazmayı hiç bilmiyorum bu konuda nasıl ilerlememiz gerekir bilgili arkadaşlar yardımcı olabilirseniz sevinirim

fryrmnd

@Klein hocam, şuan neyi nerde include ettiğimi karıştıracak kadar program yazma kabiliyetim yok ama cevabınız için sağolun. microchipin bazı demolarını uyarlayıp kullanıyorum. gözüm hep neyi nerde include etmiş hangi kaynak dosyalar hangi headerları include etmiş onlara gidiyordu. cevaplarınız iyi oldu.

@f15eagle, displayin ıc si farkeder diye düşünüyorum. ben de lcd için kütüphane yazmadım ama hd44780 i kullanmak için lcd ye sırayla gönderilen komutların benzerlerini elinizdeki lc nin ıc si için uyarlamanız lazım. fxdev hocanın hitech örneklerinde hd44780 için sırasıyla yapılması gerekenler var. sanırım yardımcı olur.

MC_Skywalker

Piyasada üretilen birçok  karakter LCD çipi HD44780 komutlarını kabul eder.

Genellikle birebir uyumlu olurlar fakat bazılarında biryerleri set etmek gereke biliri. (pcb üzerinde bir jumper ve ya yazılımsal)
LCD panelinizde kullanılan çipin dökümanınına bakmanızda fayda var.


sfaunl

#863
EXTI uzerinde calisiyordum da, asagidaki program PA0'dan interrupt uretebiliyor ama PB2'den uretmeyi beceremedim.  Nerede hata yapiyorum? ???
Ekleme: Simdi baktim da PB2 yerine PA2 den interrupt aliyor. Demek ki EXTI line 2 yi secebilmisim.
SYSCFG->EXTICR[0] &=~0x00000100; Sorun buyuk ihtimalle bu satirda ama ne yaptiysam GPIO'larin 0. pinlerinden baska bir pinde interrupt olusturamadim. 
   
void SystemInit() {
....
....
....
GPIOA->MODER&=~0x00000003;   	    //	PA0 giris olarak ayarlandi
    GPIOB->MODER&=~0x00000030;   	    //	PB2 giris olarak ayarlandi
    SYSCFG->EXTICR[0] &=~0x00000100; 	//  EXTI0'da PA0 EXTI2'de PB2 interrupt kaynagi olarak secildi. 
										//  (F=0000=PAx , E=0001=PBx)
										//	(x secilen line numarasi, bu durumda PA icin 0, PB icin 2)
										//	(manual sayfa 156)
    EXTI->RTSR=0;            			//  Yukselen kenar olmasin 
    EXTI->FTSR=5;            			//  Dusen kenar isteniyor       
    EXTI->IMR=5;             			//  Kanal 0 ve 2 nin interrupt maski secildi.    
    NVIC->ISER[0] = 0x40;    			//  EXTI Line0 interrupt aktif
    NVIC->ISER[0] = 0x100;    			//  EXTI Line2 interrupt aktif 
	} 

void EXTI0_IRQHandler(void)
{			
	EXTI->PR|=0x00000001; 
  }
void EXTI2_IRQHandler(void)
{					 
	EXTI->PR|=0x00000004; 
  }

Klein

SYSCFG->EXTICR[0] &=~0x00000100; EXTICR[0]  8. biti sıfırlamışsın ama hiç bir yerde set etmemişsin. Bu yüzden Hep portA'dan interrupt alman normal. SYSCFG->EXTICR[0] |= 0x00000100; şeklibde yazarsan ilgili biti set edersin. 

Ayrıca
    NVIC->ISER[0] = 0x40;             //  EXTI Line0 interrupt aktif
    NVIC->ISER[0] = 0x100;             //  EXTI Line2 interrupt aktif

Satırlarınında da anlamsız bir durum var. Önce 6. biti set ediyorsun , alttaki satırda 6. biti reset edip 8. biti set ediyorsun.
Sanırım gözden kaçırdın.  Eğer ikisini de set emek istiyorsan aşağıdaki gibi yapabilirsin.

    NVIC->ISER[0] |= 0x40;             //  EXTI Line0 interrupt aktif
    NVIC->ISER[0] |= 0x100;             //  EXTI Line2 interrupt aktif

sfaunl

#865
Alıntı yapılan: Klein - 15 Şubat 2012, 21:28:36
SYSCFG->EXTICR[0] &=~0x00000100; EXTICR[0]  8. biti sıfırlamışsın ama hiç bir yerde set etmemişsin. Bu yüzden Hep portA'dan interrupt alman normal. SYSCFG->EXTICR[0] |= 0x00000100; şeklibde yazarsan ilgili biti set edersin. 

Ayrıca
    NVIC->ISER[0] = 0x40;             //  EXTI Line0 interrupt aktif
    NVIC->ISER[0] = 0x100;             //  EXTI Line2 interrupt aktif

Satırlarınında da anlamsız bir durum var. Önce 6. biti set ediyorsun , alttaki satırda 6. biti reset edip 8. biti set ediyorsun.
Sanırım gözden kaçırdın.  Eğer ikisini de set emek istiyorsan aşağıdaki gibi yapabilirsin.

    NVIC->ISER[0] |= 0x40;             //  EXTI Line0 interrupt aktif
    NVIC->ISER[0] |= 0x100;             //  EXTI Line2 interrupt aktif
Kodu duzenlerken dalginliktan buraya yanlis haldeyken yazmisim. Denedigim kodda SYSCFG->EXTICR[0] |= 0x00000100; seklindeydi zaten. Ama calismadi.

Burada EXTI2'yi 0001 EXTI0'i da 0000 yapmam lazim.
Reset halinde hepsi zaten 0 olduguna gore SYSCFG->EXTICR[0] |= 0x00000100; satirinin istedigim seyi veriyor olmasi lazim. Ama olmuyor.
PA2den interrupt aldigima gore 8. bit setlenmiyor demektir. Oyle degil mi?

Klein

#866
Pinden interrupt üretmek için  pini input olarak değil , alternatif fonksiyon tanımlayıp , alternatif fonksiyonunu da eventout yapmak gerekliydi diye  hatırlıyorum.


Yanlış hatırlıyormuşum.

z

Bu renklendirme isi cok bas yakacak. Daha once de defalarca karakterleri yuttu. Gereksiz yazismalara neden oldu.

Renkli gosterim cokmu lazim? Yada bu renklendirmenin daha duzgun calisani yokmu? mcu-turkey sitesindeki renklendirmede sorun yok gibi.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

@sfounl

Ornek programlarda verdigim A0 pininden int ureten yazilimda da bir hata varmis. Fakat bu hataya ragmen kod calisiyormus.
B2 pininden int urettiremedigini yazdiginda bende ugrastim ve gercekten B2 den int uretilemedigini gordum.

Sorun SYSCFG registerinin clogunu acmamamizdan kaynaklaniyormus. Ornek programlara calisan bir ornek ekledim. System init rutininde de
SYSCFG register clock'unu actim diger ornekte de sozkonusu hatayi giderdim.

RCC->APB2ENR|=0x4000;           // SYSCFG Enable

Peki SYSCFG clk acik olmadigi halde A0 pininden int ureten kod nasil calisiyordu?

SYSCFG->EXTICR[0] registerine 0 yazmamiz gerekiyorken clk acikolmadigi icin yazamiyoruz fakat bu registerin resetdeki default degeri 0 oldugu icin
duzguin calisiyordu. B2 pini icin bu rege 0x100 yazmamiz gerekirken yazamiyorduk. Sorunu bu registere 0x100 yazip 0x00 okumam uzerine farkettim.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

sfaunl

Alıntı yapılan: bunalmis - 16 Şubat 2012, 01:23:58
@sfounl

Ornek programlarda verdigim A0 pininden int ureten yazilimda da bir hata varmis. Fakat bu hataya ragmen kod calisiyormus.
B2 pininden int urettiremedigini yazdiginda bende ugrastim ve gercekten B2 den int uretilemedigini gordum.

Sorun SYSCFG registerinin clogunu acmamamizdan kaynaklaniyormus. Ornek programlara calisan bir ornek ekledim. System init rutininde de
SYSCFG register clock'unu actim diger ornekte de sozkonusu hatayi giderdim.

RCC->APB2ENR|=0x4000;           // SYSCFG Enable

Peki SYSCFG clk acik olmadigi halde A0 pininden int ureten kod nasil calisiyordu?

SYSCFG->EXTICR[0] registerine 0 yazmamiz gerekiyorken clk acikolmadigi icin yazamiyoruz fakat bu registerin resetdeki default degeri 0 oldugu icin
duzguin calisiyordu. B2 pini icin bu rege 0x100 yazmamiz gerekirken yazamiyorduk. Sorunu bu registere 0x100 yazip 0x00 okumam uzerine farkettim.
Tesekkurler Bulent hocam. Bugun en az 5 saat ugrastim cozebilmek icin.   :-[
Bazi register'lari(NVIC gibi) view menusunde gorememizin nedeni nedir? Ayrica bazilarnin view menusunde ayri ayri tanimlanmasina ragmen header'da array olarak tanimlanmasi nedendir?