Picproje Elektronik Sitesi

DERLEYİCİLER => MikroC - PIC => MikroC ARM => Konuyu başlatan: Karamel - 04 Temmuz 2015, 17:08:13

Başlık: Ynt: mikroc stm32f030k6t6 sorularim
Gönderen: Karamel - 04 Temmuz 2015, 17:08:13
merhaba. arm microcontrollerlari ogrenmeye basladim. platform benim icin yep yeni oldugu icin en basta microc library leri ile arm microcontrolleri calistirmak. daha sonra microcontroller i register seviyesinde programlamak istiyorum. neyi yapmaya kalksam saatlerce ugrastigim sorunlar cikiyor. dunden birkac saat oncesine kadar programlanma sorununu surada https://www.picproje.org/index.php/topic,60133.msg464683/topicseen.html#msg464683 (https://www.picproje.org/index.php/topic,60133.msg464683/topicseen.html#msg464683) cozdum. sorularim cok olunca. bir baslik altinda hepsini toparlamanin daha mantikli olacagini dusundum.

suan icin 1. sorum uart ile ilgili. libaryde uart advanced init function i soyle tanimlanmis.

UART1_Init_Advanced(115200, _UART_8_BIT_DATA, _UART_NOPARITY, _UART_ONE_STOPBIT, &_GPIO_MODULE_USART1_PA9_10);

compiler bu code a  surasi &_GPIO_MODULE_USART1_PA9_10 yanlis diyor. zaten ben PA2 ve PA3 u kullanmak istiyorum. asagidaki sekillerde denedim. hicbiri olmadi.




UART1_Init_Advanced(115200, _UART_8_BIT_DATA, _UART_NOPARITY, _UART_ONE_STOPBIT, &_GPIO_MODULE_USART1_PA9_10);
UART1_Init_Advanced(115200, _UART_8_BIT_DATA, _UART_NOPARITY, _UART_ONE_STOPBIT, &_GPIO_MODULE_USART1_PA2_3);
UART1_Init_Advanced(115200, _UART_8_BIT_DATA, _UART_NOPARITY, _UART_ONE_STOPBIT, &_GPIO_MODULE_USART1_PA3_2);
UART1_Init_Advanced(115200, _UART_8_BIT_DATA, _UART_NOPARITY, _UART_ONE_STOPBIT, &_GPIO_MODULE_USART1_PA23);
UART1_Init_Advanced(115200, _UART_8_BIT_DATA, _UART_NOPARITY, _UART_ONE_STOPBIT, &_GPIO_MODULE_USART1_PA32);


microc library lerinde bu defination nasil oluyor?

mesaj birleştirme:: 04 Temmuz 2015, 17:09:01

not: cubemx software i ile uart1 i active edince uart pa2 ve pa3 te aciliyor. yani microcontrollerimda pa2 ve pa3 pinlerinde uart function var.
Başlık: Ynt: mikroc stm32f030k6t6 sorularim
Gönderen: LukeSkywalker - 04 Temmuz 2015, 17:58:52
_GPIO_MODULE_UART1_PA2_3

Ben genelde _GPIO_ yazdıktan sonra ctrl+space kombinasyonuyla tamamlattırırım kodları. Çok faydalı.
Başlık: Ynt: mikroc stm32f030k6t6 sorularim
Gönderen: Karamel - 04 Temmuz 2015, 18:28:01
hocam define oldu simdi. peki example da neden hatali olarak vermisler code u?  :-\
Başlık: Ynt: mikroc stm32f030k6t6 sorularim
Gönderen: LukeSkywalker - 04 Temmuz 2015, 18:30:36
Derleyici güncellendi fakat help dosyası güncellenmedi. Düzelteceklerdir bir sonraki versiyonda. Siz dediğim gibi ctrl+space kullanın.
Başlık: Ynt: mikroc stm32f030k6t6 sorularim
Gönderen: Karamel - 04 Temmuz 2015, 18:36:21
Anladim hocam.


Bu arada peripheral uart i calistiramayinca bende soft uart library i test ettim. suan microcontroller i icersindeki rc osc ile calistiyorum. (8mhz) duzgun gonderim yapamadi pc ye. hizi 1mhz e dusurunce. gonderim normal oldu. sorunun rc osc de oldugunu nasil anladim?

bir byte goderdim. dogru bir sekilde gitti.

5 byte gonderdim. birinciden sonraki 4 u bozuldu. aralara Delay_ms(10); yerlestirince. 5 byte ta duzgun bir sekilde gitti. yani anlayacagimiz sync problemi var.

pic microcontrollerda icersindeki 8mhz rc oscyi 32 myhz e katlayip. uart haberlesmesi yapabilmistim. stm32 microcontrollerda 8mhz de sorun cikmasi normal mi?  :-\

mesaj birleştirme:: 04 Temmuz 2015, 18:43:40

Evet. Simdi donanimsal uart ilede denedim. Aralara delay ekleyinca duzgun gidiyor. Eklemeyince data bozuluyor. Buradan anlayacagimiz. 8mhz rc osc duzgun kararlilikta calismiyor.
Başlık: Ynt: Ynt: mikroc stm32f030k6t6 sorularim
Gönderen: baran123 - 04 Temmuz 2015, 18:44:18
32F0 da HSI kullanarak yapıyorum ama öyle hatalar çok çok nadir oluyor.
Başlık: Ynt: mikroc stm32f030k6t6 sorularim
Gönderen: Karamel - 04 Temmuz 2015, 19:14:31
Hocam calisan uart code unuzu. Hsi rc osc u kullanarak 8 mhz de deneyebilirmisiniz? Cunku sorun bendede olabilir.

mesaj birleştirme:: 04 Temmuz 2015, 19:16:01

Suan pc im kendini update ediyor. Update bitsin. Bende osc yi nasil ayarladigimi resimlerle gostermeye calisacagim.
Başlık: Ynt: Ynt: mikroc stm32f030k6t6 sorularim
Gönderen: baran123 - 04 Temmuz 2015, 21:57:12
Karamel senin için deneyeyim dedim USART bende de çalışmıyor şuan :D.Çözünce yazarım.
Başlık: Ynt: mikroc stm32f030k6t6 sorularim
Gönderen: Karamel - 04 Temmuz 2015, 22:10:08
hocam 9600 baud rate te osc configuration ini asagidaki gibi yapip deneyebilirmisiniz?

mikroc de ben boyle yapmistim. sizinle bir alakasi yok

(http://i.hizliresim.com/PqL2Ed.png) (http://hizliresim.com/PqL2Ed)



cubemx ten gorunumu boyle olmali

(http://i.hizliresim.com/94JWpZ.png) (http://hizliresim.com/94JWpZ)

mesaj birleştirme:: 04 Temmuz 2015, 22:12:06

hocam sizin de calistiramamaniz iyiye alamet degil. umarim calistirirsinizda sorun bendedir.
Başlık: Ynt: Ynt: mikroc stm32f030k6t6 sorularim
Gönderen: baran123 - 04 Temmuz 2015, 22:33:14
Senın uygulamadan once bır kendımınkını calıstırıp emın olduktan sonra senınkını denıyım dedım.Benım basit uygulama calısmıyor.Sapıttı ! bir şeyleri yanlış yapıyorum ama hayırlısı ...
Başlık: Ynt: mikroc stm32f030k6t6 sorularim
Gönderen: Karamel - 05 Temmuz 2015, 02:23:49
yok bir yerde birseyler yanlis gidiyor. rc de olsa osc nin frequance i bu denli bozulmamali. apb1 presceller ile bolup daha yavas bir frequance elde edeyim dedim ama sanirim elde ettigim dusuk frequance usart modulune uymadi.neden boyle oluyor anlamadim. p.tesi crystal osc alacagim. o zamana kadar deneylere devam edecegim.  :-\

mesaj birleştirme:: 05 Temmuz 2015, 03:37:37

simdi isin rengi degisti!

osc de sorun yokmus. logic analyzer im ile pin in logic time larini inceledim. 9600 baut rate te logic1 icin 104usn yani normal. asagiya fotosunuda gonderdim. peki bilgileri ard arda aralarina delay koymadan gonderince neden sapitiyor? simdi bunu bulmam gerekli.

(http://i.hizliresim.com/rQlzQB.png) (http://hizliresim.com/rQlzQB)

mesaj birleştirme:: 05 Temmuz 2015, 03:38:52

resimde U characterinin asenkron uart karsiligi dogru bir sekilde gittigi goruluyor. yani sorun bende yada mikroc librarysinde. osc ye bosuna yuklendik  :-\

mesaj birleştirme:: 05 Temmuz 2015, 04:01:35

madem her byte tan sonra biraz beklememiz lazim. bende stop bitini 2 ye cikarttim. sistemi kandirdim. suan icin normalmis gibi gozukuyor ama bunun neden boyle oldugunu bulmak gerekli.



UART1_Init_Advanced(9600, _UART_8_BIT_DATA, _UART_NOPARITY, _UART_TWO_STOPBITS, &_GPIO_MODULE_UART1_PA2_3);
Başlık: Ynt: mikroc stm32f030k6t6 sorularim
Gönderen: LukeSkywalker - 05 Temmuz 2015, 09:51:24

while(1)
{
  while (UART1_Tx_Idle() == 0);
  UART1_Write(data[i]);
  i++;
]


Bunu dene.
Başlık: Ynt: mikroc stm32f030k6t6 sorularim
Gönderen: Karamel - 05 Temmuz 2015, 13:48:29
ise yaramadi hocam. stop bitini one yapinca isler bozuluyor. birazdan reference manual i talan etmeye baslayacagim  ::)

mesaj birleştirme:: 05 Temmuz 2015, 13:51:42

two or one and half ta calisiyor.

suan bunlari arm microcontroller in yapisini anlamak icin yapiyorum ama pekte iyi basladigim soylenemez. nereye elimi atsam tam olarak beceremedim  :-\
Başlık: Ynt: mikroc stm32f030k6t6 sorularim
Gönderen: LukeSkywalker - 05 Temmuz 2015, 15:26:52
void main()
{
UART1_Init_Advanced(9600, _UART_8_BIT_DATA, _UART_NOPARITY, _UART_ONE_AND_A_HALF_STOPBITS, &_GPIO_MODULE_USART1_PA9_10);
while(1)
         {
          UART1_Write('X');
          UART1_Write('Y');
          UART1_Write('Z');
          UART1_Write('I');
         }
}


Bu kodu STM32L053 ile dahili 16MHz kullanarak denedim. Sıkntı yok.
Başlık: Ynt: mikroc stm32f030k6t6 sorularim
Gönderen: Karamel - 08 Temmuz 2015, 05:44:46
arm microcontroller imin flash hafizasini eeprom hafiza gibi kullanip. degisken bilgilerini saklamayi ogrenmek istiyorum.

help file dan baktigima gore example soyle:

#include <built_in.h>

unsigned long buff[32];
unsigned long i, tmp;
unsigned long Address = 0x08008000;
unsigned long Address2 = 0x08009000;
unsigned long* ptr;

void main() {
  GPIO_Digital_Output(&GPIOD_BASE, _GPIO_PINMASK_ALL);    // digital output PORTD
  GPIO_Digital_Output(&GPIOE_BASE, _GPIO_PINMASK_ALL);    // digital output PORTE

  for(i=0; i<32; i++)
    buff[i]=i+(i<<16);

  FLASH_ErasePage(Address);            // erase block (Address must be 2048 byte aligned)
  for(i=0; i<32; i++)
    FLASH_Write_Word(Address + i*4, buff[i]);     // write buffer with 32 long words

  ptr = (unsigned long*)Address;
  for(i=0; i<32; i++) {
    tmp = *ptr;
    GPIOD_ODR = HiWord(tmp);
    GPIOE_ODR = LoWord(tmp) << 8;
    ptr++;
    Delay_ms(50);
  }

  Delay_ms(1000);
  FLASH_ErasePage(Address2);            // erase block (Address must be 2048 byte aligned)
  FLASH_Write_HalfWord(Address2, 0xAAAA); // write one word
  GPIOD_ODR = 0;
  ptr = (unsigned long*)Address2;
  i = *ptr;
  GPIOE_ODR = (LoWord(i)) << 8;
 
}




simdi anladigim kadariyla. arm microcontrollerin flash hafizasinda herhangi bir yere istedigimiz long degiskeni yazabiliyoruz? pointer kullanarak address te istedigimiz yeri okuyabiliyoruz. yalniiiiiiz! istedigimiz hucreyi silemiyoruz. sadece page page silme islemi yapabiliyoruz.


library explaining ten  ve yukaridaki code dan bunlari anladim. yalniz aklimda iki adet soru olustu.

1- silecegim page i nasil belirleyecegim? ya orada program varsa?
2- long degiskeni char degiskene nasil cevirecegim?
Başlık: Ynt: Ynt: mikroc stm32f030k6t6 sorularim
Gönderen: MrDarK - 08 Temmuz 2015, 09:40:07
Alıntı yapılan: Karamel - 08 Temmuz 2015, 05:44:46
library explaining ten  ve yukaridaki code dan bunlari anladim. yalniz aklimda iki adet soru olustu.

1- silecegim page i nasil belirleyecegim? ya orada program varsa?
2- long degiskeni char degiskene nasil cevirecegim?

1- STM'in eeprom barındıran modellerinde erase işlemleri daha kolay olabiliyor tavsiye ederim. Onun dışında program memory'nin bir haritasını çıkart. Örnek vermek gerekirse memory 128K olsun, kodu derlediğinde yazılımın kaç K tuttuğu map içinde belli oluyor söylüyor derleyici. O adreslerden sonraki adresleri kullanabilirsin. 1 Page 256 Byte'dan oluşur. Örnek veriyorum program memory'in 0x08080000 'dan başlıyorsa 1 page sonrası 0x08080100 olacaktır. Bu şekilde adreslemeye dikkat ederek istediğin yere yazım yapabilirsin. Hatırladığım kadarıyla ortalama yaz sil ömürleri 100.000 kez yapılabiliyor buna dikkat etmekte yarar var.

2- Long değişkenini max kaç elemana kadar çıkartıyor isen ona göre elindeki datayı basamaklarına ayırabilirsin bence.
Basamak = (sayi/10)%10 gibi formüller var fazlaca. Tam olarak yapmak istediğini anlarsam yardımcı olmaya çalışırım. Fakat MicroC ile değil standart C ile destekleyebilirim :) Örneklerimde Standart Lib'den olur ne yazık ki (:
Başlık: Ynt: mikroc stm32f030k6t6 sorularim
Gönderen: LukeSkywalker - 08 Temmuz 2015, 11:50:40
@Karamel St Link Utility kullandığın zaman programın flash memory üzerinde hangi adreslere yerleştiğini  açıkça görebiliyorsun. Programında kullanacağın adresleri buraya bakarak belirleyebilirsin.
Başlık: Ynt: mikroc stm32f030k6t6 sorularim
Gönderen: Karamel - 08 Temmuz 2015, 15:00:09
Hocalarim suan telefonumdan yaziyorum. Internal flash hafizaya okuma ve yazma yapabildim ::)

Soyle yaptim. St link utility yaziliminda size i el ile degistirdim.( cok yuksek yapmaya calistim)

Benim microcontroller icin en son address sanirim soyle birseydi 0x08007FF0

Buraya yaz dedim. Sonra st link utility ile okudum. Gercektrnde yazmis.

Pointer kullanarak yazilan degeri microcontroller ile okudum. Pc ye uart ile gonderdim :) MrDark hocamin soyledigi conversation seklinde yaptim ::)

Yazdigim address i erase flash(address); komple o address in page ini sildi ama page nereden nereye kadar tam olarak anlayamadim. Bilgisayarim suan update yapiyor. Bitsin yeniddn bakacagim.

mesaj birleştirme:: 08 Temmuz 2015, 15:00:45

Not: mikroc muhtesem birsey  8) ::)
Başlık: Ynt: Ynt: mikroc stm32f030k6t6 sorularim
Gönderen: LukeSkywalker - 08 Temmuz 2015, 15:06:53
:)
Başlık: Ynt: Ynt: mikroc stm32f030k6t6 sorularim
Gönderen: MrDarK - 08 Temmuz 2015, 16:57:22
Alıntı yapılan: Karamel - 08 Temmuz 2015, 15:00:09
Yazdigim address i erase flash(address); komple o address in page ini sildi ama page nereden nereye kadar tam olarak anlayamadim
Ne demiştik 1 Page 256 Byte ise 0x100 'e denk gelir. Memory Map'den baktığın adresin doğru olduğunu varsayarsak

Page başlangıç adresin ; 0x08007F00 - Bitiş adresin 0x08007FFF olması gerekiyor diye düşünüyorum :)
Başlık: Ynt: mikroc stm32f030k6t6 sorularim
Gönderen: LukeSkywalker - 08 Temmuz 2015, 19:30:35
Page'in ne olduğu referans manuelde yazıyor. Sayfa 55.