Picproje Elektronik Sitesi

DERLEYİCİLER => Diğer Derleyiciler => KEIL => Konuyu başlatan: cyhn41 - 25 Haziran 2016, 13:18:57

Başlık: Farklı pinlerin port oluşturması
Gönderen: cyhn41 - 25 Haziran 2016, 13:18:57
Merhabalar
Lcd yi bir port üzerinden değilde farklı portlardan seçilmiş pinler üzerinden sürmek istiyorum. Bu pinlerle nasıl port oluşturabilirim?
Başlık: Ynt: Farklı pinlerin port oluşturması
Gönderen: sadogan - 25 Haziran 2016, 13:38:36
Lcd ye yazmak istediğin veri nin d0... d7 kadar bitlerini test edip
"1" ise bağlı pini "1" , "0" ise pini "0" yaparak oluşturabilirsin.
Başlık: Ynt: Farklı pinlerin port oluşturması
Gönderen: cyhn41 - 25 Haziran 2016, 13:42:51
Alıntı yapılan: sadogan - 25 Haziran 2016, 13:38:36
Lcd ye yazmak istediğin veri nin d0... d7 kadar bitlerini test edip
"1" ise bağlı pini "1" , "0" ise pini "0" yaparak oluşturabilirsin.
Hocam pin durumları programın akışına göre değiştiği için tek tek 1 se 1 , 0 sa 0 yapılamıyor.
Başlık: Ynt: Farklı pinlerin port oluşturması
Gönderen: sadogan - 25 Haziran 2016, 14:15:20
Alıntı yapılan: cyhn41 - 25 Haziran 2016, 13:42:51
Hocam pin durumları programın akışına göre değiştiği için tek tek 1 se 1 , 0 sa 0 yapılamıyor.
Bu danık pinlere başka rütinlerdemi yazıyor.
Başlık: Ynt: Farklı pinlerin port oluşturması
Gönderen: cyhn41 - 25 Haziran 2016, 14:33:58
Alıntı yapılan: sadogan - 25 Haziran 2016, 14:15:20
Bu danık pinlere başka rütinlerdemi yazıyor.
Hocam göndereceği veriye ve veriyi yazacagı satıra göre pin durumlarını saptamak neredeyse imkansız olup port halinde çalışmak gerekiyor. Ben tek portta çalışan uygulama yaptım, amacım farklı portlardaki pinleri port haline getirip yine port üzerinden çalışmak. Bu  noktada farklı portlardaki pinleri bit bit ayırmam ve bunu bir sanal porta tanımlamam gerekiyor. Sıkıntı bu noktada başlıyor.
Başlık: Ynt: Farklı pinlerin port oluşturması
Gönderen: sadogan - 25 Haziran 2016, 14:56:05
Bu yöntemi yıllardır kullanıyoruz, pin durumlarını saptamak imkansız gibi açıklamalar ön yargılı.

     if(0B10000000&dt)pin7=1;
      else  pin7=0;
     
      if(0B01000000&dt)pin6=1;
      else  pin6=0;
       
      if(0B00100000&dt)pin5=1;
      else  pin5=0;
       
      if(0B00010000&dt)pin4=1;
      else  pin4=0;
       
     
      if(0B00001000&dt)pin3=1;
      else  pin3=0;
       
      if(0B00000100&dt)pin2=1;
      else  pin2=0;
       
      if(0B00000010&dt)pin1=1;
      else  pin1=0;
       
      if(0B00000001&dt)pin0=1;
      else  pin0=0;
 
     
Başlık: Ynt: Farklı pinlerin port oluşturması
Gönderen: cyhn41 - 25 Haziran 2016, 15:26:38
Alıntı yapılan: sadogan - 25 Haziran 2016, 14:56:05
Bu yöntemi yıllardır kullanıyoruz, pin durumlarını saptamak imkansız gibi açıklamalar ön yargılı.

     if(0B10000000&dt)pin7=1;
      else  pin7=0;
     
      if(0B01000000&dt)pin6=1;
      else  pin6=0;
       
      if(0B00100000&dt)pin5=1;
      else  pin5=0;
       
      if(0B00010000&dt)pin4=1;
      else  pin4=0;
       
     
      if(0B00001000&dt)pin3=1;
      else  pin3=0;
       
      if(0B00000100&dt)pin2=1;
      else  pin2=0;
       
      if(0B00000010&dt)pin1=1;
      else  pin1=0;
       
      if(0B00000001&dt)pin0=1;
      else  pin0=0;
 
     
Teşekkürler hocam bu yöntemi kullanmaya çalışacağım.
Farklı portlardaki pinlerin port oluşturmasını da bilenlerden öğrenmek isterim.
Başlık: Ynt: Farklı pinlerin port oluşturması
Gönderen: z - 26 Haziran 2016, 10:20:27
LCD rutinlerini sen yazıyorsan ya da rutinlerde portu okuyan rutini değiştirme şansın varsa ortada problem yok.

Ayrık portun veri bitlerini maskele kaydır bir araya getir işlemi yapılacak sadece.
Başlık: Ynt: Farklı pinlerin port oluşturması
Gönderen: cyhn41 - 27 Haziran 2016, 13:00:15
Alıntı yapılan: z - 26 Haziran 2016, 10:20:27
LCD rutinlerini sen yazıyorsan ya da rutinlerde portu okuyan rutini değiştirme şansın varsa ortada problem yok.

Ayrık portun veri bitlerini maskele kaydır bir araya getir işlemi yapılacak sadece.
Lcd driveri elimde mevcut ben yazmadım hazır buldum sadece üzerinde bir kaç oynama ile driverde tanımlı olan GPIOB portu yerine keyfi seçeceğim pinler ile lcdyi sürmek istiyorum. 

void lcd_port_okuma (void)
{
D1 = GPIOA->IDR;  //D1 GPIO_PIN_3   GPIOA
D2 = GPIOA->IDR; //D2 GPIO_PIN_10  GPIOA
D3 = GPIOC->IDR;  //D3 GPIO_PIN_4   GPIOC
D4 = GPIOC->IDR;  //D4 PIO_PIN_8    GPIOC
E = GPIOB->IDR;   //E  GPIO_PIN_2   GPIOB
RS = GPIOB->IDR;  //RS GPIO_PIN_4   GPIOB
LCD_GPIO =LCD_GPIO | (RS<<10) | (E<<11) | (D1<<12) | (D2<<13) | (D3<<14) | (D4<<15);
}

Böyle bir fonksiyon yazdım ama bu tam istediğim kod olmadı, d1,d2,.. pinlerini LCD_GPIO adlı portun içine atmam gerekli,bunu yapamıyorum
Başlık: Ynt: Farklı pinlerin port oluşturması
Gönderen: cyhn41 - 27 Haziran 2016, 15:39:35
Alıntı yapılan: sadogan - 25 Haziran 2016, 14:56:05
Bu yöntemi yıllardır kullanıyoruz, pin durumlarını saptamak imkansız gibi açıklamalar ön yargılı.

     if(0B10000000&dt)pin7=1;
      else  pin7=0;
     
      if(0B01000000&dt)pin6=1;
      else  pin6=0;
       
      if(0B00100000&dt)pin5=1;
      else  pin5=0;
       
      if(0B00010000&dt)pin4=1;
      else  pin4=0;
       
     
      if(0B00001000&dt)pin3=1;
      else  pin3=0;
       
      if(0B00000100&dt)pin2=1;
      else  pin2=0;
       
      if(0B00000010&dt)pin1=1;
      else  pin1=0;
       
      if(0B00000001&dt)pin0=1;
      else  pin0=0;
 
     


void lcd_enable(void)
{
    //LCD_GPIO->ODR|=E;
   
int mask=0x0000;
    mask = mask | 0x0800;

    if ((mask&0x0400)==0x0400)
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_SET);
else
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_RESET);

    if ((mask&0x0800)==0x0800)
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET);
else
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET);

if ((mask&0x1000)==0x1000)
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);
else
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET);

if ((mask&0x2000)==0x2000)
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_10,GPIO_PIN_SET);
else
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_10,GPIO_PIN_RESET);

if ((mask&0x4000)==0x4000)
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_4,GPIO_PIN_SET);
else
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_4,GPIO_PIN_RESET);

if ((mask&0x8000)==0x8000)
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,GPIO_PIN_SET);
else
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,GPIO_PIN_RESET);

lcd_busy();
 
// LCD_GPIO->ODR&=~(E);

mask=0x0000;
    mask = mask | ~(0x0800);

    if ((mask&0x0400)==0x0400)
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_SET);
else
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_RESET);

    if ((mask&0x0800)==0x0800)
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET);
else
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET);

if ((mask&0x1000)==0x1000)
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);
else
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET);

if ((mask&0x2000)==0x2000)
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_10,GPIO_PIN_SET);
else
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_10,GPIO_PIN_RESET);

if ((mask&0x4000)==0x4000)
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_4,GPIO_PIN_SET);
else
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_4,GPIO_PIN_RESET);

if ((mask&0x8000)==0x8000)
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,GPIO_PIN_SET);
else
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,GPIO_PIN_RESET);


}

Böyle bir şey yaptım ama çalıştıramadım, acaba koşulumu yanlış yazdım?
Başlık: Ynt: Farklı pinlerin port oluşturması
Gönderen: cyhn41 - 29 Haziran 2016, 14:30:36
void lcd_yaz_pin (uint16_t bilgi)
{
if ((bilgi&0x0400)==0x0400)
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET); //RS
else
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET); //RS

if ((bilgi&0x0800)==0x0800)
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_SET); //E
else
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_RESET); //E

if ((bilgi&0x1000)==0x1000)
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET); //D1
else
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET); //D1

if ((bilgi&0x2000)==0x2000)
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_10,GPIO_PIN_SET); //D2
else
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_10,GPIO_PIN_RESET); //D2

if ((bilgi&0x4000)==0x4000)
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_4,GPIO_PIN_SET); //D3
else
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_4,GPIO_PIN_RESET); //D3

if ((bilgi&0x8000)==0x8000)
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,GPIO_PIN_SET); //D4
else
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,GPIO_PIN_RESET); //D4


}

Lcd farklı pinlerden sürmek için böyle bir fonksiyon yazdım çalıştıramadım. Başka bir yöntem önerebilecek biri var mı?
Başlık: Ynt: Farklı pinlerin port oluşturması
Gönderen: z - 29 Haziran 2016, 14:44:05
İlk önce dataları çık. 4/8 biti de çıktıktan sonra Reg Select ve Enable sinyallerini aktif et ardından Enable sinyalini pasif et.

Aksi takdirde sorun çıkar.

Sen tersini yapmışsın.
Başlık: Ynt: Farklı pinlerin port oluşturması
Gönderen: cyhn41 - 29 Haziran 2016, 14:57:42
void lcd_busy(void)
{
    unsigned long h=20000; // delay 32Mhz = 2000
    while(h--);
}
/***************************************************************************/
void lcd_yaz_pin (uint16_t bilgi)
{
if ((bilgi&0x0400)==0x0400)
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET); //RS
else
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET); //RS

if ((bilgi&0x0800)==0x0800)
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_SET); //E
else
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_RESET); //E

if ((bilgi&0x1000)==0x1000)
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET); //D1
else
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET); //D1

if ((bilgi&0x2000)==0x2000)
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_10,GPIO_PIN_SET); //D2
else
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_10,GPIO_PIN_RESET); //D2

if ((bilgi&0x4000)==0x4000)
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_4,GPIO_PIN_SET); //D3
else
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_4,GPIO_PIN_RESET); //D3

if ((bilgi&0x8000)==0x8000)
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,GPIO_PIN_SET); //D4
else
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,GPIO_PIN_RESET); //D4


}

void lcd_komut(unsigned char c)
{
    lcd_yaz_pin(0x03FF);// LCD_GPIO->ODR &=0x3FF;
    lcd_yaz_pin(((c&0xF0)<<8)); // LCD_GPIO->ODR |=(c&0xF0)<<8;
    lcd_enable();
    lcd_busy();
    lcd_yaz_pin(0x3FF); // LCD_GPIO->ODR &=0x3FF;
    lcd_yaz_pin((c<<0x0C)); // LCD_GPIO->ODR |= (c<<0x0C);
    lcd_enable();
    lcd_busy();
}
/***************************************************************************/
void veri_yolla(unsigned char byte)
{
    switch (byte)
    {
    case 'Ç' :
        byte=0x00;
        break;
    case 'I' :
        byte=0x01;
        break;
    case 'Ö' :
        byte=0x02;
        break;
    case 'S' :
        byte=0x03;
        break;
    case 'Ü' :
        byte=0x04;
        break;
    case 'ç' :
        byte=0x00;
        break;
    case 'i' :
        byte=0x01;
        break;
    case 'ö' :
        byte=0x02;
        break;
    case 's' :
        byte=0x03;
        break;
    case 'ü' :
        byte=0x04;
        break;
    default :
        break;
    }
    lcd_yaz_pin(0x3FF); //LCD_GPIO->ODR &=0x3FF;
    lcd_yaz_pin(((byte&0xF0)<<8)|RS);  //LCD_GPIO->ODR |= ((byte&0xF0)<<8)|RS;
    lcd_enable();
    lcd_busy();
    lcd_yaz_pin(0x3FF);  //LCD_GPIO->ODR &=0x3FF;
    lcd_yaz_pin((byte<<0x0C)|RS);  //LCD_GPIO->ODR |= (byte<<0x0C)|RS;
    lcd_enable();
    lcd_busy();
}
/***************************************************************************/
void lcd_clear(void)
{
    lcd_komut(0x1);
    HAL_Delay(5);
}
/***************************************************************************/
void lcd_yaz(const char *s)
{
    while(*s)
        veri_yolla(*s++);
}
/***************************************************************************/
void lcd_gotoxy(unsigned char x,unsigned char y)
{
    if(x==1)
        lcd_komut(0x80+((y-1)%16));
    else
        lcd_komut(0xC0+((y-1)%16));
}
/***************************************************************************/
void lcd_enable(void)
{
    lcd_yaz_pin(E);  //LCD_GPIO->ODR|=E;
    lcd_busy();
    lcd_yaz_pin(~(E)); //LCD_GPIO->ODR&=~(E);
}
/***************************************************************************/
/***************************************************************************/
/***************************************************************************/
void lcd_init()
{
    lcd_yaz_pin(0x03FF);  // LCD_GPIO->ODR &=0x03FF;
    HAL_Delay(100);
    lcd_komut(0x03);
    HAL_Delay(1);
    lcd_enable();
    HAL_Delay(1);
    lcd_enable();
    lcd_komut(0x02);
    HAL_Delay(1);
    lcd_komut(0x33);
    lcd_komut(0x32);
    lcd_komut(0x28);
    lcd_komut(0x0C);
    for(i=0; i<=7; i++) // tr karakter tanitiliyor
    {
        lcd_komut(adres);
        for(s=0; s<=7; s++)
        {
            veri_yolla(karakter_[i][s]);
        }
        adres=adres+8;
    }
    lcd_clear();
}

lcd_init programında öyle yapılıyor olması lazım yinede gözden kaçırmış olabilirim. Lcd rutinleri yukarıda ve lcd nin normalde bağlı olduğu pinler GPIOB 10..15 dir.