MikroC ile ARM Programlama Kitabımız Çıktı….

Yayınlandı: 23 Mart 2014 / Serbest Yazılar
Etiketler:, ,
pr_01_498_max

Resmi büyük görmek için tıklayın…

“Not:18. bölümdeki USB konusunun PC uygulamaları. Kodları ile birlikte buradan indirebilirsiniz.”

Bir süredir üzerinde çalıştığımız kitap projesi sonunda hayata geçti. Alanında ilk Türkçe kaynak olan kitap Altaş yayınevi tarafından piyasaya sürüldü. Kitabın web sayfasına buradan  ulaşabilirsiniz. picproje.org forum sitesinde bulunan konuya ise buradan ulaşabilirsiniz.

Teknolojideki gelişmelere paralel olarak veri işleme hızına duyulan ihtiyaç, her geçen gün daha hızlı ve yetenekli mikrodenetleyicilerin piyasaya sürülmesine neden olmaktadır. 32 bit veri işleme kapasitesine sahip mikroişlemciler artık cep telefonlarında, televizyonlarda hatta beyaz eşyalarda kullanılır hale gelmiştir. 32 bitlik mikrodenetleyicilerin çok büyük bir bölümü ARM firmasının geliştirmiş olduğu işlemci mimarilerine göre tasarlanmaktadır. 32 bitlik mikrodenetleyiciler ile gerçekleştirilecek projeler genellikle, geniş kullanıma sahip bir sistem dili olan C dili ile yapılmaktadır.

Mikroelektronika firmasının geliştirmiş olduğu MikroC derleyicisi, Texas Instrumets ve ST gibi dünya çapında firmalarının üretmiş olduğu birçok 32 bitlik ARM mimarili mikrodenetleyiciyi programlamaya olanak sağlamaktadır. MikroC derleyicisi sahip olduğu birçok kütüphane ile mikrodenetleyicilerin dâhili donanımlarının yanısıra pekçok harici donanımın da projelerde kolayca kullanılmasını sağlamaktadır. Kitapta, mikroC Pro For ARM derleyicisi, ST firmasının üretmiş olduğu ve son günlerde oldukça popüler olan STM32F407VG işlemcisi üzerinden örnekler verilerek incelenmiştir.

Konular basitten zora doğru bir sıralama içerisinde düzenlenmiş ve her konu içerisinde çeşitli uygulamalara yer verilerek konuların pekişmesi amaçlanmıştır. STM32F407 mikrodenetleyicisinin genel özellikleri derinlemesine incelenmiş, bu mikrodenetleyicinin sahip olduğu dâhili donanımlar kullanılarak birçok uygulama gerçekleştirilmiştir. Buna ek olarak çok sayıda harici donanım hakkında da bilgi verilmiş ve bu donanımlara uygulamalarda yer verilmiştir.

Kitap başlangıç seviyesi hedef alınarak hazırlanmış. 8 bit mikrodenetleyiciden, 32 bit mikrodenetleyicilere geçmek için önemli bir kaynaktır. Kitaptan faydalanabilmek için temel elektronik bilgisine sahip olmak yeterlidir. Kitapta anlatılmış olan uygulamaları kavrayan bir okuyucu kendi projelerini rahatlıkla hayata geçirecek seviyeye ulaşacaktır.

Kitaptaki konular genel başlıklarıyla aşağıda verildiği gibidir;

mikroC for ARM dilinin tanıtımı

Cortex-m serisi Mikrodenetleyiciler

STM32F407 MCU Genel Özellikleri

STM32F4 Discovery Kitinin Özellikleri

STM32F407 Interrupt Özellikleri

STM32F407 Timer Birimlerinin Özellikleri

PWM (Puls Width Modulation)

STM32F407 A/D Dönüştürücü

STM32F407 D/A Dönüştürücü

I2C iletişim (Donanımsal-Yazılımsal)

SPI (Serial Peripheral Interface)

1 Wire İletişim

USART İletişim.

USB İletişim

STM32F407 Flash Bellek Kullanımı

RNG (Random Number Generator)

Giriş/Çıkış uygulamaları

Kesme Uygulamaları

Timer Uygulamaları

Karakter LCD uygulamaları

Grafik LCD Uygulamaları

PWM Uygulamaları

ADC Uygulamaları

DAC Uygulamaları

I2C Uygulamaları

SPI Uygulamaları

1 WIRE Uygulamaları

USART Uygulamaları

USB İletişim uygulamaları

Flash Bellek uygulamaları

RNG (Random Number Generator) Uygulamaları

Konuları anlatma heyecanı içerisinde gözden kaçan hatalarımız mutlaka olmuştur, affola.

İyi çalışmalar.

yorum
  1. burak dedi ki:

    tebrik ederim hocam gerçekten beklenilen bir kaynaktı emeginize saglık .

  2. mikrodunya dedi ki:

    İlginiz için teşekkürler. İyi çalışmalar..

  3. Mustafa Tekdemir dedi ki:

    Hocam emeğinize sağlık. STM32F4 patlaması yaşatak bir kitap.

  4. Atakan dedi ki:

    neden CCS C ile kaynak kitap sayısı artmıyor çok merak ediyorum.

    • mikrodunya dedi ki:

      CCS’in ARM mimarili mikrodenetleyiciler için derleyicisi var mı bilmiyorum. Sanırım yok.

      • Atakan dedi ki:

        ben ccs c için serdar çiceğin kitabından başka kitap görmedim. arm yi falan geçtim. ccs c için kaynak kitap çok az..

  5. miraç dedi ki:

    hocam çok sevaba girdiniz vallahi:) ,büyük eksik yaşanıyordu bu konuda.hemen sipariş ediyorum 🙂

  6. CAKIR dedi ki:

    Hocam Altaş Kitapevi sitesinde uygulama download seçeneğinde sorun var. Yardım ederseniz sevinirim.

    • mikrodunya dedi ki:

      Şu anda deney kiti (kendi tasarladıkları) üzerinde çalıştıklarından kodları henüz yayınlamadılar. Kodları deney kitine uygunlaştırıp yayınlayacaklar. Kodlar zaten .hex olarak yayınlanacak. Size hangi kodlar lazım?

  7. osman dedi ki:

    Kitabı aldım yalnız benim elimde stmf429ı kiti var nasıl yararlanabilirim ? dikkat etmem gereken noktalar nelerdir ?

  8. Durmuş dedi ki:

    Merhabalar kitabıınızdaki ivme sensörü uygulamasını yapmaya çalıştım fakat x,y,z tüm değerleri lcd de sıfır olarak verdi .Kitaptaki kodları aynen yazdığım halde bu oldu.Daha önceden ayar yapmam mı gerekiyodu yoksa bir hata mı var?

  9. Durmuş dedi ki:

    evet 16Mhz clock verdim spi kütüphanelerini aktif ettim fakat çıkışlar hep sıfır.Uygulamada dikkatimi çeken bir konu da ShortToStr deki ve ByteToStr deki kullanılan txt değişkenlerinin aynı olması ve bunların kaç elemanlı olduğunu belirtecek şekilde dizi tanımlamaları yapılmamış ben gene de tanımlamaları yaptım bundan kaynaklı olabilir mi acaba?

    • mikrodunya dedi ki:

      Evet haklısınız, char txt[7]; şeklinde bir kod eklenmesi gerekiyor programa. Gözden kaçırdı sanırım o bölümü yazan arkadaşım. Bunu yazdıktan sonra problemsiz çalıştırdım ben programı. LCD ekranın üst satırında sırası ile X, Y eksenlerinin değerleri, alt satırda ise Z ekseni görülmekte ve değerler değişmekte yöne göre..
      Siz proje dosyanızı upload edip gönderirseniz inceleyim..
      Saygılar.

  10. Durmuş dedi ki:

    dosya ekleme seçeneği yok e-mail adresimi vereyim : ali.han.90@hotmail.com

    • mikrodunya dedi ki:

      Buradan dosyayı indirip çalıştırabilirsiniz programı. Tek yaptığım değişiklik, kullanmadığım kütüphaneleri kapatmak ve “char txt[5];” ve “char txt2[3];” satırını eklemek oldu.

      • Durmuş dedi ki:

        maalesef yine aynı sonuçları verdi tüm değerler 0 gösteriyor

      • mikrodunya dedi ki:

        Siz hangi kiti kullaniyorsunuz? Verdigim proje dosyasini derleyip’yuklediniz degil mi?

      • Durmuş dedi ki:

        stm32f407vg evet aynen derleyip yükledim ama sonuç gene aynı ama bir kere x:128 y:-129 z:99 sonucunu verdi ama bidaha göremedim hep sıfır veriyor

      • mikrodunya dedi ki:

        Sizdeki kit problemli olabilir. Bende problemsiz calisti kodlar.

  11. Durmuş dedi ki:

    kiti değiştirip denerim ilgilendiğiniz için çok teşekkürler

  12. miracaydogan dedi ki:

    İyi günler. Usb HID uygulamasının kitaptaki kodlarını yazdım ancak derlediğim zaman “Unresolved extern ‘USB_Init_Desc’ ” şeklinde bi hata verdi. Halbuki terminalden Usbdsc.c kodunu dosyaya ekledim. Sorun ordan mı kaynaklanıyor acaba? Ayrıca kitapta bahsedilen c# arayüz uygulamasını ve benzer yan uygulamaları altaş kitap sitesinden bulamıyorum.yardımcı olursanız sevinirim.

    • mikrodunya dedi ki:

      Altaş yakinda yayinlayacak. USB kodlari problemsiz calisiyor. Library managerdan USB kütüphanesini isaretlediniz mi?

      • miracaydogan dedi ki:

        Evet tüm kütüphaneler eklenmiş durumda. Acaba project manager dan mı ekleme yapmak gerekiyor kütüphaneyi?

      • mikrodunya dedi ki:

        Hayir. Sadece USB kütüphanesini işaretleyin.

      • miracaydogan dedi ki:

        Şimdi oldu çok teşekkür ederim. Sanırım bu tüm uygulamalar için geçerli;sadece kullandığımız kütüphaneleri ekleyeceğiz.

      • mikrodunya dedi ki:

        Evet sadece kullandığımız kütüphanelerin eklenmesi bellek açısından da önemli.

      • miracaydogan dedi ki:

        Kusura bakmazsanız bir sorum daha olacak. Uzun zamandır USART protokolünü kullanmaya çalışıyorum ancak hiç sonuç alamadım. Terminaldeki veriyi tekrar terminale gönderme programı yaptım. Ancak veriyi gönderdiğimde karşılık olarak anlamsız işaretler veya harfler alıyorum.Acaba bu Serial port-usb dönüştürücüden mi kaynaklanıyor? Bu dönüştürücüyü PIC de kullandım sorunsuz çalıştı ama ARM kitinde sürekli sorun oldu.Frekans hızı mı yoksa kulllandığım Max232 entegresi mi sorun oldu hiç anlamadım. Yardımcı olursanız çok sevinirim.

      • mikrodunya dedi ki:

        Yaziliminizi gormeden birsey soylemek zor. Fakat arm kit 3 v ile calisiyor. Bu problem olmis olabilir.

  13. onur aydın dedi ki:

    Usart ile benimde problemim var hocam, mümkünse örnek bir kod yazar mısınız? iki cihaz arasında string göndererek çeşitli komutlar gerçekleştirecek bir kod paylaşabilir misiniz? örneğin bir kit diğerine A gönderdiğinde motor sağa dönsün B gönderdiğinde motor sola dönsün. motor sağa dönünce diğer kite sağa dönüyor göndersin ve gönderilen ve alınan ifadeler de GrafikLCD ye basılsın. Kitaptaki örneği uyguluyorum GLCD ile harmanlıyorum olmuyor. Kafayı yiyecem 🙂 Ekranda saçma sapan şeyler çıkıyor.

    • mikrodunya dedi ki:

      Siz yazdığınız kodu gönderirseniz yanlışlarınızı belirteyim. Hazır kod vermek istemem..

    • miracaydogan dedi ki:

      aynı sorunu ben de yaşıyorum hocam mikroC nin usart terminalinde deneme yapıyorum ve sürekli karmaşık ifadeler çıkıyor .En basit örnek olan yazılan stringin aynısını geri gönderme programı yapıyorum .ancak karmaşık ifadeler gönderiyor . Sanırım genel bir sorun bu .yardımcı olursanız seviniriz:)

  14. onur dedi ki:

    char alınan;

    while(1)
    {
    if(UART3_Data_Ready()); // EĞER VERİ GELDİYSE
    {
    alınan=UART3_Read(); // ALINANA AKTAR
    UART3_Write_Text(alınan); // ALINANI TEKRAR GONDER
    Glcd_Write_Char((alınan),10,3,1); // ALINANI EKRANA BAS
    Delay_ms(200);
    Glcd_Fill(0x00);

    }

    }

    Hocam bu şekilde yazdığım zaman sadece 1 tane karakter alabiliyorum. Örneğin start göndermek istiyorum fakat sadece s harfi gidiyor. Kitabınızda karakter dizisi almak için UART3_Read_Text(alınan,””,256) komut var fakat bunu yazdığım zaman ekranda saçma sapan şeyler çıkıyor. Amacım motoru sağa döndürmek için “sagaDon1” karekterleri gönderip bu karakter dizisini diğer kitim alınınca birinci motorun dönmesini sağlamak ve hangisi ne işlem yapıyorsa bunu GrafikLCD ye basmak bunu da USART kullanarak yapmak. Pic’den direkt ARM’a geçince en basit şeyleri bile kaçırıyorum sanırım. Ama desteklerinizle olacak inşallah 🙂

    • mikrodunya dedi ki:


      char alınan;

      while(1)
      {
      if(UART3_Data_Ready()); // EĞER VERİ GELDİYSE
      {
      alınan=UART3_Read(); // ALINANA AKTAR
      UART3_Write(alınan); // ALINANI TEKRAR GONDER
      }
      Glcd_Write_Char(alınan,10,3,1); // ALINANI EKRANA BAS
      }

      yukarıdaki şekilde yaparsanız gelen verileri ekrana basabilirsiniz.

      • onur dedi ki:

        Hocam bu şekilde yaptım fakat yine olmuyor. motorSaga1 yazısını diğer kitten alıp ekrana basmak istiyorum mo harfleri çıkıyor gerisi çıkmıyor. GLCD_Write_Char komutu bir tane karakter yazmak için sanırım, acaba topluca bir kelimeyi alıp ekrana basmak için kullanılmıyor mu?Çünkü ekranda harfler kelime şeklinde çıkmıyor. birbiri üzerine 2 harf yazıyor ve bitiyor. Kitapta tek karakter basmak için diyordu. Çünkü tek bir harfi alıp, gönderip,ekrana basabiliyorum. Fakat 5 harf ve bir sayı oldu mu örneğin MotorSagaDon1 gibi sadece Mo harfi alınıp gönderiliyor ve ekranda da sadece iki harf çıkıyor.

        char alınan;

        while(1)
        {
        if(UART3_Data_Ready()); // EĞER VERİ GELDİYSE
        {
        UART3_Read_Text(alınan,””,255); //Null Karakteri alınana kadar 255’e kadar tara
        UART3_Write_Text(alınan); // alınan karekterleri geri gönder
        Glcd_Write_Char(alınan,10,3,1); Alınan karakterleri ekrana bas
        }

        sanırım bir şeyi gözden kaçırıyor ya da hep bir noktaya odaklandığım için sorunun kaynağını bulamıyorum.

      • muratpolat dedi ki:

        unsigned long GLCD_DataPort_Input at GPIOE_IDR;
        unsigned long GLCD_DataPort_Output at GPIOE_ODR;

        char okunan[20]; // Okunan tipinde 20 elemanlı değişken tanımlanıyor.

        //Grafik LCD Kurulumu
        sbit GLCD_CS1 at GPIOE_ODR.B11;
        sbit GLCD_CS2 at GPIOE_ODR.B12;
        sbit GLCD_RS at GPIOE_ODR.B8;
        sbit GLCD_RW at GPIOE_ODR.B9;
        sbit GLCD_EN at GPIOE_ODR.B10;
        sbit GLCD_RST at GPIOE_ODR.B13;

        void main()
        {
        Glcd_Init(); //GLCD Kululuyor
        Glcd_Fill(0X00); //Ekran Temizliği
        Uart3_Init(9600); //Seri Haberleşme İçin 9600 baudrate,3. Kanal seçiliyor.(Pa10,Pa11)
        UART3_Init_Advanced(9600,_UART_8_BIT_DATA,_UART_NOPARITY,_UART_ONE_STOPBIT,&_GPIO_MODULE_USART3_PB10_11);
        UART_Set_Active(&UART3_Read,&UART3_Write,UART3_Data_Ready,UART3_Tx_Idle);
        Glcd_Set_Font(&Font_Glcd_5x7,5,7,32);//Yazılacak yazının eşgal tanımlaması

        Glcd_Write_Text(“USART HABERLESME”,12,1,1); //ekrana Usart Haberleşme yazısı yazdırılıyor.
        delay_ms(100); //100 ms kafa dinlenmesi

        while (1)
        {
        if (UART3_Data_Ready()) // Eğer Usart3 terminaline data geldi ise
        {
        UART3_Read_Text(okunan,”;”,20); //Gelen bu datanın yani okunanın içinde ne varsa onu ; karakterini bulana kadar tara
        UART3_Write_Text(okunan); //Gelen data(okunan) ne ise onu geri gönder
        Glcd_Write_Text(okunan,10,3,1); // Gelen data(okunan) ne ise ekrana (10,3,1) diye belirtilen konuma yaz.
        delay_ms(1000); //1000ms kafa dinle
        Glcd_Fill(0X00); //ekranı temizle

        }
        }
        }

        motorSağaDon1 gönderdiğin zaman sonuna ; eklemeniz gerekiyor. Alsında Null karakteri zaten sonuna ekliyor, fakat başına da 0 koyuyordu hatırladığım kadarıyla, dolayısı ile sonuna “” boşluk ya da “” eklenebilse daha iyi olur fakat ben denedim olmadı, neden olmadı anlaşmış da değilim. motorSağaDon1 yazdığımız zaman zaten motorSağaDon1 bunu yazmış oluyoruz. Fakat bu şekilde yazdırmadım. En güzeli sonuna ; noktalı virgül ya da başka bir şey koymak, gönderirken de böyle almak elimden gelen bu kadar.

  15. muratpolat dedi ki:

    Tamam buldum, hangi şeyi gönderiyorsanız sonuna ne koyacaksanız diğer tarafa da onu koyun. Örneğin \n newline…seriPortGönderici programınızdan ya da hyperterminal veya hangi programı kullanıyorsanız oradan newline ı seçip UART3_Read_Text(okunan,”\n”,20); şeklinde değiştirseniz sorun ortadan kalkar.Gönderdiğiniz şeyin sonuna noktalı virgül ekleme derdiniz de kalmaz.Burada \n , \t, \v,\r gibi boşluk karakterleri[whitespace] de kullanılabilir. Yine aynı şekilde Carriage return seçerseniz o zaman UART3_Read_Text(okunan,”\r”,20); yapın, ayrıca bu sadece 19 karakter tarayacaktır. Örneğin 25 karakter gönderecekseniz bunu 26 yapmanız lazım. Neden ekranda yazmıyor diye kafa yormamış olursunuz çünkü sonuna eklenen de boşluk karakteridir.

    • onur dedi ki:

      Murat Hocam çok teşekkür ederim bu şekilde denedim oldu:-) USART TERMİNAL programı var micro c derleyici içinde onunla gönderiyorum komutları. Şimdi gönderdiğimi alıp ona göre komut döndüreceğim program için uğraşıyorum. Demek ki kitte problem yokmuş 🙂 Allah razı olsun.

  16. alihan07 dedi ki:

    hocam pwm_init() fonksiyonundan 50 hz lik bir çıkış almak istiyorum 50 yazınca yada herhangi bir değeri yazsam da çıkış hep 20kHz oluyor

    period=PWM_TIM4_Init(50);
    PWM_TIM4_Set_Duty((period/100)*0,_PWM_NON_INVERTED,_PWM_CHANNEL2);
    PWM_TIM4_Start(_PWM_CHANNEL2,&_GPIO_MODULE_TIM4_CH2_PD13);

    micro c helpten bakınca fosc değerlerini inceleyerk yapın diyor acaba bununla ilgisi var mı
    istediğimiz her frekansı üretemiyor muyuz ?

  17. Durmuş dedi ki:

    delay kullanınca çok idela bir çalışması olmuyor.servo çok titresiyor.Bir sorum daha olacak iki ayrı adc çıkışından aldığım verileri karşılaştırıp pwm i bu değerlere göre göndermek istiyorum 1. değer 2.sinden büyükse servoyu 1. tarafa döndürüp büyük olduğu sürece bekletip eşit olduğu anda tekrar aynı sürede geri gelecek şekilde pwm göndermek istiyordum.Büyük olduğu sürece beklemesi yani %0 pwm göndermek için while() kullandım ama while ın içine girince değerler birbirine eşit olsa hatta küçük olsa bile while dan çıkamıyor program.yardımcı olurssanız sevinirim kolay gelsin.

    if(okunan>okunan2)
    {
    PWM_TIM4_Set_Duty((period/100)*5,_PWM_NON_INVERTED,_PWM_CHANNEL2);
    PWM_TIM4_Start(_PWM_CHANNEL2,&_GPIO_MODULE_TIM4_CH2_PD13);

    Delay_ms(1000);

    while(okunan-okunan2>200)
    {
    PWM_TIM4_Set_Duty((period/100)*0,_PWM_NON_INVERTED,_PWM_CHANNEL2);
    PWM_TIM4_Start(_PWM_CHANNEL2,&_GPIO_MODULE_TIM4_CH2_PD13);
    Delay_ms(20);
    }
    Delay_ms(10);

    PWM_TIM4_Set_Duty((period/100)*10,_PWM_NON_INVERTED,_PWM_CHANNEL2);
    PWM_TIM4_Start(_PWM_CHANNEL2,&_GPIO_MODULE_TIM4_CH2_PD13);
    Delay_ms(1000);

    PWM_TIM4_Set_Duty((period/100)*0,_PWM_NON_INVERTED,_PWM_CHANNEL2);
    PWM_TIM4_Start(_PWM_CHANNEL2,&_GPIO_MODULE_TIM4_CH2_PD13);
    Delay_ms(1000);
    }

    if(okunan2>okunan)
    {
    PWM_TIM4_Set_Duty((period/100)*10,_PWM_NON_INVERTED,_PWM_CHANNEL2);
    PWM_TIM4_Start(_PWM_CHANNEL2,&_GPIO_MODULE_TIM4_CH2_PD13);
    Delay_ms(1000);

    while(okunan2-okunan>200)
    {
    PWM_TIM4_Set_Duty((period/100)*0,_PWM_NON_INVERTED,_PWM_CHANNEL2);
    PWM_TIM4_Start(_PWM_CHANNEL2,&_GPIO_MODULE_TIM4_CH2_PD13);
    Delay_ms(20);
    }

    Delay_ms(10);

    PWM_TIM4_Set_Duty((period/100)*5,_PWM_NON_INVERTED,_PWM_CHANNEL2);
    PWM_TIM4_Start(_PWM_CHANNEL2,&_GPIO_MODULE_TIM4_CH2_PD13);
    Delay_ms(1000);

    PWM_TIM4_Set_Duty((period/100)*0,_PWM_NON_INVERTED,_PWM_CHANNEL2);
    PWM_TIM4_Start(_PWM_CHANNEL2,&_GPIO_MODULE_TIM4_CH2_PD13);
    Delay_ms(1000);
    }

  18. Durmuş dedi ki:

    kullandığım servo sürekli dönebilen servo o yüzden pwm ayarlamaları ve delay bekleme süreleri o kadar önemli değil.

  19. osman dedi ki:

    demo surumu hallettim picproje sayesinde simdi diğer bir sorun VID ve PID cihaz ozelliklerinden ogrendim VID ve PID e gore mikro-e usb hıd de usbdsc.c dosyasını olusturdum.cihaza yukledim.sızın paylaştınız c# led yakmadaki programı kullanarak denedim VID ve PID hatalı yazıyor bunun nedeni nedir acaba.

  20. osman dedi ki:

    mhz değerlerini ayarlamada hata yapmısım

  21. Durmuş dedi ki:

    hocam usart terminal de

    UART3_Init_Advanced(9600,_UART_8_BIT_DATA,_UART_NOPARITY,_UART_ONE_STOPBIT,&_GPIO_MODULE_USART3_PD89);

    bu ayarlamaları yapınca haberleşme portunu açamıyor diye uyarı verdi hata nerden kaynaklı olabilir

  22. Durmuş dedi ki:

    bağlantı olarak zaten sadece adc okuması yapıyorum onun dışında birde usb bağlatısı var pc ile stm32f4 arsı.
    pc de sorun var desem arduino iile seri portta okuma yapabiliyorum

  23. Durmuş dedi ki:

    seri bağlantı uart haberleşmesi değil mi zaten .direk usb kablo ile programı atıp ardından da değerleri pc de izlemeye çalışıyorum ama işte port açılamadı diyor

    • mikrodunya dedi ki:

      “bağlantı olarak zaten sadece adc okuması yapıyorum onun dışında birde usb bağlatısı var pc ile stm32f4 arsı.
      pc de sorun var desem arduino iile seri portta okuma yapabiliyorum”
      Bu ifadenize göre Bilgisayar ile kit arasında USB kablosundan başka bir bağlantı olmadığını anlıyorum. Eğer Seri bağlantıyı yapmış iseniz kodlarınızı göreyim.

      • ramazan dedi ki:

        #define button GPIOA_ODR.A9;
        #define button GPIOA_ODR.A10;
        char d;

        void main() {
        GPIO_Digital_Output(&GPIOB_BASE,_GPIO_PINMASK_11);
        GPIOB_ODR.B11=0;
        GPIO_Digital_Output(&GPIOB_BASE,_GPIO_PINMASK_12);
        GPIOB_ODR.B12=0;
        GPIO_Digital_Output(&GPIOB_BASE,_GPIO_PINMASK_13);
        GPIOB_ODR.B13=0;
        GPIO_Digital_Output(&GPIOB_BASE,_GPIO_PINMASK_14);
        GPIOB_ODR.B14=0;
        UART1_Init_Advanced(9600,_UART_8_BIT_DATA,_UART_NOPARITY,_UART_ONE_STOPBIT,&_GPIO_MODULE_USART1_PA9_10);
        delay_ms(10);
        UART_Set_Active(&UART1_Read,&UART1_Write,&UART1_Data_Ready,&UART1_Tx_Idle );
        while(1)
        {
        if (UART1_Data_Ready())
        {
        d=UART1_Read();
        UART1_Write(d);
        GPIOB_ODR.B11=1;
        GPIOB_ODR.B12=0;
        GPIOB_ODR.B13=0;
        GPIOB_ODR.B14=0;
        delay_ms(100);
        GPIOB_ODR.B11=0;
        GPIOB_ODR.B12=1;
        GPIOB_ODR.B13=0;
        GPIOB_ODR.B14=0;
        delay_ms(100);
        GPIOB_ODR.B11=0;
        GPIOB_ODR.B12=0;
        GPIOB_ODR.B13=1;
        GPIOB_ODR.B14=0;
        delay_ms(100);
        GPIOB_ODR.B11=0;
        GPIOB_ODR.B12=0;
        GPIOB_ODR.B13=0;
        GPIOB_ODR.B14=1;
        delay_ms(100);
        }

        }}

        bilgisayardan step motor kontrolü yapmaya çalışıyorum. veri gönderdiğim zaman 4 adım atıp duruyor bir türlü sonsuz döngüye girmiyor. yardım eder misiniz?

      • mikrodunya dedi ki:

        uart üzerinden veri alamıyorsunuz demekki.

      • Ramazan dedi ki:

        Veri alabiliyorum. Mesela 4 adım gittikten sonra duruyor sonra ben tekrar veri gönderiyorum yine 4 adım atıp duruyor. Her 4 Adımda bir veri göndermem gerekiyor. Ama ben while(1) sonsuz döngüsü kullanmama rağmen neden böyle yapıyor anlamadım?

      • mikrodunya dedi ki:

        çünkü döndürme işlemini “if(uart_data_ready)” şartının içerisinde yapmışsınız. Bu şart sağlandıkça dönme işlemi gerçekleşiyor. Bu şart sağlandığında yani uart üzerinden veri geldiğinde motor dönüyor. Sonra program başa döndüğünde tekrar uart üzerinden veri gelene kadar bekliyor. Eğer veri gelirse döönmeye başlıyor.

      • ramazan dedi ki:

        #define button GPIOA_ODR.A10;
        #define button GPIOA_ODR.A9;
        char d;
        char a;

        void main() {
        GPIO_Digital_Output(&GPIOB_BASE,_GPIO_PINMASK_11);
        GPIOB_ODR.B11=0;
        GPIO_Digital_Output(&GPIOB_BASE,_GPIO_PINMASK_12);
        GPIOB_ODR.B12=0;
        GPIO_Digital_Output(&GPIOB_BASE,_GPIO_PINMASK_13);
        GPIOB_ODR.B13=0;
        GPIO_Digital_Output(&GPIOB_BASE,_GPIO_PINMASK_14);
        GPIOB_ODR.B14=0;
        UART1_Init_Advanced(9600,_UART_8_BIT_DATA,_UART_NOPARITY,_UART_ONE_STOPBIT,&_GPIO_MODULE_USART1_PA9_10);
        delay_ms(10);
        if (d=UART1_Read())
        {
        UART1_Data_Ready();

        while(1)
        {
        GPIOB_ODR.B11=1;
        GPIOB_ODR.B12=0;
        GPIOB_ODR.B13=0;
        GPIOB_ODR.B14=0;
        delay_ms(30);
        GPIOB_ODR.B11=0;
        GPIOB_ODR.B12=1;
        GPIOB_ODR.B13=0;
        GPIOB_ODR.B14=0;
        delay_ms(30);
        GPIOB_ODR.B11=0;
        GPIOB_ODR.B12=0;
        GPIOB_ODR.B13=1;
        GPIOB_ODR.B14=0;
        delay_ms(30);
        GPIOB_ODR.B11=0;
        GPIOB_ODR.B12=0;
        GPIOB_ODR.B13=0;
        GPIOB_ODR.B14=1;
        }
        }
        if (a=UART1_Read())
        {
        UART1_Data_Ready();

        while(1)
        {

        GPIOB_ODR.B11=0;
        GPIOB_ODR.B12=0;
        GPIOB_ODR.B13=0;
        GPIOB_ODR.B14=1;
        delay_ms(30);
        GPIOB_ODR.B11=0;
        GPIOB_ODR.B12=0;
        GPIOB_ODR.B13=1;
        GPIOB_ODR.B14=0;
        delay_ms(30);
        GPIOB_ODR.B11=0;
        GPIOB_ODR.B12=1;
        GPIOB_ODR.B13=0;
        GPIOB_ODR.B14=0;
        delay_ms(30);
        GPIOB_ODR.B11=1;
        GPIOB_ODR.B12=0;
        GPIOB_ODR.B13=0;
        GPIOB_ODR.B14=0;

        }
        }

        }

        öncelikle ilginiz için teşekkür ederim. sonsuz döngü olayını hallettim yardımınız sayesinde. Ama şimdide sadece bir yönde dönüş sağlayabildim bir türlü diğer yönde döndüremedim motoru?

      • mikrodunya dedi ki:

        #define button GPIOA_ODR.A10;
        #define button GPIOA_ODR.A9;
        char okunan;

        void main() {
        GPIO_Digital_Output(&GPIOB_BASE,_GPIO_PINMASK_11);
        GPIOB_ODR.B11=0;
        GPIO_Digital_Output(&GPIOB_BASE,_GPIO_PINMASK_12);
        GPIOB_ODR.B12=0;
        GPIO_Digital_Output(&GPIOB_BASE,_GPIO_PINMASK_13);
        GPIOB_ODR.B13=0;
        GPIO_Digital_Output(&GPIOB_BASE,_GPIO_PINMASK_14);
        GPIOB_ODR.B14=0;

        while(1)
        {
        if (UART1_Data_Ready())
        {
        okunan=uart1_read();
        }
        if(okunan=='d')
        {
        GPIOB_ODR.B11=1;
        GPIOB_ODR.B12=0;
        GPIOB_ODR.B13=0;
        GPIOB_ODR.B14=0;
        delay_ms(30);
        GPIOB_ODR.B11=0;
        GPIOB_ODR.B12=1;
        GPIOB_ODR.B13=0;
        GPIOB_ODR.B14=0;
        delay_ms(30);
        GPIOB_ODR.B11=0;
        GPIOB_ODR.B12=0;
        GPIOB_ODR.B13=1;
        GPIOB_ODR.B14=0;
        delay_ms(30);
        GPIOB_ODR.B11=0;
        GPIOB_ODR.B12=0;
        GPIOB_ODR.B13=0;
        GPIOB_ODR.B14=1;
        }

        if(okunan=='a')
        {
        GPIOB_ODR.B11=0;
        GPIOB_ODR.B12=0;
        GPIOB_ODR.B13=0;
        GPIOB_ODR.B14=1;
        delay_ms(30);
        GPIOB_ODR.B11=0;
        GPIOB_ODR.B12=0;
        GPIOB_ODR.B13=1;
        GPIOB_ODR.B14=0;
        delay_ms(30);
        GPIOB_ODR.B11=0;
        GPIOB_ODR.B12=1;
        GPIOB_ODR.B13=0;
        GPIOB_ODR.B14=0;
        delay_ms(30);
        GPIOB_ODR.B11=1;
        GPIOB_ODR.B12=0;
        GPIOB_ODR.B13=0;
        GPIOB_ODR.B14=0;
        }
        }

        }

        Eğer yukarıdaki kodu kullanırsanız ‘a’ karakteri gönderdiğinizde bir yone, ‘d’ karakteri gonderdiğinizde diğer yone donmeli.

      • ramazan dedi ki:

        #define button GPIOA_ODR.A10;
        #define button GPIOA_ODR.A9;
        char okunan;

        void main() {
        GPIO_Digital_Output(&GPIOB_BASE,_GPIO_PINMASK_11);
        GPIOB_ODR.B11=0;
        GPIO_Digital_Output(&GPIOB_BASE,_GPIO_PINMASK_12);
        GPIOB_ODR.B12=0;
        GPIO_Digital_Output(&GPIOB_BASE,_GPIO_PINMASK_13);
        GPIOB_ODR.B13=0;
        GPIO_Digital_Output(&GPIOB_BASE,_GPIO_PINMASK_14);
        GPIOB_ODR.B14=0;
        UART1_Init_Advanced(9600,_UART_8_BIT_DATA,_UART_NOPARITY,_UART_ONE_STOPBIT,&_GPIO_MODULE_USART1_PA9_10);
        delay_ms(10);
        while(1)
        {
        if (UART1_Data_Ready())
        {
        okunan=Uart1_Read();
        }
        if(okunan==’d’)
        {
        GPIOB_ODR.B11=1;
        GPIOB_ODR.B12=0;
        GPIOB_ODR.B13=0;
        GPIOB_ODR.B14=0;
        delay_ms(30);
        GPIOB_ODR.B11=0;
        GPIOB_ODR.B12=1;
        GPIOB_ODR.B13=0;
        GPIOB_ODR.B14=0;
        delay_ms(30);
        GPIOB_ODR.B11=0;
        GPIOB_ODR.B12=0;
        GPIOB_ODR.B13=1;
        GPIOB_ODR.B14=0;
        delay_ms(30);
        GPIOB_ODR.B11=0;
        GPIOB_ODR.B12=0;
        GPIOB_ODR.B13=0;
        GPIOB_ODR.B14=1;
        }

        if(okunan==’a’)
        {
        GPIOB_ODR.B11=0;
        GPIOB_ODR.B12=0;
        GPIOB_ODR.B13=0;
        GPIOB_ODR.B14=1;
        delay_ms(30);
        GPIOB_ODR.B11=0;
        GPIOB_ODR.B12=0;
        GPIOB_ODR.B13=1;
        GPIOB_ODR.B14=0;
        delay_ms(30);
        GPIOB_ODR.B11=0;
        GPIOB_ODR.B12=1;
        GPIOB_ODR.B13=0;
        GPIOB_ODR.B14=0;
        delay_ms(30);
        GPIOB_ODR.B11=1;
        GPIOB_ODR.B12=0;
        GPIOB_ODR.B13=0;
        GPIOB_ODR.B14=0;
        }
        }

        }

        malesef birçok şekilde denememe rağmen motorda hiçbir hareket olmadı.

      • mikrodunya dedi ki:

        Çalışmaması için bir sebep yok. Klavyeden küçük a harfi veya küçük d harfi gönderdiğinizde çalışması gerekir. Yalnız bu kod çok sağlıklı bir kod değil onu belirteyim.

  24. Durmuş dedi ki:

    UART3_Init_Advanced(9600,_UART_8_BIT_DATA,_UART_NOPARITY,_UART_ONE_STOPBIT,&_GPIO_MODULE_USART3_PD89);

    if(UART3_Data_Ready())
    {
    x=UART3_Read();
    UART3_Write(x);
    }

    uart haberleşmesi ayarlaması olarak sadece bu kodu kullandım sonra da okunanı aynen yazdırdım

    • mikrodunya dedi ki:

      char x;
      void main()
      {
      UART3_Init_Advanced(9600,_UART_8_BIT_DATA,_UART_NOPARITY,_UART_ONE_STOPBIT,&_GPIO_MODULE_USART3_PD89);
      while(1)
      {
      if(UART3_Data_Ready())
      {
      x=UART3_Read();
      UART3_Write(x);
      }
      }
      }

      Ben yukarıdaki kodları denedim ve çalıştırdım. Siz porta hiç bağlanamıyorsunuz. Peki “Com Port Settings” kısmından hangi COM portu seçiyorsunuz? Fiziksel bağlantı yaptığınız portun ismini seçmeniz lazım oradan.

  25. Durmuş dedi ki:

    port ismi seçeneklerde gelmiyor sadece com yazıyor herhangi bir seçenek gekmiyor

    • mikrodunya dedi ki:

      Siz sanırım dizüstü bilgisayar kullanıyorsunuz. USB/Rs232 dönüştürücü mü kullandınız? Eğer böyle bir dönüştürücü kullandıysanız driver yüklediniz mi?

  26. Durmuş dedi ki:

    evet dizüstü kullandım ve stm ile pc arasında sadece usb kablo vardı rs232 yoktu.

    • mikrodunya dedi ki:

      Seri bağlantıyı nasıl gerçekleştirmeyi düşündünüz kablo bağlamadan? USB kablosu sadece program yüklemek ve kartı enerjilendirmek için kullanılır. Rs232 konusunu biraz araştırmanızı tavsiye ediyorum.

  27. alihan07 dedi ki:

    Arduino da program yukledigimiz kabloyla seri porttan okuma yapabiliyoduk biz stm ile.seri okuma yapmak istersek illa rs-232 mi kullancaz ?

    • mikrodunya dedi ki:

      Daha önce arduino kullanmadım. Fakat STM32 işlemciler SWD/JTAG veya SWIM ile programlanırlar. ST-LINK isimli programlayıcı STM32 işlemcileri programlamak için üretilmiş bir üründür. STM32F4 DISCOVERY üzerinde işlemciye bağlantıları yapılmış olarak gelir. Bu şekilde Bilgisayar ile mini USB port üzerinden yaptığınız bağlantı aslında ST-link ile PC arasındaki bağlantıdır. İşlemciyle doğrudan iletişim kuramaz. Siz eğer RS232/UART seri iletişim uygulaması yapacaksanız PC ile STM32F407’yi araya MAX3232 gibi bir uygunlaştırıcı kullanarak bağlamalısınız. Kitabımızda gerekli açıklamalar mevcut.
      Saygılar.

  28. Vasileios dedi ki:

    This seems like a fantastic book!! Is there any chance for an english version in the future??

  29. Musa dedi ki:

    Elimde STM32F4xx kiti var.İvme sensörünü kullanmaya çalışıyorum,MikroC de hatasız derleme yapıyorum ama bir türlü ledlerde çıkışı gözlemleyemedim.Ledlerin hiç biri yanmıyor.Kodları da ekliyorum yardım lütfen..

    #define ChipSelect GPIOE_ODR.f3 // Chip select olarak GPIOE’nin 3. bitini kullan

    char okunan=0;
    signed char xi=0,yi=0,zi=0;

    void Kurulum()
    {
    GPIO_Digital_Output(&GPIOE_ODR,_GPIO_PINMASK_3);
    ChipSelect=1; //Çip pasif
    SPI1_Init();
    ChipSelect=0; //Çip aktif
    SPI1_write(0x0F|0x80);
    okunan=SPI1_Read(0); // Sensörden gelen veri “okunan” değişkenşne yükle
    ChipSelect=1; //Çip pasif

    if(okunan==0x3B) //Eğer Sensöre ulaşıldıysa
    {
    ChipSelect=0; //Çip aktif
    SPI1_Write(0x20); //Ayar registerına git CTRL_REG1
    SPI1_Write(0x47); // 100Hz/2g/ olarak ayarla..
    ChipSelect=1; //Çip Pasif
    }
    }

    void ChipOku()
    {
    ChipSelect=0; //Çip aktif
    SPI1_write(0x27|0x80); // Status registerını oku. Hangi eksene yeni veri gelmiş?
    okunan=SPI1_read(0); //
    ChipSelect=1; //Çip Pasif

    if (okunan&1)
    {
    ChipSelect=0;
    SPI1_write(0x29|0x80);
    xi=SPI1_read(0);
    ChipSelect=1;
    }

    if (okunan&2)
    {ChipSelect=0;
    SPI1_write(0x2B|0x80);
    yi=SPI1_read(0);
    ChipSelect=1;};

    if (okunan&4)
    {
    ChipSelect=0;
    SPI1_write(0x2d|0x80);
    zi=SPI1_read(0);
    ChipSelect=1;
    }
    }

    void main()
    {
    Kurulum();
    ChipOku();

    if(xi>20)GPIOD_ODR.f15=1; else GPIOD_ODR.f15=0; // X ekseni 0.35G’den büyükse ledi yak değilse söndür
    if(xi20)GPIOD_ODR.f14=1; else GPIOD_ODR.f14=0; // Y ekseni 0.35G’den büyükse ledi yak değilse söndür
    if(yi<-20)GPIOD_ODR.f12=1; else GPIOD_ODR.f12=0;// Y ekseni -0.35G'den küçükse ledi yak değilse söndür
    }

    • mikrodunya dedi ki:

      Frekans ayarlarinizda sikinti vardir.

      • Musa dedi ki:

        Hocam Project>>Edit Project>>Load Scheme>>STM32F407VG_Int_Ocs_16MHz.cfgsch olarak ayarlıyorum(Kitapta gösterildiği gibi). Ve proje oluşturmadan önce de 16MHz olarak yazıyorum.Yanlış mı yapıyorum ? Eğer yaptıklarım doğru ise kit üzerinde ki sensör bozuk olabilir mi ?

      • mikrodunya dedi ki:

        Kit üzerindeki sensörün bozuk olması son düşünülmesi gereken şey. İlk olarak Altaş yayınevinin sitesine girip oradaki program dosyalarından deneme imkanınız var mı?

      • Musa dedi ki:

        Hocam kitaptaki uygulamayı denedim olmadı yine..Bir kaç deneme yaptım ve sensörden veri gelmediğini tespit ettim.Nedeni ya iletişim kopukluğu ya da sensörün bozuk olma durumu ki, ikinci ihtimal daha yüksek.Yaklaşık 4-5 gündür uğraşıyorum vardığım sonuç bundan öte değil hocam.Varsa hazır kod (Dediğiniz program dosyalarını Altaş yayınevinin sitesinde bulamadım) denemek isterim..

        Teşekkürler.

      • mikrodunya dedi ki:

        Kitaptaki kodlar çalisiyor test ettim.

  30. yigit dedi ki:

    Sayın hocam kitabınızdaki 18. bölümdeki uygulamayı yaptım çalıştırdım. sorum söyle olacak yardımcı olursanız sevinirim. stm32f4 kiti ile problar baglayıp gerilim,akım veya frekans ölçüp adc ile cevirip pc ye usb ile gönderip pc ekranında bu degerleri gösterebilirmiyim.

  31. Musa dedi ki:

    Çalıştırdım hocam nasıl oldu anlamadım günlerdir denediğim kodu kaydetmiştim ve kopyala yapıştır yaptım denedim çalıştı 🙂

    İlgi ve alaka ve yardımlarınız için çok teşekkür ederim hocam.

  32. yigit dedi ki:

    Sayın hocam kitabın 18. bölümdeki uygulamayı hem kit de hem C# da uygulamasını yaptım şu kod satırında hata alıyorum yardım edebilirmisiniz.

    void veri_gonder()
    {
    if (my_hid.IsOpen)
    {
    gidecek_buffer[0] = Convert.ToByte(veri1);
    gidecek_buffer[1] = Convert.ToByte(veri2);
    gidecek_buffer[2] = Convert.ToByte(veri3);
    gidecek_buffer[3] = Convert.ToByte(veri4);
    gidecek_buffer[4] = Convert.ToByte(veri5);

    // if (my_hid.IsWindowsXpOrLater) // eğer win xp’den önceki bir sürüm var ise control, win xp veya sonraki bir sürüm var ise interrupt kullanılır..
    // my_hid.WritePipe(gidecek_buffer, TransactionType.Interrupt);// gönderme işi burada yapılıyor..

    my_hid.WritePipe(gidecek_buffer, TransactionType.Interrupt);

    }
    }

    usb ile stm32f4 e baglantı yapmıyor program donuyor problemi bulamadım.

  33. Yiğit dedi ki:

    17. ve 18. bölümdeki uygulamaları yazdım daha hiç biri çalışmadı ne usb ne de com port üzerinden pc ye baglanamadım. Bu kodlar dogrumu kitabı yazan arkadaşlar

  34. Yiğit dedi ki:

    sayın kitap yazarları bu kitabın 17. bölümdeki uygulayı(usart uygulaması ) putty gibi terminal programlarıyla degeri daha hiç göremedim. Uygulamanın micro C de çalışan bir usart programını gönderir misiniz. stm32f4 den seril porta bir ‘a’ harfi gönderse yeter. Cocox da var orda gönderiyor Micro C de sizin yazdıgınız kitaptaki kodlar göndermiyor. Lütfen yardımcı olun tüm sınıfa aldırdım bu kitabı Micro uygulaması var diye daha kimse bir ‘a’ harfini usart aracılıgıyla seri porta gönderemedi.

    • mikrodunya dedi ki:

      Kodların çalışmaması gibi bir durum söz konusu değil. Siz biryerlerde bir hata yapıyor olmalısınız. Kimsenin kodları çalıştıramaması kodlarda hata olduğunu ispatlamaz. Kodların her biri defalarca denenerek kitaba eklendi.
      Az önce de sizin söylemleriniz üzerine denemelerimi yaptım, hem usb, hemde usart kodları sıkıntısız çalışıyor. Aşağıdaki linkte çalışan usart uygulamasının hex dosyası var. Eğer daha önce mcu programlamadıysanız STM32 işlemciler giriş yapma açısından sizin için yanlış bir seçim olur.
      http://www.dosya.tc/server34/JJz1vg/MyProject.rar.html

      • miracaydogan dedi ki:

        Genel olarak USART uygulamasında sorunlar olduğu görülmekte.Ben de bu uygulamayı bir türlü çalıştıramayanlardanım.Acaba devrede mi hata yapıyorum diyorum ; aynı devreyi PIC entegresi ile gerçekleştirdim çalıştı.Kod kısmı da doğru gözükmekte .Yani yanlış olmayacak derecede kısa kodlarla deniyorum yine olmuyor. Nereyi atlıyoruz bir türlü çözemedim .Videolu bir anlatım yapıp paylaşırsanız bu sorun çözülür diye düşünmekteyim.Kitapta anlatılanlarda sorun yok gibi gözüküyor ancak çalışmıyor bu uygulama bir türlü .

      • mikrodunya dedi ki:

        Oncelikle pc baglantisi yaparken max 3232 gibi bir entegre kullanmaniz şart. Ayrica kitaptaki ornek icin uart3 biriminin pd8 ve pd9 pinleri kullaniliyor. Pd8 tx, pd9 rx pinleri. Yani pd8 pininden pcye veri gonderiliyor, pd9 dan veri aliniyor. Bu uclara dikkat ederek baglanti yaptiginizda ve baud oranini 9600 degerine ayarladiginizda iletisim kuramamak icin bir engel kalmiyor.

  35. Yiğit dedi ki:

    üstat ya benim baglantılarda bişey var onu çözemedim .

    elimde stm32f4 discovery bi de com baglantısı için ftdi232 com cevirici var baglantıları kitaptaki gibi yaptım lcd baglantıları da aynen yaptım. gönderdigin hex kodunuda aynen içine attım yine çalıştıramadım. mail adresini gönderirsen haberleşebilir miyiz.

  36. yiğit dedi ki:

    eyvallah sagolasın video olunca daha iyi oldu. çalıştırdım.

  37. murat dedi ki:

    hocam merhaba… kitabınızdaki Lcd uygulamaları 1’i denediğimde veya sadece 2. satır 1. sutunda bir yazı yazdırmayı denediğimde LCD ‘ de sorunsuz görüntüleniyor ama lcd uygulamaları 2’yi denediğimde sayılan sayı 2. satır 1. sutun yerine 2. satır 6. sutunda görüntüleniyor (komut Lcd_Out(2,1,txt); olmasına rağmen) programdaki sayi değişkenin short olarak tanımlayıp İntToStr yerine ShortToStr komutunu kullanırsam bu sefer 2. satır 1. sutun yerine 2. satır 4. sutunda sayinin değeri gösteriliyor.. daha önce mikroC ile pic programlarken de benzer hataları alıyordum bunun sebebi sizce ne olabilir….teşekkürler (lütfen bir önceki mesajı dikkate almayınız satır sutun kavramlarını birbirine karıştırmışım)

    • mikrodunya dedi ki:

      “IntToStr(sayi,txt);” fonksiyonunu kullanırkken dikkat ettiyseniz sayi isimli değişkeni 7 karakterlik bir txt dizisinin içine aktarıyorsunuz string olarak. 7 karakter olmasının sebebi int değişkeninin alabileceği en uzun değerin “-32768” olmasıdır. Bir tane de fazladan en sona boş karakter bırakılır. “sayi” değişkeninin değeri diyelim ki 3 olsun. Bu durumda 7 elemanlı “txt” dizisinin içeriği şöyle olacaktır “—–3”. Siz bu sebeple 6. satırdan itibaren görüyorsunuz değişkeni. Bir de o kısmı yazan arkadaşım 2. uygulamada sanırım yanlışlıkla kod içerisine “char txt[7];” satırını eklemeyi unutmuş. Siz zaten farkedip eklediniz sanırım.
      Saygılar.

  38. murat dedi ki:

    cevap için çok teşekkür ederim, ancak bu kadar tane tane ve anlaşılabilir bir cevap yazılabilirdi herhalde 🙂

  39. muratpolata dedi ki:

    Hocam merhabalar, bir sorum olacaktı blogda nereye yazacağıma tam emin olamadım. Buradan sormam umarım sakınca oluşturmaz. STM32F407VG Discovery kit ile 10-100 Khz arası sinüs dalgası elde edilebilir mi? Elde edilebilirse nasıl bir yöntem izlemem gerekir?

  40. Eser Şentürk dedi ki:

    Merhaba.
    Ben stm32f4 discovery ile uart seri haberleşme uygulamasını çalıştırmak için uğraşıyorum ve çalıştıramadım. Dizüstü bilgisayar kullandığım için usb to rs232 çevirici kullanıyorum. Ayrıca kullandığım max3232 modülü 5V ile çalışıyor. Fakat stm32f4 mikrodenetleyicisi 3.3V ile çalışıyor. Acaba stm32f4 kiti ile max3232 modülü arasında 74hct245 gibi bir logic level shifter entegresi kullanmam gerekiyor mu?
    Yardımcı olursanız sevinirim.

  41. Eser Şentürk dedi ki:

    Bende 3V ile çalışıyor diye biliyordum. Fakat modülü bilgisayara bağlayıp 3.3 vile besledim ve modülün rx ile tx uclarını kısa devre ettim daha sonra terminalden veri gönderdiğimde geri terminal o veriyi almadı. Ama 5V ile beslediğimde terminal yolladığı veriyi geri aldı.

  42. Eser Şentürk dedi ki:

    Merhaba.
    Uart seri haberleşme protokolü kullanarak stm32f407 ile PC arasında haberleşmeyi sağladım. Devreyi dikkatli şekilde kurunca çalıştı 🙂

  43. koray dedi ki:

    merhabalar kitabınızı aldım çok beğendim ancak i2c yi yapamadım mikroc de ki örnek kodun aynısını kullandım aynı donanımı kullandım ancak kodda okuma kısma gelince kod o noktaya çakılıp kalıyor devam etmiyor nedenini bulamadım.yardımcı olursanız çok sevinirim

  44. muratpolata dedi ki:

    Hocam merhaba, Flash kütüphanesinde Flash_Erase_Sector fonksiyonu tüm sektörü siliyor, sadece istediğimiz adresi nasıl sildirebiliriz. Örneğin 0X08008000 adresini silmek istiyorum diyelim. Yada bundan itibaren 100 bytelık bir veri silmek istiyorum bunu nasıl yapabiliriz. Sektorü komple silince runtime error oluyor, program donuyor.

    • mikrodunya dedi ki:

      Malesef silme islemi sadece bu sekilde. Runtime error sebebi program datanin silinmesinden kaynaklaniyor. Flash bellegin program tarafindan kullanilan kisimlarindan uzakta calisin bence.

  45. erpayerpay dedi ki:

    Merhaba hocam size iki sorum olacak birincisi MikroC’nin ADC kütüphanesinde stm32 için çözünürlük değiştiremiyoruz bunun için hangi registerları ayarlamamız gerekli ?
    İkinci sorum ise DMA konusunda bir örneğiniz var mı MikroC de farklı kaynaklarda baya var ama MikroC için çok nadir gördüm.

  46. muratpolata dedi ki:

    Hocam Merhaba Hid_Write(); işlevini Timer interrupt ile kullanınca program donuyor, kesme ile kullanılamaz diye herhangi bir şey de yazmıyor.

    void Timer7_interrupt() iv IVT_INT_TIM7 {
    TIM7_SR.UIF = 0;
    //Enter your code here
    sayi1++;
    if(sayi1==result1){
    sy1=sayi1;
    sayi1=0;
    longlongunsignedtostr(sy1,tes1);
    while(!HID_Write(&tes1,64));
    }
    }

    • mikrodunya dedi ki:

      while’ı kaldırın.
      doğrudan hid_write(&tes1,64); yazın, bakalım ne olacak?

      • muratpolata dedi ki:

        Değişmiyor hocam yine donuyor. 100 e kadar sayıyor fakat cevap göndermiyor. Tekrar edince donuyor.

        void Timer7_interrupt() iv IVT_INT_TIM7 {
        TIM7_SR.UIF = 0;
        //Enter your code here
        sayi1++;
        if(sayi1==result1){
        sy1=sayi1;
        sayi1=0;
        longlongunsignedtostr(sy1,tes1);
        USB_Break();
        HID_Write(&tes1,64);
        }
        }

        yazdığım zaman ise result1 süresince aynı şeyi gönderip duruyor. Mesela result1=100 diyelim 100ms de bir 100, 100, 100…. gönderiyor.

      • mikrodunya dedi ki:

        Kodun tamamini gormeden bisey diyemem hocam. Timer icerisindeki hid write kodunun calistigini teyit ettim, baska yerde problem var bence.

  47. alidurmus dedi ki:

    Hocam kitabınızı aldım. Güzel bir kitap tavsiye ederim.
    Takıldığım bir nokta var
    Nextion marka lcd ile Uart ile haberleşe yapmak istiyorum.
    Gelen bilgiler 0x65 0x00 0x01 0x01 0xff 0xff 0xff
    Array ile gelen bilgileri okutup üçüncü olan bilgiyi kullanmak istiyorum
    Bununla ilgili araştırmalarım sonucunda netice alamadım. Gelen bilgiler doğru değil
    Acaba parity olarak 9 bit mi kullanmak gerekiyor. Döngü nasıl olmalı
    Yardımcı olursanız sevinirim

  48. alidurmus dedi ki:

    Hocam buraya yükledim
    http://s2.dosya.tc/server3/49n0ri/comport2.rar.html

    nextion üzerinde bir buton var daha doğrusu demo olarak gelen buton uygulaması var

    butona tıkladığımda 0x65 0x00 0x01 0x01 0xff 0xff 0xff bilgisi gönderecek.( arduino ile test ettim gönderiyor.)

    ben bu gelen bilgileri arraya atmak istiyorum. Şimdiden teşekkür ederim

    • mikrodunya dedi ki:

      Peki diziye aldiktan sonra ne yapacaksiniz?

      • alidurmus dedi ki:

        Dizi ile hangi butona basıldığını görülecek. Nextion marka hmi ler her sayfayı ikinci dizide o sayfanın içindeki komponetleri üçüncü dizide veriyor. Aldığım bilgi ile yönlendirme yaparım

      • mikrodunya dedi ki:

        // LCD bağlantıları tanımlanıyor
        sbit LCD_RS at GPIOE_ODR.B8; // LCD E portunun 4,5,6,7,8,9,10
        sbit LCD_EN at GPIOE_ODR.B10;
        sbit LCD_D4 at GPIOE_ODR.B4;
        sbit LCD_D5 at GPIOE_ODR.B5;
        sbit LCD_D6 at GPIOE_ODR.B6;
        sbit LCD_D7 at GPIOE_ODR.B7;
        // LCD bağlantıları tanımlandı

        long page,component;
        char rx_buffer,rx_array[8]; // change value to adjust for buffer size
        int i=0,j=0;
        char txt[4];

        ////////////////////////////////////////////////////////////
        void hextostr(char eleman)
        {
        char sol,sag;
        sol=(eleman>>4)&0x0F;
        if(sol>=10)
        {
        sol+=55;
        }
        else
        sol+=48;

        sag=eleman&0x0F;
        if(sag>=10)
        {
        sag+=55;
        }
        else
        sag+=48;

        txt[0]='0';
        txt[1]='x';
        txt[2]=sol;
        txt[3]=sag;
        }
        ////////////////////////////////////////////////////////////

        void main()
        {
        GPIO_Digital_Output(&GPIOE_BASE, _GPIO_PINMASK_9); //R/W pini şaseye çekiliyor.
        GPIOE_ODR.B9=0;
        // UART ayarlamaları yapılıyor.
        UART3_Init_Advanced(115200, _UART_8_BIT_DATA, _UART_NOPARITY, _UART_ONE_STOPBIT, &_GPIO_MODULE_USART3_PD89);

        USART3_CR1bits.RXNEIE = 1; // enable uart rx interrupt
        NVIC_IntEnable(IVT_INT_USART3); // enable interrupt vector
        EnableInterrupts(); // enable core interrupts
        Lcd_Init(); //LCD kullanıma hazır hale getiriliyor.
        Lcd_Cmd(_LCD_CLEAR); //LCD ekran temizleniyor.

        while(1)// Endless loop
        {
        // SAYFA NUMARASI GELECEK
        if(i==6)
        {
        hextostr(rx_array[2]);
        lcd_out(1,1,txt);
        i=0;
        }
        }
        }

        ///////////////////////////////////////////////////////////////////////////

        void interrupt() iv IVT_INT_USART3 ics ICS_AUTO {
        // Gelmesini beklediğim bilgi
        //0x65 0x00 0x01 0x00 0xFF 0xFF 0xFF
        if(UART3_Data_Ready()&& i<=6) // If data is received
        {
        rx_array[i]=Uart3_Read();
        i++;
        }
        }

  49. alidurmus dedi ki:

    Çok teşekkür ederim. Debugger ile gelen veriler beni yanıltmış anlaşılan.

    Hocam “sol=(eleman>>4)&0x0F;” bu işlemde birleştirmemi yapılıyor?

    Teşekkür ederim

    • mikrodunya dedi ki:

      Burada hexadesimal sayının ekranda doğru görülebilmesi için yüksek değerli 4 biti alınıyor. Daha sonra karaktere dönüştürülüyor.
      Mesela 0x65 sayısının 6’sı alınıyor ve daha sonra 48 ile toplanarak ‘6’ karakterine dönüştürülüyor. Fakat rakam 10 ve 10’dan büyükse yani A,B.C.D.E.F olursa 55 ile toplanarak karaktere dönüştürülüyor. Karaktere dönüştürülmezse LCD’de farklı görünecektir. ASCII tablosunu incelemenizi tavsiye ederim.

  50. alidurmus dedi ki:

    Hocam başka bir sorun çıktı. Kusura bakmayın acemiyim biraz
    Nextion’a veri göndermek istiyorum. t0.txt=”yazi” şeklinde veri gönderdiğimiz zaman TFT nextion üzerinde bulunan komponent yazısı değişmesi gerekiyor. son üz veri 0xff olacak diyor. virgüller için 0x22 kullandım. fakat ekranda yine değişiklik olmadı. araştırma yaptım çoğu böyle yapıyor fakat sorun bir türlü aşamadım.
    mikroc
    http://s2.dosya.tc/server3/1xnsza/comport2.rar.html

    nextion dosyası

    http://s2.dosya.tc/server3/1xnsza/ekran.rar.html

    UART3_Write_Text(“t0.txt=”);

    UART3_Write(0x22);// ” işareti

    UART3_Write_Text(“yazi”);

    UART3_Write(0x22); // ” işareti

    UART3_Write(0xFF);

    UART3_Write(0xFF);

    UART3_Write(0xFF);

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s