Farklı pinlerin port oluşturması

Başlatan cyhn41, 25 Haziran 2016, 13:18:57

cyhn41

Merhabalar
Lcd yi bir port üzerinden değilde farklı portlardan seçilmiş pinler üzerinden sürmek istiyorum. Bu pinlerle nasıl port oluşturabilirim?

sadogan

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.

cyhn41

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.

sadogan

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.

cyhn41

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.

sadogan

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;
 
     

cyhn41

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.

z

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.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

cyhn41

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

cyhn41

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?

cyhn41

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ı?

z

İ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.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

cyhn41

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.