devreStellarisBeagleboneMerhaba arkadaşlar , bu yazımızda bir dönem kendimi geliştirirken yaptığım devreyi güzel bir projede değerlendirmek istedim.
Yazıyı uzun süre bekletmek istedim. Bunun sebebi biraz fikrimin değişmesinden dolayı.  Bu projede Tubitak tarafından bir dönemler Kendimiz Yapalım bölümünden bir hocamızın yaptığı bir projeyi geliştirmek amacıyla bu yazıyı yazmak istedim.  Sizler için çok faydalı olacaktır.Bu Proje sürdürmekte olduğum projemin bir küçük kısmıdır. İlerletmek size kalmaktadır.

 

 

Projemizde kullanacağımız lazer devresi :

http://www.biltek.tubitak.gov.tr/gelisim/elektronik/25.htm
Gördüğünüz üzere gayet güzel şekilde anlatmış hocamız. Bu konudan dolayı hocama’da teşekkür ediyorum bilgilendirdiği için.

Devre :

Devremizi kısaca inceleyecek olursak devremizde ldr ile üzerine düşen ışık seviyesini gerçek dijital bir değere cevirip bir FF ( Flipflop ) devre elemanıyla kontrol etmemizi sağlıyoruz . CD4027 ( FF ) ‘in 4.bacağında bir 10K görüyoruz ve reset butonu olduğunu görüyoruz. Bunun amacı devre kosulu eğer 1 yani engel tanırsa Buzzer üzerinden akım sağlandığını görüyor olacağız. Bu kısımda reset butonu durumu ilk haline getirmemizi sağlıyor ve pull-down işlevi görüyor ve 4.pin üzerinde 1 değeri gönderen gerilimi oluşturuyor.

Bu kısımda ben bu devreyi beaglebone’da kullanacağım için sürekli reset bilgisini gönderen 1 durumunda kalmasını istemem gayet doğal olup tuş kontrolünü sürekli fiziksel olarak takip etmekten dolayı doğan sıkıntıyı çözmüş oluyoruz.
4.Bacak düzeltmesi :

Gördüğünüz  en solda bir adet buzzer bulunmaktadır. Biz bu buzzer’i kaldırıp yanına beaglebone’umuzu koyarak devreyi tamamlamış olacağız.Kısaca fotoğraflarla devrenin düzeltme olmadanki  halini gösterecek olursak:

Video :

Bu kısıma kadar değiştirilmemiş şekilde basit bir lazer devresi iken bu devrede güzel bir değişim sağladıktan sonra projelerimizde kullanmak için tekrar tasarlamış olacağız.

Revizyon getirdiğim hali :

devreStellarisBeaglebone

Devremizde yaptığım revizyonu anlatacak olursak. Flip-flop’umuzun çıkışı olan 1.bacağı sinyalimizi ileteceğimiz yani ldr’den alınan bilgiyi ileten bacak olmaktadir. Bu bilgi basit Flip-Flop bilgisi edinmenizden ibarettir. Bu bilgi çıkış alınmaktadır. Bu bilgiyi Stellaris LM3S811 geliştirme kiti üzerinden ADC bilgisi okuduktan sonra bilgiyi değerlendirip Uart arayüzü ile beaglebone’a aktarılmaktadır. Dikkat etmeniz gereken değer voltajı 5V’a çekilmiş olmasıdır.

Projenin bu kısımdan sonraki kısmı sizin ihtiyacınıza göre tasarlamanız mümkündür. Sonuç olarak bilgi elinize gelecektir. İster log tutarsınız . İster GSM modül koyarak iletmeniz mümkündür.

Stellaris’te 4 Adet ADC arayüzü bulunmaktadır. Ancak bunlardan ancak bunlardan ADC0 pini Stellaris üzerindeki potansiyometreye bağlı bulunduğundan dolayı. 3 Adet kullanabilmekteyiz. Ben burada ADC1 pinini kullanmak istedim.
stellarisADCPin

Beaglebone’da ise 6 adet Uart arayüzü bulunmaktadır. Bunlardan 1 tanesi yine doğrudan USB port üzerinden aktarılmaktadır.Konsol port’u olarak geçmektedir. Ben bu bölümde UART1 pinini kullanmak istedim. Bunun içinde 24 ve 26.Pinleri kullanacağız.

Kurgu :

  • Lazer ile LDR arasına engel geldiği takdirde CD4027’nin 1 numaralı bacağı 1 veri iletecektir. Bu süre zarfında sürekli Reset bacağı yenilenecektir. Çünkü FF registerlarını temizlememiz gerekiyor. Bir sonraki durumu beklememek için sürekli veri alabilmek için.
  • Stellaris tarafından ADC okunup üzerinde bulunan OLED ekrana değeri yazılması  ve Uart0 arayüzünden verinin beaglebone’a gönderilmesi.
  • Beaglebone tarafından Uart’tan gelen verilerin okunması.

Öncelikle Stellaris üzerinde yaptığım kodlara odaklanacak olursak;

  • 1 adet Timer’ımız olacak ve bu timer 1sn’de bir interrupt’a girecek
  • Timer her interrupt’a girdiği zaman ADC’den veri istecek.
  • ADC verisi OLED üzerine yazılabilmesi için gerekli ayar yapılıp , değer ekranına yazılacak
  • Eğer değer 1023 , engel anına yani çıkış 5V ‘a denk geldiği takdirde bu değeri döndürecek ve HIRSIZ yazısını UART0 üzerinden gönderilecek.

Öncelikle sistem saatini kit üzerindeki frekans öteleyici “PLL” ile elde ediyoruz. PLL datasheet’e göre 200MHZ frekans elde etmemizi sağlıyoruz. Ancak bu değeri kullanmamızı kesinlikle istemiyorlar. Bu değer bir zaman sonra şaşırdığını not geçmişler. Bunun için bize kesin frekans için PLL’i 4’e bölmemizi uygun görmüşler. Bizde bu değeri sistem saatimize aktarıyoruz. ( 200/4 = 50MHZ )
PLL
Stellaris’te ADC’yi kontrol edebilmek için dediğimiz gibi bir adet timer kurmaliyiz. Bu Timer 1ms’de bir uyanan ve interrupt’a düşmelidir. Bu değeri istediğimiz gibi değiştirebiliriz. Ancak değeriniz sistem saatine yakın değerler olmasından kaçınınız. Çünkü siz timer’ı interrupt’a sokacak değere gelmeden o işlemini tamamlamış olacaktır ve bu istenilmeyen durumlara girecektir. Bunun için timer’ı düzenli bir değerde sabitlemelisiniz. Ben Timer 0’ı 16bit’lik pair’de kullanmayı ve periyodik olarak kendini yenilemesini istedim. Bu süreçte Timer 0’ın Timer B section’ını kullandım.

Stellaris’te ADC ayarlarından kısaca bahsedecek olursak ; ADC kontrol etmekten önce 4 adet sequence olduğunu bilmeliyiz. 1. sequence (dizi,bölüm) ‘de 8 adet step bulunmaktadır. 2. ve 3. sequence’lerde 4 adet örnek alabileceğimiz step bulunmaktadır. 4. sequence tek bir değer almaktadır.

Nedir peki bu sequence ve step ?
– Sequence ve stepleri şöyle düşünelim örneğin 3 değer almak istiyoruz ve bundan ilgili bir sonuç cıkarılması istiyoruz. Bunun için tek bir sequence’ye 3 adet step’e değerlerimizi gömmemiz gerekmektedir. Biz bu yazımızda tek adc okuyacağımız için 1.squence ve 1.step’i seçtim.
Tetikleme işlemini 1.,2.,3. sequence’ler timer ile yaparken 0.sequence’i işlemci tarafından tetikleme yapılır.

Stellaris’te UART işlemlerini anlatalım. Dediğimiz gibi Uart0 üzerinden port çıkışı alacağız. Bunun herhangi bir sebebi bulunmamaktadır. Amacım bilgisayara gelen verilerin beaglebone’a da gidip gitmediğini kontrol etmek amacıyla aynı değerleri girmek istedim. Uart işlemleri için ilk olarak Uart kullanılacak port işlemleri yapmak zorundasınız daha sonra Baund-Rate seçmelisiniz. Default değeri 57600‘dür.

Stellaris için kodun genel halini görecek olursak :
[codesyntax lang=”php” title=”main.c”]

#include "lm3s811.h"
#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/sysctl.h"
#include "driverlib/gpio.h"
#include "driverlib/interrupt.h"
#include "drivers/display96x16x1.h"
#include "uartstdio.h"
#include "driverlib/uart.h"
#include "driverlib/timer.h"
#include "driverlib/adc.h"
#include "driverlib/timer.h"

char adcDegerChar[9]; 
unsigned long adcDeger;	
int ekranTemizleyici = 0;

void TimerInterrupt()
{
		ADCProcessorTrigger(ADC_BASE, 0);	 //interrupt'i tetikliyoruz 0.sequence'inden
		ADCSequenceDataGet(ADC_BASE, 0, &adcDeger); //tetiklenen degeri okuyoruz ve adcDeger'e aktariyoruz
	  sprintf ( adcDegerChar, "deger:%4d", adcDeger );//bu kisimda degerleri ekrana yazabilmek icin int'ten char'a donusturuyoruz
	  Display96x16x1StringDraw(adcDegerChar, 0, 0);//donusturulen degerin ekrana yazilmasi
		SysCtlDelay(SysCtlClockGet()/12);//ekrana basilan degeri gormek için gerekli delay

		if ( adcDeger == 1023)//engel geldigi an
		{
			UARTprintf("HIRSIZZZ\n");//uart0'dan HIRSIZ yazisini basiyoruz.
			Display96x16x1StringDraw("HIRSIZZZ", 0, 1);//OLED üzerindede ikinci satirda HIRSIZ yazisini gösteriyoruz.
			ekranTemizleyici = 1; //HIRSIZ yazisini kaldirmak icin deger atiyoruz.
		}
		if(ekranTemizleyici == 1 && adcDeger != 1023){//engel olmadigi an ekrani temizliyoruz.
			Display96x16x1StringDraw("            ", 0, 1);//Bir önceki durum
			ekranTemizleyici = 0;  //temizleyiciyi default degeri cekiyoruz.
		}
		TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT); // Timer Interrupt'imizi temizliyoruz.
}

void timerAyar()
{
	SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0); // Timer 0 'e aktiflik izni veriyoruz.
	TimerConfigure(TIMER0_BASE, TIMER_CFG_16_BIT_PAIR | TIMER_CFG_B_PERIODIC); // 16bit pairli Timer 0'i Periyodik olarak ayarliyoruz.
	TimerLoadSet(TIMER0_BASE, TIMER_B,SysCtlClockGet()/1000);//Timer0'1 TIMER B modunda yani tek rakamlar icin 1ms'ye ayarliyoruz. 
	TimerIntEnable(TIMER0_BASE, TIMER_TIMB_TIMEOUT); // Timer0 'i Timer B'nin timeout'unda interrupt olacak sekilde ayarliyoruz
	IntEnable(INT_TIMER0B);//genel interruptlar'dan interrupt'i aciyoruz.
}

void adcAyar()
{
	SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC); // ADC'ye aktiflik izni veriyoruz.
	ADCSequenceDisable(ADC_BASE, 0); // Sequence'i tedbir olarak kapatiyoruz.
	ADCSequenceConfigure(ADC_BASE, 0, ADC_TRIGGER_PROCESSOR, 0); // Sequence 0'in 0.step'ini islemci tarafindan tetiklenecegini soyluyoruz
	ADCSequenceStepConfigure(ADC_BASE, 0, 0, ADC_CTL_CH1 | ADC_CTL_END);//Bu bölumun ADC1'den kontrol edecegimizi soyuyoruz.
	ADCSequenceEnable(ADC_BASE, 0); // ADC'yi aktif ediyoruz
}

int main()
{

	SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_6MHZ); //Sistem saati icin PLL'i 4'e bölüyoruz. 200/4=50MHZ

	Display96x16x1Init(true); //Ekran'i aktif ediyor hizini ayarliyoruz.

	SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); //Uart0 icin Port'a yi aktif ediyoruz.

	GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); // Port'a da uart icin kullanilacak pinleri belirliyoruz.

	SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); // Uart0 'i aktif ediyoruz

  UARTStdioInit(0); // Uart0 icin sistem konfigurasyonlarini ayarliyoruz

	timerAyar(); //timer'i ayarliyoruz.

	adcAyar(); // adc'yi ayarliyoruz

	TimerEnable(TIMER0_BASE, TIMER_B); //Timer'i aktif hale getiriyoruz.

	while(1)//sonsuz döngüye giriyoruz.
	{}	
}

[/codesyntax]
[codesyntax lang=”php” title=”Startup.s”]

; <<< Use Configuration Wizard in Context Menu >>>
;******************************************************************************
;
; Startup.s - Startup code for Stellaris.
;
; Copyright (c) 2011 Texas Instruments Incorporated.  All rights reserved.
; Software License Agreement
; 
; Texas Instruments (TI) is supplying this software for use solely and
; exclusively on TI's microcontroller products. The software is owned by
; TI and/or its suppliers, and is protected under applicable copyright
; laws. You may not combine this software with "viral" open-source
; software in order to form a larger program.
; 
; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT
; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY
; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
; DAMAGES, FOR ANY REASON WHATSOEVER.
; 
; This is part of revision 7860 of the Stellaris Peripheral Driver Library.
;
;******************************************************************************

;******************************************************************************
;
; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
;
;******************************************************************************
Stack   EQU     0x00000100

;******************************************************************************
;
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
;
;******************************************************************************
Heap    EQU     0x00000000

;******************************************************************************
;
; Allocate space for the stack.
;
;******************************************************************************
        AREA    STACK, NOINIT, READWRITE, ALIGN=3
StackMem
        SPACE   Stack
__initial_sp

;******************************************************************************
;
; Allocate space for the heap.
;
;******************************************************************************
        AREA    HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
HeapMem
        SPACE   Heap
__heap_limit

;******************************************************************************
;
; Indicate that the code in this file preserves 8-byte alignment of the stack.
;
;******************************************************************************
        PRESERVE8

;******************************************************************************
;
; Place code into the reset code section.
;
;******************************************************************************
        AREA    RESET, CODE, READONLY
        THUMB
		EXTERN TimerInterrupt
;******************************************************************************
;
; The vector table.
;
;******************************************************************************
        EXPORT  __Vectors
__Vectors
        DCD     StackMem + Stack            ; Top of Stack
        DCD     Reset_Handler               ; Reset Handler
        DCD     NmiSR                       ; NMI Handler
        DCD     FaultISR                    ; Hard Fault Handler
        DCD     IntDefaultHandler           ; MPU Fault Handler
        DCD     IntDefaultHandler           ; Bus Fault Handler
        DCD     IntDefaultHandler           ; Usage Fault Handler
        DCD     0                           ; Reserved
        DCD     0                           ; Reserved
        DCD     0                           ; Reserved
        DCD     0                           ; Reserved
        DCD     IntDefaultHandler           ; SVCall handler
        DCD     IntDefaultHandler           ; Debug monitor handler
        DCD     0                           ; Reserved
        DCD     IntDefaultHandler           ; PendSV Handler
        DCD     IntDefaultHandler           ; SysTick Handler
        DCD     IntDefaultHandler           ; GPIO Port A
        DCD     IntDefaultHandler           ; GPIO Port B
        DCD     IntDefaultHandler           ; GPIO Port C
        DCD     IntDefaultHandler           ; GPIO Port D
        DCD     IntDefaultHandler           ; GPIO Port E
        DCD     IntDefaultHandler           ; UART0 Rx and Tx
        DCD     IntDefaultHandler           ; UART1 Rx and Tx
        DCD     IntDefaultHandler           ; SSI0 Rx and Tx
        DCD     IntDefaultHandler           ; I2C0 Master and Slave
        DCD     IntDefaultHandler           ; PWM Fault
        DCD     IntDefaultHandler           ; PWM Generator 0
        DCD     IntDefaultHandler           ; PWM Generator 1
        DCD     IntDefaultHandler           ; PWM Generator 2
        DCD     IntDefaultHandler           ; Quadrature Encoder 0
        DCD     IntDefaultHandler           ; ADC Sequence 0
        DCD     IntDefaultHandler           ; ADC Sequence 1
        DCD     IntDefaultHandler           ; ADC Sequence 2
        DCD     IntDefaultHandler           ; ADC Sequence 3
        DCD     IntDefaultHandler           ; Watchdog timer
        DCD     IntDefaultHandler           ; Timer 0 subtimer A
        DCD     TimerInterrupt           ; Timer 0 subtimer B
        DCD     IntDefaultHandler           ; Timer 1 subtimer A
        DCD     IntDefaultHandler           ; Timer 1 subtimer B
        DCD     IntDefaultHandler           ; Timer 2 subtimer A
        DCD     IntDefaultHandler           ; Timer 2 subtimer B
        DCD     IntDefaultHandler           ; Analog Comparator 0
        DCD     IntDefaultHandler           ; Analog Comparator 1
        DCD     IntDefaultHandler           ; Analog Comparator 2
        DCD     IntDefaultHandler           ; System Control (PLL, OSC, BO)
        DCD     IntDefaultHandler           ; FLASH Control
        DCD     IntDefaultHandler           ; GPIO Port F
        DCD     IntDefaultHandler           ; GPIO Port G
        DCD     IntDefaultHandler           ; GPIO Port H
        DCD     IntDefaultHandler           ; UART2 Rx and Tx
        DCD     IntDefaultHandler           ; SSI1 Rx and Tx
        DCD     IntDefaultHandler           ; Timer 3 subtimer A
        DCD     IntDefaultHandler           ; Timer 3 subtimer B
        DCD     IntDefaultHandler           ; I2C1 Master and Slave
        DCD     IntDefaultHandler           ; Quadrature Encoder 1
        DCD     IntDefaultHandler           ; CAN0
        DCD     IntDefaultHandler           ; CAN1
        DCD     IntDefaultHandler           ; CAN2
        DCD     IntDefaultHandler           ; Ethernet
        DCD     IntDefaultHandler           ; Hibernate
        DCD     IntDefaultHandler           ; USB0
        DCD     IntDefaultHandler           ; PWM Generator 3
        DCD     IntDefaultHandler           ; uDMA Software Transfer
        DCD     IntDefaultHandler           ; uDMA Error
        DCD     IntDefaultHandler           ; ADC1 Sequence 0
        DCD     IntDefaultHandler           ; ADC1 Sequence 1
        DCD     IntDefaultHandler           ; ADC1 Sequence 2
        DCD     IntDefaultHandler           ; ADC1 Sequence 3
        DCD     IntDefaultHandler           ; I2S0
        DCD     IntDefaultHandler           ; External Bus Interface 0
        DCD     IntDefaultHandler           ; GPIO Port J
        DCD     IntDefaultHandler           ; GPIO Port K
        DCD     IntDefaultHandler           ; GPIO Port L
        DCD     IntDefaultHandler           ; SSI2 Rx and Tx
        DCD     IntDefaultHandler           ; SSI3 Rx and Tx
        DCD     IntDefaultHandler           ; UART3 Rx and Tx
        DCD     IntDefaultHandler           ; UART4 Rx and Tx
        DCD     IntDefaultHandler           ; UART5 Rx and Tx
        DCD     IntDefaultHandler           ; UART6 Rx and Tx
        DCD     IntDefaultHandler           ; UART7 Rx and Tx
        DCD     0                           ; Reserved
        DCD     0                           ; Reserved
        DCD     0                           ; Reserved
        DCD     0                           ; Reserved
        DCD     IntDefaultHandler           ; I2C2 Master and Slave
        DCD     IntDefaultHandler           ; I2C3 Master and Slave
        DCD     IntDefaultHandler           ; Timer 4 subtimer A
        DCD     IntDefaultHandler           ; Timer 4 subtimer B
        DCD     0                           ; Reserved
        DCD     0                           ; Reserved
        DCD     0                           ; Reserved
        DCD     0                           ; Reserved
        DCD     0                           ; Reserved
        DCD     0                           ; Reserved
        DCD     0                           ; Reserved
        DCD     0                           ; Reserved
        DCD     0                           ; Reserved
        DCD     0                           ; Reserved
        DCD     0                           ; Reserved
        DCD     0                           ; Reserved
        DCD     0                           ; Reserved
        DCD     0                           ; Reserved
        DCD     0                           ; Reserved
        DCD     0                           ; Reserved
        DCD     0                           ; Reserved
        DCD     0                           ; Reserved
        DCD     0                           ; Reserved
        DCD     0                           ; Reserved
        DCD     IntDefaultHandler           ; Timer 5 subtimer A
        DCD     IntDefaultHandler           ; Timer 5 subtimer B
        DCD     IntDefaultHandler           ; Wide Timer 0 subtimer A
        DCD     IntDefaultHandler           ; Wide Timer 0 subtimer B
        DCD     IntDefaultHandler           ; Wide Timer 1 subtimer A
        DCD     IntDefaultHandler           ; Wide Timer 1 subtimer B
        DCD     IntDefaultHandler           ; Wide Timer 2 subtimer A
        DCD     IntDefaultHandler           ; Wide Timer 2 subtimer B
        DCD     IntDefaultHandler           ; Wide Timer 3 subtimer A
        DCD     IntDefaultHandler           ; Wide Timer 3 subtimer B
        DCD     IntDefaultHandler           ; Wide Timer 4 subtimer A
        DCD     IntDefaultHandler           ; Wide Timer 4 subtimer B
        DCD     IntDefaultHandler           ; Wide Timer 5 subtimer A
        DCD     IntDefaultHandler           ; Wide Timer 5 subtimer B
        DCD     IntDefaultHandler           ; FPU
        DCD     IntDefaultHandler           ; PECI 0
        DCD     IntDefaultHandler           ; LPC 0
        DCD     IntDefaultHandler           ; I2C4 Master and Slave
        DCD     IntDefaultHandler           ; I2C5 Master and Slave
        DCD     IntDefaultHandler           ; GPIO Port M
        DCD     IntDefaultHandler           ; GPIO Port N
        DCD     IntDefaultHandler           ; Quadrature Encoder 2
        DCD     IntDefaultHandler           ; Fan 0
        DCD     0                           ; Reserved
        DCD     IntDefaultHandler           ; GPIO Port P (Summary or P0)
        DCD     IntDefaultHandler           ; GPIO Port P1
        DCD     IntDefaultHandler           ; GPIO Port P2
        DCD     IntDefaultHandler           ; GPIO Port P3
        DCD     IntDefaultHandler           ; GPIO Port P4
        DCD     IntDefaultHandler           ; GPIO Port P5
        DCD     IntDefaultHandler           ; GPIO Port P6
        DCD     IntDefaultHandler           ; GPIO Port P7
        DCD     IntDefaultHandler           ; GPIO Port Q (Summary or Q0)
        DCD     IntDefaultHandler           ; GPIO Port Q1
        DCD     IntDefaultHandler           ; GPIO Port Q2
        DCD     IntDefaultHandler           ; GPIO Port Q3
        DCD     IntDefaultHandler           ; GPIO Port Q4
        DCD     IntDefaultHandler           ; GPIO Port Q5
        DCD     IntDefaultHandler           ; GPIO Port Q6
        DCD     IntDefaultHandler           ; GPIO Port Q7
        DCD     IntDefaultHandler           ; GPIO Port R
        DCD     IntDefaultHandler           ; GPIO Port S
        DCD     IntDefaultHandler           ; PWM 1 Generator 0
        DCD     IntDefaultHandler           ; PWM 1 Generator 1
        DCD     IntDefaultHandler           ; PWM 1 Generator 2
        DCD     IntDefaultHandler           ; PWM 1 Generator 3
        DCD     IntDefaultHandler           ; PWM 1 Fault

;******************************************************************************
;
; This is the code that gets called when the processor first starts execution
; following a reset event.
;
;******************************************************************************
        EXPORT  Reset_Handler
Reset_Handler
        ;
        ; Call the C library enty point that handles startup.  This will copy
        ; the .data section initializers from flash to SRAM and zero fill the
        ; .bss section.
        ;
        IMPORT  __main

        IF      {CPU} = "Cortex-M4.fp"
        LDR     R0, =0xE000ED88           ; Enable CP10,CP11
        LDR     R1,[R0]
        ORR     R1,R1,#(0xF << 20)
        STR     R1,[R0]
        ENDIF

        B       __main

;******************************************************************************
;
; This is the code that gets called when the processor receives a NMI.  This
; simply enters an infinite loop, preserving the system state for examination
; by a debugger.
;
;******************************************************************************
NmiSR
        B       NmiSR

;******************************************************************************
;
; This is the code that gets called when the processor receives a fault
; interrupt.  This simply enters an infinite loop, preserving the system state
; for examination by a debugger.
;
;******************************************************************************
FaultISR
        B       FaultISR

;******************************************************************************
;
; This is the code that gets called when the processor receives an unexpected
; interrupt.  This simply enters an infinite loop, preserving the system state
; for examination by a debugger.
;
;******************************************************************************
IntDefaultHandler
        B       IntDefaultHandler

;******************************************************************************
;
; Make sure the end of this section is aligned.
;
;******************************************************************************
        ALIGN

;******************************************************************************
;
; Some code in the normal code section for initializing the heap and stack.
;
;******************************************************************************
        AREA    |.text|, CODE, READONLY

;******************************************************************************
;
; The function expected of the C library startup code for defining the stack
; and heap memory locations.  For the C library version of the startup code,
; provide this function so that the C library initialization code can find out
; the location of the stack and heap.
;
;******************************************************************************
    IF :DEF: __MICROLIB
        EXPORT  __initial_sp
        EXPORT  __heap_base
        EXPORT __heap_limit
    ELSE
        IMPORT  __use_two_region_memory
        EXPORT  __user_initial_stackheap
__user_initial_stackheap
        LDR     R0, =HeapMem
        LDR     R1, =(StackMem + Stack)
        LDR     R2, =(HeapMem + Heap)
        LDR     R3, =StackMem
        BX      LR
    ENDIF

;******************************************************************************
;
; Make sure the end of this section is aligned.
;
;******************************************************************************
        ALIGN

;******************************************************************************
;
; Tell the assembler that we're done.
;
;******************************************************************************
        END

[/codesyntax]

Arkadaşlar unutmayınız TimerInterrupt() fonksiyonumuzu Startup.s dosyasının içine ekliyoruz. Aksi halde programımız istenilen şekilde çalışmayacaktır.

Arkadaşlar sıra geldi beaglebone kısmında yapılacak şeylere. Beaglebone’da Uart’ı kullanabilmemiz için aktif etmemiz yeterli olacaktır. Kullanacağımız UART1 olduğundan dolayı /dev/ttyO1 section’ını konfigure etmemiz yeterlidir. Bildiğiniz üzere 6 adet Uart birimi olduğunu söyledik bunlar 0’dan başlayıp 5’e kadar gitmektedir. 0 doğrudan USB’ye bağlıdır. tty01 UART1’le bağlantılı haldedir.

$ echo 0 > /sys/kernel/debug/omap_mux/uart1_txd
$ echo 20 > /sys/kernel/debug/omap_mux/uart1_rxd

Bu iki kodu konsolda işlettiğimiz takdirde Uart’ta gerekli ayarlamayı yapmış olacağız. Geriye sadece izleme işlemini yapmamız kalacaktır.
Bunun için konsolda : $ screen /dev/ttyO1 yazmanız yeterli olacaktır.

Lazer için ben bide pcb tasarladım. Henüz geliştirme aşamasındayım. Basit ve kaba taslak şekilde çizmeye çalıştım. PCB çizim konusunda biraz fazla acemi olmamı lütfen mazur görünüz. : lazerDevre
Devreyi proteus 7.10‘da tasarladım.

Projeden kareler :

Proje Sonucu :

Arkadaşlar bir projemin daha sonuna geldik. Sorularınızı bekliyor olacağım. Çekinmeden sorabilirsiniz. Artık gerçeklediğim projelerin kısımlarını zaman içerisinde paylaşmaya çalışacağım. İstekleriniz olduğu takdirde mail adresimden yada direk buradan yorum kısmından yardımcı olmaya çalışırım. İyi çalışmalar diliyorum.

______
Gökhan TARIM
tarim.gokhan@gmail.com