STM32F4 - Kolay programlama - ZIOS

Başlatan z, 26 Aralık 2013, 17:28:23

Mucit23

Yok hocam öyle olmuyor. Mesela Z eksenini okursanız ortalama 55-60 gibi bir değer alırsınız. Bu dünyadaki yerçekimi kuvvetinin sensöre etkisinden kaynaklanıyor. Bundan sonrası için sensöre dünyanın yer çekim kuvvetinden daha fazla bir kuvvet uygulamanız gerekir.

z

Yani elde ettigim değerler yaklaşık dogrumu?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Mucit23

Bende aynı değerleri alıyorum.
STM32 & LIS302DL ile İvme Ölçer uygulaması
Hatta Sensörü yukarı aşağı salladığımda Z ekseninden okunan değerin 100'ün üzerine çıktığını görebilirsiniz.

muhittin_kaplan


Burak B

Sensörün yere dönük yüzeyine 1g uygulanır. Bundan dolayı o eksende okunan değer sizi aldatmasın.
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

z

#20
ZIOS - SPI uygulaması

SPI ile çalışmak çok kolaylaştı.

PB13 SCK
PB14 MISO
PB15 MOSI

#include "STM32F4xx.h" 
#include "Zystem.h"
 
int main() 
{ 
char TxData, RxData;

   if(ver()<0x102)
    {
      display(0,0,"ZIOS-1.02 gerekli");   
      while(1); // En azından ZIOS 1.02 gerekiyor.             
    }       
        
   SPIinit(MSB, Pol_0, Frq_5);
    
   RxData=SPITxRx(TxData) 
    
   while(1);
}


8Bit modu için yazdığım SPIinit komutu, 3 parametre istiyor.

1. parametre, ilk gönderilecek bitin MSB mi yoksa LSB mi olduğu,
2. parametre, clock polarity,
3. parametre, clock frekansı.

SPITxRx komutu ile gonderilmek istenen data yollanırken geri dönüşte Rx data alınmış oluyor.

     SPIinit(first, pol_x, freq_x)
     
     first Parametresi
     
     MSB : first MSB bit send
     LSB : first LSB bit send

    polarity_x parametresi
     
     Pol_0 Clk: idle 0, clk: low  to high
     Pol_1 Clk: idle 0, clk: high to low
     Pol_2 Clk: idle 1, clk: high to low
     Pol_3 Clk: idle 1, clk: low  to high
     
     frequecy_x parametresi
     
     frq_0 : 21.0 Mhz
     frq_1 : 10.5 Mhz
     frq_2 : 5.25 Mhz
     frq_3 : 2.62 Mhz
     frq_4 : 1.31 Mhz
     frq_5 :  656 Khz
     frq_6 :  328 Khz
     frq_7 :  164 Khz

Zystem.h da parametre tanımları aşağıdaki gibi.

#define MSB     0     
#define LSB     1    

#define Pol_0   0  
#define Pol_1   1  
#define Pol_2   2  
#define Pol_3   3  

#define Frq_0   0  
#define Frq_1   1  
#define Frq_2   2  
#define Frq_3   3  
#define Frq_4   4  
#define Frq_5   5  
#define Frq_6   6  
#define Frq_7   7


ZIOS,bebeklik döneminden bu yana sürekli olarak gelişiyor haliyle de flashda daha çok yer kaplıyor. En son haliyle ZIOS (ver1.02), flash romda sadece 5Kb makine kodu yer kaplıyor.
(Ver1.02 henüz yayınlanmadı.)

Çok yakında daha önce üyelerce CMSIS yada doğrudan register erişimi ile yazılmış ve forumda yayınlanmış bir programı  sadece ZIOS komutlarıyla yazıp yayınlayacağım.

Hangisi daha anlaşılır, hangisiyle sonuca odaklı daha hızlı kod yazılır, hangisi flash'da daha az yer kaplıyor , hangisi daha hızlı koşuyor hep birlikte mukayese etme şansımız olacak
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

#21
STM32F4 de kullanılan pinler + Boştaki I/O pinler



Gri hatlar plananan ancak hangi pin olacağı henüz kesinleşmemiş sinyalleri göstermektedir.

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

z

#22
ZIOS - 4 Kanal PWM

Pwm1234Init(Frekans) şeklinde kullanılan init komutu, frekansı parametrede verilen değer olacak şekilde, PD15, PD14, PD13 ve PD12 I/O pinlerini Pwm tipi pinlere dönüştürür.

Pwm1234(Ch1,Ch2,Ch3,Ch4) olarak hazirlanmış komut ise ch1...ch4 yani (pd15...pd12) pinlerindeki pwm sinyallerinin duty degerini belirler.

Duty, frekansdan bagimsiz olarak 0....100 araligindadir.

Ornegin Duty=10 ise 10 birim zamanda cikis 1 iken 90 birim zamanda cikis 0 olacaktir.

Dilediginiz her frekansi olusturamazsiniz.

Verdiginiz frekans parametresi ile gercekte olusan pwm sinyalin frekansi farkli olabilir.

Gercek frekansi asagidaki bagintidan hesaplayabilirsiniz.

GF Gercek frekans, VF verilen frekans

GF= 42000000/ (Tam kisim (42000000/VF))

Ornegin 20Khz icin 42000000/ (Tam kisim (42000000/20000))= tamı tamına 20000 Hz olurken

33456 Hz icin gercekteki frekans 42000000/ (Tam kisim (42000000/33456))=33466 Hz olacaktir.

Duty, 1. kanal için 10, 2. kanal için 20, 3. kanal için 30, 4. kanal için 40 olacaksa komutumuz;

Pwm1234(10, 20, 30, 40); şeklinde yazılacaktır.

Aşağıdaki örnekte PD15, PD12, PD11 ve PD10 pinlerine bağlı kart üzerindeki 4 adet led yavaş yavaş parlamakta ve yavaş yavaş sönmektedir.

#include "STM32F4xx.h" 
#include "Zystem.h"
 
volatile short T;

void BirMiliSaniye() // V1.03 den sonra Milisecond adını aldı
{
    if (T) T--;      
}

void Delay(short D)
{
    T=D; while(T);           
}

int main() 
{ 
int i;
          
   if(ver()>=0x102)
    {
      Pwm1234Init(20000); // pwm frekansini 20Khz yap
      while(1)
        {        
          for(i=0;i<=100;i++){Delay(2); Pwm1234(i,i,i,i);}; // Yavasca yan
          for(i=100;i>=0;i--){Delay(2); Pwm1234(i,i,i,i);}; // Yavasca son
          for(i=0;i<100;i++) Delay(10); // 1 sn sonuk kal
        }
    }
}


ZIOS - 4 Channel PWM
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

erhanmete

yeni kütüphanenin linkini benmi göremiyorum yoksa yokmu ?

z

Bir iki komut daha ekleyeyim sonra linki veririm mantığıyla hareket edince kütüphane biraz geriden geliyor.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

erhanmete

heyecanla takip ediyoruz hocam
merak o yüzden.

alihan07

pwm den sonra sıra servom motor kodunda heralde  :)

z

#27
Alıntı yapılan: gerbay - 08 Ocak 2014, 13:18:21
resmen "Bunu yazan Tosun, okuyana kosun"   yazıyor...

Hocam, ASM dosyayı gıdıklamana gerek yoktu.

ZIOS ile SD karta format atınca SD kart içinde Readme.txt adıyla bir dosya oluşturuluyor.
Bu dosyayı PC'de word, notepad vs ile açtığın zaman o meşhur yazıyı zaten görecektin.

Gavurlar "The quick brown fox jumps over the lazy dog" gibi textler kullanıyor. Ben de bizim milli textlerimizden birisini yazdım.
Amaç espri.

Yoksa haddime mi?

------------------------------------

ZIOS V1.02 yü siteye yükledim ancak, yeni dosyayı yüklememe rağmen indirilmek istendiğinde hala eski dosya geliyor.
Mecburen Discovery.rar dosya adını değiştireceğim. DiscoveryV1.02.rar yapacağım.

V 1.02 ile scatter dosyası da değişti. Bu çok ama çok önemli bir dosya. Sadece ZIOS.LIB ve Zystem.h dosyalarını kopya ile proje klasörüne atarsanız C programınız kesinlikle kaza yapar.
Muhakkak ZIOS.sct dosyasının linkere tanıtılması gerekiyor. Bu nedenle yeni proje dosyası oluşturmak yerine  DiscoveryV1.02.rar dosyasını açıp örnek projeden yola çıkmakta fayda var.
Rar dosyasındaki projede sözkonusu scatter dosyası zaten keile durumu bildirdiği için sorun yok. Bakınca zaten nasıl eklendiğini göreceksiniz. (option for target de linker başlığında)
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

#28
Evet haklısın hocam.

ZIOS'un en büyük eksikliklerinden birisi ortaya çıktı. V1.03 de bu eksikliği giderelim.

ZIOS V1.02

Proje klasörü ilk açıldığında ZIOS.sct için yol hatası uyarısı veriliyor ve bir daha bu uyarı çıkmıyor. V1.03 de bu ufak sorun olmayacak.

Aşağıdaki pin durumlarını gösteren blok şemayı mesajlarımda ara ara tekrarlayacağım.



Eğer ileride 2. SPI portuna ihtiyaç duyarsak MEMS ile SD kartı aynı hatta bağlayarak SPI portun birisini boşa çıkartabiliriz.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

#29
ZIOS ile SD karta format atmak, dosya oluşturmak

En baştan itibaren yaptığımız tüm örnekleri içeren menülü bir demo programı oluşturdum.

Bu seferki program tanıtımını oğlum yaptı. (Anlayın artık ZIOS basit işte.)

ZIOS

Komple proje klasoru

http://www.cncdesigner.com/wordpress/wp-content/uploads/ZIOS_Demo.rar

#include "Zystem.h"
#include "string.h"
#include "stdio.h"
 
volatile short T;

char s[][17]={"BLINKING LED","PWM","MEMS","SOUNDS-DAC","ADC","RS232","SPI","Format SD CARD","Create File"};
char msg[17];

char RxBuffer[17];

char RxIndex=0,LastIndex=0;

void RxDataReady(char RxDat)
{
     RxBuffer[RxIndex]=RxDat;
     RxIndex=(RxIndex+1)&0x0F;           
}

void BirMiliSaniye() // V1.03 den sonra Milisecond adını aldı
{
    if (T) T--;      
}

void delay(short D)
{
    T=D; while(T);           
}


/* one click = next menu
   double click = change direction
   long push = select */

char menu(char n)
{
     display(0,0,s[n]);       // LCD message
     while(!getch());         // Read blue button
     if (Buton==3)     
        {
          display(0,1,"Demo begin");        
        }               
     return(Buton);     
}

// Blue, Red, Green and Orange LEDs blinking

void blinkdemo()
{
      pinmod('D',15,output); pinmod('D',14,output);
      pinmod('D',13,output); pinmod('D',12,output);
      Buton=0;
      while(!Buton)
        {
          pinset('D',15); pinset('D',14);         
          pinset('D',13); pinset('D',12);         
          delay(1000);        
          pinclr('D',15); pinclr('D',14);         
          pinclr('D',13); pinclr('D',12);         
          delay(1000);        
        }                  
}

// Blue, Red, Green and Orange LEDs soft blinking

void pwmdemo()
{
int i;          
      Buton=0;
      Pwm1234Init(20000); // fpwm=20Khz
      while(!Buton)
        {        
          for(i=0;i<=100;i++){delay(2); Pwm1234(i,0,0,0);}; // soft on
          for(i=0;i<=100;i++){delay(2); Pwm1234(100,i,0,0);}; // soft on
          for(i=0;i<=100;i++){delay(2); Pwm1234(100,100,i,0);}; // soft on
          for(i=0;i<=100;i++){delay(2); Pwm1234(100,100,100,i);}; // soft on
          
          for(i=100;i>=0;i--){delay(2); Pwm1234(i,100,100,100);}; // soft off
          for(i=100;i>=0;i--){delay(2); Pwm1234(0,i,100,100);}; // soft off
          for(i=100;i>=0;i--){delay(2); Pwm1234(0,0,i,100);}; // soft off
          for(i=100;i>=0;i--){delay(2); Pwm1234(0,0,0,i);}; // soft off
        }
}

// Lets learn angle of Discovery card 

void memsdemo()
{
      Buton=0;
      while(!Buton)
        {
          mems(); 
          sprintf(msg,"X: %3d",_X); display(0,0,&msg[0]);      
          sprintf(msg,"Y: %3d",_Y); display(0,2,&msg[0]);      
        }                  
}

// To hear the sound you must connect the PC amplificator to PA4 pin.

void dacdemo()
{
short a,a0,a1,a2,T1;
volatile int T;
          
    Buton=0;      
    while(!Buton) 
      {
        a0=720; a1=0; a2=32767;          
        for(T=0;T<80000;T++)
          {        
            for(T1=0;T1<100;T1++);
            a=((((a0*32734))>>14) - a1); a1=a0; a0=a;
            a2=(a2*32767)>>15;       
            a=(a*a2)>>15;       
            dac((a>>3)+2048);  
          }
      }              
}

// ADC input pin is PA1 (Voltage range: 0..3v)

void adcdemo()
{
float V;
          
    Buton=0;      
    while(!Buton) 
      {
         delay(250);                   // Read ADC at the every 250 mili sec
         V=(float)Analog*3/4095;           
         sprintf(msg,"V = %1.3f volt",V);     
         display(0,0,&msg[0]); 
      }              
}

// you must use RS232 level converter if you want to communicate with PC
// read received char and send back again (echo) 
// this function not tested

// PB10 Tx pin
// PB11 Rx pin

void RS232demo()
{
     RxIndex=0; LastIndex=0;     
     serinit(9600); // 9600 baud, 8 data, 1 stop, no parity
     Buton=0;
     while(!Buton)          
       {   
         while(RxIndex!=LastIndex)
           {        
            sersend(RxBuffer[LastIndex]);
            LastIndex=(LastIndex+1)&0x0F;        
           }          
       }                 
}

void SPIdemo()
{
volatile char rx;
char i;          
          
          
     spiinit(MSB,Pol_0,Frq_7);// for details look inside Zystems.h 
     Buton=0;
     while(!Buton)
       {
          for(i='A';i<='Z';i++)       
          rx=spiTxRx(i);      // send the value of i and read received data       
       }               
}

// format the 2 GByte SD card
// all data will be delete

void formatdemo()
{
     display(0,0, "WARNING SD CARD");          
     display(0,1, "will format");          
     delay(3000);
     display(0,0, "double click");
     display(0,1, "to format");          
     delay(3000);
     display(0,0, "1 clicks");
     display(0,1, "to exit");
     if (getch()==2) 
       { 
         cls();
         display(0,0,"Format beginning");                     
         if (!zormat(&File)) 
           {
             display(0,0,"Format completed");                     
           }                   
         else
           {
             display(0,0,"Format error");                     
           }                   
       } 
     else display(0,0,"You have exited"); 
                     
     delay(2000);   
          
}

// This function create 64Kbyte fixed length file

void createdemo()
{
short i;
          
     zopen("TEST.TXT",&File,1); // open "TEST.TXT "if file exist "TEST.TXT"     
                                // if not exist create it.
     findex=0; sector=0;          

     for(i='0';i<='9';i++) write(i);
     write(0x0d);          
     write(0x0a);          
     for(i='A';i<='Z';i++) write(i);
     write(0x0d);          
     write(0x0a);          
     if(findex<512) err=zwrite(&File,sector);
     if(!err) display(0,0,"TEST.TXT ready");
     else display(0,0,"File error");
     delay(2000);          
}

int main() 
{ 
signed char n=0, UpDown=0;

short i;
          
    i=ver();      
    sprintf(msg,"ZIOS ver %x.%2x",i>>8,i&0xFF);          
    display(0,0,&msg[0]);      
    delay(1500);
          
    while(1)      
     {
      cls(); // Clear screen        
      switch(menu(n))
        {
           case 2: { UpDown^=1; }
           case 1: { if (!UpDown) {n++; if (n>8) n=0;}
                     else {n--; if (n<0) n=8;} 
                     break;
                   }
           case 3: {
                     switch(n) 
                       {
                         case 0: { // Blinking Led demo
                                   blinkdemo();
                                   break;
                                 }                                   
                         case 1: { // PWM demo
                                   pwmdemo();
                                   break;
                                 }                                   
                         case 2: { // MEMS demo
                                   memsdemo();
                                   break;
                                 }                                   
                         case 3: { // DAC demo
                                   dacdemo();
                                   break;
                                 }                                   
                         case 4: { // ADC demo
                                   adcdemo();
                                   break;
                                 }                                   
                         case 5: { // RS232 demo
                                   RS232demo();
                                   break;
                                 }                                   
                         case 6: { // SPI demo
                                   SPIdemo();
                                   break;
                                 }                                   
                         case 7: { // SD Card demo1
                                   formatdemo();
                                   break;
                                 }                                   
                         case 8: { // SD Card demo2
                                   createdemo();
                                   break;
                                 }                                   
                       }
                     break;
                   }                     
        }       
     }               
}



Dosya okuma ve SD kart içindeki dosyalari listeleme  örneğini bir sonraki yazıda ele alacağım.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com