DK-LM3S9B96 Kiti ile touch panel uygulaması

Başlatan yamak, 28 Temmuz 2011, 12:12:12

yamak

Bi süredir lm3s9b96 işlemcisi ile uğraşıyorum.ADC ,UART,LCD ekran kontrolü ve touch panel kontrolünü öğrenmek için aşağıdaki uygulamayı yaptım.Uygulama bir buton adc yi açıyo diğer buton ise uarttan gelene sistem saatini gösteriyo.


Uygulamada stellarisware kütüphanelerini kullandım.Gerçekten mükkemmel hazırlanmış.Bu uygualamada dikkat edilmesi gereken en önemli ve beni en çok uğraştıran startup.s dosyasında defaul olarak 100byte ayarlanmış stack i 400 byte olarak değiştirmektir.Eğer değiştirilmezse program sürekli kitleniyo.Bunu bulmak için birsürü zaman harcadım :).
#include "inc/lm3s9b96.h"
#include "inc/hw_types.h"
#include "inc/hw_memmap.h"
#include "inc/hw_ints.h"
#include "inc/hw_nvic.h"
#include "driverlib/timer.h"
#include "driverlib/sysctl.h"
#include "driverlib/gpio.h"
#include "driverlib/systick.h"
#include "driverlib/adc.h"
#include "driverlib/pwm.h"
#include "driverlib/interrupt.h"
//#include "inc/yusuf_delay.h"
#include "driverlib/uart.h"
#include "grlib/grlib.h"
#include "drivers/kitronix320x240x16_ssd2119_8bit.h"
#include "drivers/set_pinout.h"
#include "driverlib/watchdog.h"
#include "grlib/widget.h"
#include "grlib/canvas.h"
#include "drivers/touch.h"
#include "grlib/pushbutton.h"
#include <stdio.h>
unsigned long deger[1];
unsigned char gelen[16];
unsigned char f[8]=" ";
int tam,kusurat,sonuc,i=0,s,sayac=0,w=0,EskiSonuc;
tContext g_sContext;
tRectangle sRect;
extern tCanvasWidget ArkaPlan;
extern tPushButtonWidget GosterSaat,GosterAdc;
int bool1=0,bool2=0;
tContext g_sContext;
tRectangle sRect;
void BtnBasildiMi(tWidget *pWidget);
void BtnBasildiMi2(tWidget *pWidget);
Canvas(Baslik, &ArkaPlan, 0, &GosterSaat,
       &g_sKitronix320x240x16_SSD2119, 0, 0, 320, 23,
       (CANVAS_STYLE_FILL | CANVAS_STYLE_OUTLINE | CANVAS_STYLE_TEXT),
       ClrDarkBlue, ClrWhite, ClrWhite, &g_sFontCm20, "Yusuf Yamak Touch Panel", 0, 0);
Canvas(ArkaPlan, WIDGET_ROOT, 0, &Baslik,
       &g_sKitronix320x240x16_SSD2119, 0, 23, 320, (240 - 23),
       CANVAS_STYLE_FILL, ClrBlack, 0, 0, 0, 0, 0, 0);
Canvas(Saat, &GosterSaat, 0, 0,
       &g_sKitronix320x240x16_SSD2119, 110, 30, 100, 25,
       (CANVAS_STYLE_OUTLINE|CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT),
       ClrBlack, 0, ClrAquamarine  , &g_sFontCm20,gelen, 0, 0);
Canvas(adc, &GosterAdc, 0, 0,
       &g_sKitronix320x240x16_SSD2119, 60, 150, 200, 25,
       (CANVAS_STYLE_OUTLINE|CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT),
       ClrBlack, 0,ClrAquamarine  , &g_sFontCm20,f, 0, 0);
RectangularButton(GosterSaat, &Baslik,0,&GosterAdc,
                  &g_sKitronix320x240x16_SSD2119, 60, 60, 200, 30,
                  (PB_STYLE_OUTLINE | PB_STYLE_TEXT_OPAQUE | PB_STYLE_TEXT |
                   PB_STYLE_FILL | PB_STYLE_RELEASE_NOTIFY),
                   ClrDarkBlue, ClrBlue, ClrWhite, ClrWhite,
                   &g_sFontCmss20b, "SAATI GOSTER", 0, 0, 0, 0, BtnBasildiMi);
RectangularButton(GosterAdc,&GosterSaat,0, 0,
                  &g_sKitronix320x240x16_SSD2119, 60, 100, 200, 30,
                  (PB_STYLE_OUTLINE | PB_STYLE_TEXT_OPAQUE | PB_STYLE_TEXT |
                   PB_STYLE_FILL | PB_STYLE_RELEASE_NOTIFY),
                   ClrDarkBlue, ClrBlue, ClrWhite, ClrWhite,
                   &g_sFontCmss20b, "ADC AC", 0, 0, 0, 0, BtnBasildiMi2); 
void BtnBasildiMi(tWidget *pWidget)
{
   bool1=!bool1;
   if(bool1==1)
   {
        WidgetAdd((tWidget *)&GosterSaat, (tWidget *)&Saat);
		PushButtonTextSet(&GosterSaat, "SAATI GIZLE");
		WidgetPaint((tWidget *)&GosterSaat);
   }
   else
   {
   		WidgetRemove((tWidget *)&Saat);
		PushButtonTextSet(&GosterSaat, "SAATI GOSTER");
		WidgetPaint(WIDGET_ROOT);
   }													
}
void BtnBasildiMi2(tWidget *pWidget)
{
   bool2=!bool2;
   if(bool2==1)
   {
        WidgetAdd((tWidget *)&GosterAdc, (tWidget *)&adc);
		PushButtonTextSet(&GosterAdc, "ADC KAPAT");
		WidgetPaint((tWidget *)&GosterAdc);
		ADCSequenceEnable(ADC1_BASE, 1);
		ADCIntEnable(ADC1_BASE, 1);
	    ADCIntClear(ADC1_BASE, 1);
   }
   else
   {
   		ADCSequenceDisable(ADC1_BASE, 1);
   		WidgetRemove((tWidget *)&adc);
		PushButtonTextSet(&GosterAdc, "ADC AC");
		WidgetPaint(WIDGET_ROOT);
   }													
}  
void WriteGettingData(void)
{
    int j=0;
	while(UARTCharsAvail(UART0_BASE))
	{
	  gelen[j]=UARTCharGetNonBlocking(UART0_BASE);
	  if(gelen[j]=='!')
	  {
	    sRect.sXMin = 0;
        sRect.sYMin = 10;
        sRect.sXMax = 200;
        sRect.sYMax = 50;
		GrContextForegroundSet(&g_sContext, ClrBlack);
		GrRectFill(&g_sContext, &sRect);
		return;
	  }
	  j++; 
	}
}
void SysTickIntHandler(void)
{
	sayac++;
	w=0;
	if(sayac==1001)
	sayac=0;
}
void send_string(unsigned char *str)
{
            while(*str!=0)
			{
            UARTCharPut(UART0_BASE,*str++);

			}
			UARTCharPut(UART0_BASE,13);
			UARTCharPut(UART0_BASE,10);                  

}
void AdcInit(void)
{
     SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC1);
	 GPIOPinTypeADC(GPIO_PORTB_BASE, GPIO_PIN_4);
	 ADCSequenceConfigure(ADC1_BASE, 1, ADC_TRIGGER_PROCESSOR, 0);
     ADCSequenceStepConfigure(ADC1_BASE, 1, 0, ADC_CTL_CH10 | ADC_CTL_IE|ADC_CTL_END);
	 ADCSequenceEnable(ADC1_BASE, 1);
}
void UartInit(void)
{
     SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
	 GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
	 UARTConfigSetExpClk(UART0_BASE, SysCtlClockGet(),19200,(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |UART_CONFIG_PAR_NONE));	
}
void SystemTickInit(void)
{
     SysTickPeriodSet(SysCtlClockGet()/10);
	 SysTickIntEnable();
     SysTickEnable();	
}
int main(void)
{
	 int j;
	 for(j=0;j<1000000;j++)
	 {
	 }
	 SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN |SYSCTL_XTAL_16MHZ);
	 PinoutSet();
	 GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE,GPIO_PIN_3);
	 AdcInit();
	 UartInit();
	 SystemTickInit();
	 Kitronix320x240x16_SSD2119Init();
	 GrContextInit(&g_sContext, &g_sKitronix320x240x16_SSD2119);
	 TouchScreenInit();
	 TouchScreenCallbackSet(WidgetPointerMessage);
	 WidgetAdd(WIDGET_ROOT, (tWidget *)&ArkaPlan);
	 WidgetPaint(WIDGET_ROOT);
	 while(1)
	 {
	    WidgetMessageQueueProcess();
	 	if(sayac%5==0)
		{
		if(UARTCharsAvail(UART0_BASE))
		{   
		    if(bool1==1)
			{
			WidgetRemove((tWidget *)&Saat);
		    WidgetAdd((tWidget *)&GosterSaat, (tWidget *)&Saat);
			WidgetPaint((tWidget *)&Saat);
			}
			if(UARTCharGetNonBlocking(UART0_BASE)=='#')
			{
		     WriteGettingData();
			}
	    } 
			if(bool2==1)
		{
		ADCProcessorTrigger(ADC1_BASE, 1);
	    if(!ADCIntStatus(ADC1_BASE, 1, false))
		{
		   send_string(f);
		}  
		else
		{
		ADCSequenceDataGet(ADC1_BASE,1,deger);
		sonuc=(deger[0]*3000)/1024;
		tam=sonuc/1000;
		kusurat=sonuc%1000;
		if(sonuc>EskiSonuc+10||sonuc<EskiSonuc-10)
		{
		sprintf(f,"Gerilim: %d,%d v",tam,kusurat);
		send_string(f);
	    WidgetRemove((tWidget *)&adc);
		WidgetAdd((tWidget *)&GosterAdc, (tWidget *)&adc);
		WidgetPaint((tWidget *)&adc);
		EskiSonuc=sonuc;
		}
		}
		} 
		}	
	 }
}

fatihinanc

Elinize sağlık hocam güzel bir çalışma olmuş.

Uygulamada birşey dikkatimi çekti. ADC gerilim değeri ekranda hiç oyanama yapmıyor.
Bunu sebebi ADC donanımının çok iyi olmasından mı yoksa gecikmeler mi acaba ?
Yoksa yazılımsal bir filtre mi yaptınız ?
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

yamak

Normalde oynuyodu tam yüklemeden önce kodda küçük bi değişlik yaptım :).Kodların sonunda farkettiyseniz ekrana yazdırma koşulu koydum.Eğer önceki gerilimden 10mv fazla ise ya da düşük ise yazdır diye bi kaç satır ekledim.

fatihinanc

Anladım.
Kodlar gözüme biraz fazla göründüğü için pek dikkat etmedim doğrusu :)
Bilgilendirme için teşekkürler...
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

yamak


EMG81

#5
---

yamak

sprintf komutu bi string ifade bi diziye kopyalamaya yazıyo.Nasıl printf ekrana yazıyosa bu da bir diziye yazıyo.Kitap olarak önerebileceğim Kaan Arslan ın A dan Z ye C kılavuzu diye bi kitabı var ona bakabilirsiniz.Bir de başka bir öneri de bulunacak olursam internette ya da başka biyerde görüp de bilmediğiniz bi kod olursa kesinlikle araştırıp ne işe yaradığına bakın.Bu şekilde baya bi geliştirirsiniz kendiniz bu konuda.

yamak

#7
Bugun stajim bitti 20 gundur bu kitle yatip kalkiyom.sirkete kiti birakirken cok koydu bana sanki bi organimi kaybetmisim
gibi geldi  :(

OptimusPrime

#8
en heyecanlı yerinde bitmiş. :) WIDGET_ROOT kısmı. :)

gördüğüm kadarıylada widget yapısı biraz kafanı karıştırmış. canvas ve button struct kullanarak daha rahat oluşturabilirdin aslında. mesela arka planı parent olarak belirlerdin sonrasında gelen her canvas ve button yapıları birbirinin next i olurdu. gibi.

bir de UARTCharGetNonBlocking gibi api leri rom dan da çağırabilirsin. bunun gibi apilerin hepsi rom da tanımlı dolayısı ile daha az kod alını ile aynı işi yapabilirsin...
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

yamak

Çok fazla uğraşma şansım olmadı.Bu uygulama da 3-4 günde elde edilen bilginin sonucunda yaptığım bir uygulama. Söylediklerinizde haklısınız.Keşke kit bende olsaydı da deneyebilseydim.