Ez gyorsan ment :D

     Elkészült az interruptos verzió is az egyikre elküldöm, másikon visszaküldi tipusú programból. Íme a forráskód:

#include "xparameters.h"

#include "stdio.h"

#include "xutil.h"

#include "xuartlite.h"

#include "xuartlite_l.h"

#include "xintc_l.h"

#include "xgpio.h"

//====================================================
// GLOBAL VARIABLES
//====================================================
unsigned int counter = 0;
unsigned int c2 = 0;
int buchstabe;
XGpio leds;
XUartLite serial;

//====================================================
// INTERRUPT HANDLER FUNCTION
//====================================================

void uart_interrupt_handler(void* addr_p)
{ 
    int empty;
        XGpio_DiscreteWrite(&leds, 1, 255);
            empty = XUartLite_IsReceiveEmpty(XPAR_RS232_SECOND_BASEADDR);
            if (empty == FALSE )
            buchstabe = XUartLite_RecvByte(XPAR_RS232_SECOND_BASEADDR);
        XGpio_DiscreteWrite(&leds, 1, buchstabe);
        xil_printf("%c",buchstabe);
}

int main()
{
    XGpio_Initialize(&leds, XPAR_LEDS_8BIT_DEVICE_ID);
    XGpio_SetDataDirection(&leds, 1,0x0);  
    XGpio_DiscreteWrite(&leds, 1, 1);
    
    XIntc_RegisterHandler(XPAR_XPS_INTC_0_BASEADDR,
                                 XPAR_INTC_0_UARTLITE_2_VEC_ID,
                                 (XInterruptHandler)uart_interrupt_handler,
                                 (void *)XPAR_RS232_SECOND_BASEADDR);    
    XGpio_DiscreteWrite(&leds, 1, 2);
    
    XIntc_MasterEnable(XPAR_XPS_INTC_0_BASEADDR);
    XGpio_DiscreteWrite(&leds, 1, 3);
    
    XIntc_EnableIntr(XPAR_XPS_INTC_0_BASEADDR, 0x1);
    XGpio_DiscreteWrite(&leds, 1, 4);
    
    XIntc_EnableIntr(XPAR_XPS_INTC_0_BASEADDR, XPAR_RS232_SECOND_INTERRUPT_MASK);
    XGpio_DiscreteWrite(&leds, 1, 5);
    
    XUartLite_Initialize(&serial,XPAR_RS232_SECOND_DEVICE_ID);
    XGpio_DiscreteWrite(&leds, 1, 6);
    
    XUartLite_SetRecvHandler(&serial,
                                     (XUartLite_Handler)  uart_interrupt_handler,  
                                     (void *)XPAR_RS232_SECOND_BASEADDR);  
    XGpio_DiscreteWrite(&leds, 1, 7);
    
    XUartLite_EnableInterrupt(&serial);  
    XGpio_DiscreteWrite(&leds, 1, 8);
    
    microblaze_enable_interrupts();
    XGpio_DiscreteWrite(&leds, 1, 9);
    while(1);
}


     Ez csak annyiban különbözik az ezelőtti verziótól, hogy itt az RS232_SECOND nevű soros porton érkező bitek generálnak egy megszakítást, amit az uart_lite_handler nevű függvény fog lekezelni. Ez a függvény beolvassa az érkezett biteket, berakja egy buchstabe nevű változóba, amit továbbküldünk az első soros porton keresztül. Persze a main()-ben meg kell adni a megfelelő címeket a megszakítások inicializálásához, illetve engedélyezni kell azt, hogy egyáltalán megszakítás érkezhessen.

     Ezen kívül meg össze kell kötni az interrupt vezérlőnek (xps_intc_0) az IRQ vonalát a microblaze processzor interrupt vonalával, valamint hozzá kell adni az interrupt vezérlőhöz a soros port interrupt vonalát (lásd ábra). A megfelelő predefinit változók neveit az projekt header állományában találjuk meg, (sajnos a header-nél szebb illetve magyarabb kifejezés nem jut eszembe), de ahhoz, hogy ott minden megjelenjen, először kell egy Build Projekt-et nyomni neki, hogy frissítse a header állományt, illetve írja bele azokat a dolgokat is, amiket megváltoztattunk.

     Ezek voltak az összeköttetések, a következő ábrán pedig egy részletet láthatunk a projekt headerből.



      A program működésének az eredménye :

     Most fogok neki C-ben leprogramozni a matlabos arcfelismerést. Ha az megvan, akkor megírom a kétirányú kommunikációt az FPGA-ra, ezen a két soros porton keresztül.

0 megjegyzés:

Megjegyzés küldése

Return top