STM32 ve LCD Besleme Ortak Topraklama?

Başlatan NaMcHo, 16 Nisan 2011, 09:12:33

NaMcHo

LCD mi +5V ile besliyorum güç kaynağım ile STM32 mide USB ile PC den,lcd portlarına giden stm32 portlarını ise beyzlerine 92k lık dirençli transistörlerle sürdüm kollektörlerinede +5v gidiyor aynı güç kaynağından kollektörlerdende lcd data girişlerine bağladım,sorun ise şu lcdye herhangi bir bilgi geldiğinde transistör beyzlerindeki voltaj -2.9V oluyor bunu STM32 ve Güç kaynağımın topraklarını aynı yere atarak düzeltebilirmiyim?yoksa başka birşey mi yapmalıyım?

fatihkuzucu

Exp.Kits http://tinyurl.com/3qhs8pm   Küçük adamların, küçük fikirleri... Büyük adamların, büyük hayalleri...

NaMcHo

#2
Evet 3.3v da çalısıyor

fatihkuzucu

Data olarak 3.3v seviyesini kabul eden lcdler var. O tip lcd kullan.
Exp.Kits http://tinyurl.com/3qhs8pm   Küçük adamların, küçük fikirleri... Büyük adamların, büyük hayalleri...

NaMcHo

A) No display after initialization and data sent.
Probable cause:
1. VO voltage not properly set. Check specification. Some displays require a negative voltage at this
pin. Set up VO with potentiometer that will adjust over full range from VDD to VSS, or VDD to VEE
(-5VDC). (See Power Supply Section).
2. Timing violated. Check that all set up times are followed. check that Enable pulse must be 450nS
minimum.
3. Execution times violated. Do not send signals for 15mS after power up. Allow 1.6mS after Clear
and Return Home Instructions are sent; 40mS after other instructions and the data are sent.
4. Improper initialization. It's always a good idea to send an initialization routine after power up. The
internal routine leaves the display in the OFF condition.
5. Do not store in direct sunlight.
6. If leakage of the liquid crystal material should occur, all contact with this material, particularly
ingestion, must be avoided. If skin or clothing becomes contaminated, wash thoroughly with soap
and water.
7. Display misconnected. Check all connections. Ensure no I/O pads are bridged.
8. Signal levels incorrect. Insure data bus components have CMOS or TTL level outputs. Measure
2.4VDC min. for logic high and I/O connections on display.

9. Power supply out of tolerance or "dirty". Check +5VDC and ground.

8.maddede 2.4Volta kadar çalışabilir diyor bunun datasheetinde eğer bu elimdeki LCD gerçekten LM016L ise:) transistörsüz deniyim sonucu yazim buraya.

NaMcHo

#5
main.c
#include <stm32f10x.h>
#include "LCD.h"

void rcc_init(void);
void delay(unsigned long gecikme);

int main(void)
{
	rcc_init();

	GPIOC->CRL &= 0x00000000;
	GPIOC->CRL = 0x00000003;
	GPIOC->CRH &= 0x00000000;				//PORTC 8,9 bits are Output mode 
	GPIOC->CRH = 0x00000033;
	GPIOA->CRL &= 0x00000000;
	GPIOA->CRL = 0x33333333;
	GPIOC->ODR = 0x00000001;
	lcd_hazirla();
	imlec(1,2);
	lcd_karakter('A');
	imlec(2,1); 
	lcd_yaz("ASDASDASD");
	delay(0x00FFFFFF);
	for(;;)
	{
		GPIOC->ODR |= 0x00000300;
		delay(0x0005ffff);
		GPIOC->BRR = 0x00000300;
		delay(0x0005ffff);
	}
}
void rcc_init(void)
{
	RCC->CR |= 0x00030000;					//HSEON=1
	while(!(RCC->CR & 0x00020000));	  		//Wait to HSE be stabilized
	RCC->CIR |= 0x00080000;					//HSERDYC: HSE ready interrupt cleared
	RCC->CR |= 0x00080000; 					//Clock security system Enabled.
	RCC->CIR |= 0x00800000;					//CSSC: Clock security system interrupt cleared.
	RCC->CR |= 0x00040000;					//HSE bypassed.

//	RCC->APB2RSTR |= 0x000000FC;		   	//PORT A,B,C,D,E Resetlendi.
	RCC->CFGR |= 0x00000005; 				//SW[1:0]=01: HSE selected as system clock  
											//SWS[3:2]=01: HSE oscillator used as system clock
	RCC->CFGR |= 0x00000080;				//AHB configuration -> 1000: SYSCLK divided by 2
	RCC->CFGR |= 0x00002000; 				//APB2 configuration -> 100: HCLK divided by 2
	RCC->APB2ENR |= 0x00000014;	 			// PORT C,A Clock Enabled.

}

void delay(unsigned long gecikme)
{
	while(gecikme--);
}


LCD.c
#include <stm32f10x.h>
#include "LCD.h"

void lcd_hazirla(void)
{
	lcd_komut(0x00000002);
	lcd_komut(0x00000028);
	lcd_komut(0x00000006);
	lcd_komut(0x00000008);
	lcd_komut(0x0000000C);
	lcd_komut(0x00000001);
	gecikme(0x0000ffff);					//3ms gecikme.	
}
void lcd_yaz(const unsigned char string[])
{
	unsigned char x=0;
	while(string[x]!='\0')
	{
		gecikme(0x0000ffff);
		lcd_karakter(string[x]);
		x++;
	} 
}
void imlec(unsigned char satir,unsigned char sutun)
{
	if(satir==1)
	{
		lcd_komut(0x00000080 +(sutun-1));
	}
	else
	{
		lcd_komut(0x000000C0 + (sutun-1));
	}
}
void lcd_karakter(unsigned char veri)
{
	GPIOA->ODR=0x00000003;						//RS,E = High
	GPIOA->ODR |= (veri & 0x000000F0);					//Yuksek degerlikli 4 bit gonderiliyor.
	GPIOA->BRR=0x00000002;						//E = Low
	gecikme(0x0000ffff);
	GPIOA->BRR=0x000000F0;

	GPIOA->ODR |= 0x00000002;						//E = High
	GPIOA->ODR |= ((veri & 0x0000000F)<<4); 				//Dusuk degerlikli 4 bit gönderiliyor.
	GPIOA->BRR=0x00000002;						//E = Low
	gecikme(0x0000ffff);
	GPIOA->BRR=0x000000F0;
}
void lcd_komut(unsigned char komut)
{
	GPIOA->BRR = 0x00000001;
	GPIOA->ODR = 0x00000002;						//RS = 0, E=1	Yani komut gönderilecek lcdye.
	GPIOA->ODR |= (komut & 0x000000F0);
	GPIOA->BRR=0x00000002;						//E=0
	gecikme(0x0000ffff);
	GPIOA->BRR=0x000000F0;
	
	GPIOA->ODR=0x00000002;						//E=1
	GPIOA->ODR |= ((komut & 0x0000000F)<<4);
	GPIOA->BRR=0x00000002;						//E=0
	gecikme(0x0000ffff);
	GPIOA->BRR=0x000000F0;						
}
void lcd_temizle(void)
{
	lcd_komut(0x00000001);
	gecikme(0x0000ffff);
}

void gecikme(unsigned long x)
{

	while(x--);
}


LCD.h
/*------ACIKLAMA-------
--RS=GPIOA.bit0
--RW=Toprak STM32 nin toprağında
--E=GPIOA.bit1
--D4,D5,D6,D7 = GPIOA.bit4,5,6,7
*/

extern void lcd_hazirla(void);
extern void lcd_yaz(const unsigned char string[]);
extern void imlec(unsigned char satir,unsigned char sutun);
extern void lcd_karakter(unsigned char veri);
extern void lcd_komut(unsigned char komut);
extern void lcd_temizle(void);
extern void gecikme(unsigned long gecikme);


Hala daha LCD diye birşey yazdıramadım,kitin üzerindeki ledler düzgün yanıp sönüyor, aceba lcd kütüphanesindemi bir sorun var dicem debug yapıp kontrol ettim sürekli doğru veriler gidiyor, aceba sorun nerden kaynaklanıyor olabilir?
Eğer gerek varsa video cekip yollayabilirim,Birde LCD çalısıyor cunki diktörtgenler çıkıyor beslemeyi verdiğimde.

Mucit23

Bildiğim kadarıyla dikdörgenler çıkması demek lcd ye veri gelmediği anlamına geliyor

CLR

Alıntı yapılan: NaMcHo - 16 Nisan 2011, 11:41:59
main.c
#include <stm32f10x.h>
#include "LCD.h"

void rcc_init(void);
void delay(unsigned long gecikme);

int main(void)
{
	rcc_init();

	GPIOC->CRL &= 0x00000000;
	GPIOC->CRL = 0x00000003;
	GPIOC->CRH &= 0x00000000;				//PORTC 8,9 bits are Output mode 
	GPIOC->CRH = 0x00000033;
	GPIOA->CRL &= 0x00000000;
	GPIOA->CRL = 0x33333333;
	GPIOC->ODR = 0x00000001;
	lcd_hazirla();
	imlec(1,2);
	lcd_karakter('A');
	imlec(2,1); 
	lcd_yaz("ASDASDASD");
	delay(0x00FFFFFF);
	for(;;)
	{
		GPIOC->ODR |= 0x00000300;
		delay(0x0005ffff);
		GPIOC->BRR = 0x00000300;
		delay(0x0005ffff);
	}
}
void rcc_init(void)
{
	RCC->CR |= 0x00030000;					//HSEON=1
	while(!(RCC->CR & 0x00020000));	  		//Wait to HSE be stabilized
	RCC->CIR |= 0x00080000;					//HSERDYC: HSE ready interrupt cleared
	RCC->CR |= 0x00080000; 					//Clock security system Enabled.
	RCC->CIR |= 0x00800000;					//CSSC: Clock security system interrupt cleared.
	RCC->CR |= 0x00040000;					//HSE bypassed.

//	RCC->APB2RSTR |= 0x000000FC;		   	//PORT A,B,C,D,E Resetlendi.
	RCC->CFGR |= 0x00000005; 				//SW[1:0]=01: HSE selected as system clock  
											//SWS[3:2]=01: HSE oscillator used as system clock
	RCC->CFGR |= 0x00000080;				//AHB configuration -> 1000: SYSCLK divided by 2
	RCC->CFGR |= 0x00002000; 				//APB2 configuration -> 100: HCLK divided by 2
	RCC->APB2ENR |= 0x00000014;	 			// PORT C,A Clock Enabled.

}

void delay(unsigned long gecikme)
{
	while(gecikme--);
}


LCD.c
#include <stm32f10x.h>
#include "LCD.h"

void lcd_hazirla(void)
{
	lcd_komut(0x00000002);
	lcd_komut(0x00000028);
	lcd_komut(0x00000006);
	lcd_komut(0x00000008);
	lcd_komut(0x0000000C);
	lcd_komut(0x00000001);
	gecikme(0x0000ffff);					//3ms gecikme.	
}
void lcd_yaz(const unsigned char string[])
{
	unsigned char x=0;
	while(string[x]!='\0')
	{
		gecikme(0x0000ffff);
		lcd_karakter(string[x]);
		x++;
	} 
}
void imlec(unsigned char satir,unsigned char sutun)
{
	if(satir==1)
	{
		lcd_komut(0x00000080 +(sutun-1));
	}
	else
	{
		lcd_komut(0x000000C0 + (sutun-1));
	}
}
void lcd_karakter(unsigned char veri)
{
	GPIOA->ODR=0x00000003;						//RS,E = High
	GPIOA->ODR |= (veri & 0x000000F0);					//Yuksek degerlikli 4 bit gonderiliyor.
	GPIOA->BRR=0x00000002;						//E = Low
	gecikme(0x0000ffff);
	GPIOA->BRR=0x000000F0;

	GPIOA->ODR |= 0x00000002;						//E = High
	GPIOA->ODR |= ((veri & 0x0000000F)<<4); 				//Dusuk degerlikli 4 bit gönderiliyor.
	GPIOA->BRR=0x00000002;						//E = Low
	gecikme(0x0000ffff);
	GPIOA->BRR=0x000000F0;
}
void lcd_komut(unsigned char komut)
{
	GPIOA->BRR = 0x00000001;
	GPIOA->ODR = 0x00000002;						//RS = 0, E=1	Yani komut gönderilecek lcdye.
	GPIOA->ODR |= (komut & 0x000000F0);
	GPIOA->BRR=0x00000002;						//E=0
	gecikme(0x0000ffff);
	GPIOA->BRR=0x000000F0;
	
	GPIOA->ODR=0x00000002;						//E=1
	GPIOA->ODR |= ((komut & 0x0000000F)<<4);
	GPIOA->BRR=0x00000002;						//E=0
	gecikme(0x0000ffff);
	GPIOA->BRR=0x000000F0;						
}
void lcd_temizle(void)
{
	lcd_komut(0x00000001);
	gecikme(0x0000ffff);
}

void gecikme(unsigned long x)
{

	while(x--);
}


LCD.h
/*------ACIKLAMA-------
--RS=GPIOA.bit0
--RW=Toprak STM32 nin toprağında
--E=GPIOA.bit1
--D4,D5,D6,D7 = GPIOA.bit4,5,6,7
*/

extern void lcd_hazirla(void);
extern void lcd_yaz(const unsigned char string[]);
extern void imlec(unsigned char satir,unsigned char sutun);
extern void lcd_karakter(unsigned char veri);
extern void lcd_komut(unsigned char komut);
extern void lcd_temizle(void);
extern void gecikme(unsigned long gecikme);


Hala daha LCD diye birşey yazdıramadım,kitin üzerindeki ledler düzgün yanıp sönüyor, aceba lcd kütüphanesindemi bir sorun var dicem debug yapıp kontrol ettim sürekli doğru veriler gidiyor, aceba sorun nerden kaynaklanıyor olabilir?
Eğer gerek varsa video cekip yollayabilirim,Birde LCD çalısıyor cunki diktörtgenler çıkıyor beslemeyi verdiğimde.


Merhaba,

Kodlarında peripheral clockları açmamış görünüyorsun yani portları kullanıma açmalısın. Aşağıya tüm portları açan kodu ekledim,
sen hangi portu açmak istiyorsan sadece onları aktif edebilirsin

RCC->APB2ENR | = (u32) 0x7d;  // tüm portları enable eder

Knowledge and Experience are Power

NaMcHo

#8
Merhabalar
RCC->APB2ENR |= 0x00000014; ile A ve C portlarını açtım sadece.(rcc_init fonksiyonun icinde yazdım bunu.)
A portu LCD de C portuylada LED yakıp söndüruyorum.
Bit 4 IOPCEN: I/O port C clock enable
Set and cleared by software.
0: I/O port C clock disabled
1:I/O port C clock enabled
Bit 3 IOPBEN: I/O port B clock enable
Set and cleared by software.
0: I/O port B clock disabled
1:I/O port B clock enabled
Bit 2 IOPAEN: I/O port A clock enable
Set and cleared by software.
0: I/O port A clock disabled
1:I/O port A clock enabled
Bit 1 Reserved, always read as 0.
Bit 0 AFIOEN: Alternate function I/O clock enable
Set and cleared by software.
0: Alternate Function I/O clock disabled
1:Alternate Function I/O clock enabled



http://hotfile.com/dl/114634738/e7075fa/Video0014.3gp.html  Video çektim birde.