logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Zigbit Meshnetics ZDM-A1281-A2 Kompilacja pod AVR

pszewczyk 20 Lis 2009 22:17 2120 5
  • #1 7287775
    pszewczyk
    Poziom 10  
    Witam,

    Jestem w trakcie próby stworzenia programu dla tego modułu Meshnetics. Co prawda jest kilka aplikacji przykładowych dla tego układu ale ja chciałbym napisać program od podstaw, żeby dobrze zrozumieć ten stos. Napotkałem niestety trochę problemów i chciałbym Was poprosić o radę:

    1. Nie wiem jak skompilować program w AVR Studio nie wykorzystując makefile. Przy próbie kompilacji środowisko informuje mnie, że nie ma plików nagłówkowych (<zdo.h> itp). Próbowałem już na wszystkie sposoby załączyć te pliki w opcjach projektu ale nie dało rady. Jak to zrobić, żeby nie pisać makefile? Obecnie staram się wykorzystywać ramę projektu lowpower dla mojej aplikacji(czyli pliki makefile i configuration)

    2. Napisałem prosty program, którego zadaniem jest odpalenie co 30 sek. przerwania od Timera i wysłanie 4 literek po USART. Nie mogę tego skompilować, przy czym AVR Studio wyrzuca mi jakieś dziwne błędy. Gdzie tu jest błąd? Czy przyczyna tych błędów może mieć związek z pkt. 1, czyli błędnym załączeniem plików nagłówkowych wynikających z zapożyczonego makefile? :

    
    #include <taskManager.h>
    #include <zdo.h>
    #include <configServer.h>
    #include <aps.h>
    #include <stdio.h>
    #include <types.h>
    #include <appFramework.h>                               // Main stack types
    #include <mnHalTimer.h>
    #include <halAppClock.h>
    #include <usart.h>
    
    
    int testowa;
    //static ZDO_ZdpReq_t zdpLeaveReq;
    
    typedef enum {
    APP_INITING_STATE,           // Application initial state (after Power On or Reset)
    APP_STARTING_NETWORK_STATE,   // Joining network state
    APP_IN_NETWORK_STATE,    // Network available
    APP_I2C_TASK,				//rozpoczęcie komunikacji z przetwornikami
    } AppState_t;
    
    char send[100]; // any size maybe present
    AppState_t appState = APP_INITING_STATE;
    
    /***************************************
             USART DEFINITION
    ***************************************/
    
    static HAL_UsartDescriptor_t appUsartDescriptor
    {
    
    .mode = USART_MODE_ASYNC,
    .baudrate = USART_BAUDRATE_38400,
    .data = USART_DATA8,
    .parity = USART_PARITY_NONE,
    .stopbits = USART_STOPBIT_1,
    .syncMode = USART_CLK_MODE_MASTER,
    .rxBuffer = usartRxBuffer, 				// enable Rx
    .rxBufferLength = sizeof(usartRxBuffer),
    .txBuffer = NULL, 						// use callback mode
    .txBufferLength = 0,
    .rxCallback = rxCallback,
    .txCallback = txCallback,
    };
    
    
    static void ZDO_StartNetworkConf(ZDO_StartNetworkConf_t *confirmInfo)
    {
    
    	if (ZDO_SUCCESS_STATUS == confirmInfo->status)
    	{
    	appState = APP_IN_NETWORK_STATE;
    	SYS_PostTask(APL_TASK_ID);
    	}
    }
    
    
    void ZDO_WakeUpInd(void)
    {
    
    	if (APP_IN_NETWORK_STATE == appState)
    	{
    	appState = APP_STARTING_NETWORK_STATE;
    	SYS_PostTask(APL_TASK_ID);
    	}
    }
    
    void ZDO_MgmtNwkUpdateNotf(ZDO_MgmtNwkUpdateNotf_t *nwkParams)
    {
    
    }
    
    /***************************************
             TIMER DEFINITION
    ***************************************/
    
    
    static HAL_AppTimer_t SensorTimer {
    .interval = 30000,
    .mode = TIMER_REPEAT_MODE, 
    .callback = SensorTimerFired,
    };
    
    
    void SensorTimerFired(void)
    {
       appState = APP_I2C_TASK;
       
       SYS_PostTask(APL_TASK_ID);
    }
    
    
    /***************************************
             TaskHandler DEFINITION
    ***************************************/
    
    
    
    void APL_TaskHandler()
    {
    	switch (appState)
    	{
    	case APP_IN_NETWORK_STATE:
    	testowa=0;
    	break;
    
    	case APP_INITING_STATE: //node has initial state
    	break;
    
    	case APP_STARTING_NETWORK_STATE:
    	break;
    	
    	case APP_I2C_TASK:
    	HAL_OpenUsart(appUsartDescriptor);
    	HAL_WriteUsart(appUsartDescriptor,send,4); 	
    	HAL_CloseUsart(appUsartDescriptor);
    	break;
    	}
    }
    
    



    A oto informacje kompilatora:

    Cytat:

    src/lowpower.c:31: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token
    src/lowpower.c: In function 'ZDO_MgmtNwkUpdateNotf':
    src/lowpower.c:69: warning: unused parameter 'nwkParams'
    src/lowpower.c: At top level:
    src/lowpower.c:79: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token
    src/lowpower.c: In function 'APL_TaskHandler':
    src/lowpower.c:115: error: 'appUsartDescriptor' undeclared (first use in this function)
    src/lowpower.c:115: error: (Each undeclared identifier is reported only once
    src/lowpower.c:115: error: for each function it appears in.)
    make: *** [objs/lowpower.o] Error 1
    [/quote]
  • #2 7288259
    hagop
    Poziom 15  
    próbowałem to skompilować w eclipse + gcc u mnie nie ma prawie wszystkich twoich bibliotek...

    jeżeli masz te biblioteki w katalogu projektu dodaje je przez #include"..."
  • #3 7288451
    pszewczyk
    Poziom 10  
    Program Ci się wysypał bo być może nie wskazałeś kompilatorowi "miejsca pobytu" specjalnych bibliotek dla stosu BitCloud. W moim poście chodzi mi właśnie o ten aspekt załączania bibliotek. Teoretycznie mam makefile, w którym to są podane ścieżki do plików nagłówkowych... Ale po pierwsze ten w/w makefile zapożyczyłem z innego (gotowego) projektu - lowpower i nie wiem czy dobrze działa przy moim projekcie. A po drugie chciałbym napisać ten program bez makefile, wskazujac kompilatorowi (poprzez odpowiednie ustawienia konfiguracyjne dla projektu w AVR studio) miejsce bibliotek. JAk to zrobić?
  • #4 7288871
    piti___
    Poziom 23  
    Nie ma możliwości kompilacji stosu BitCloud bez makefilea. W makefile includiwane są pliki konfiguracyjne oraz w zależności od define'ow kompilowany jest stos na różne płyty (RAVEN AVR, meshbean itp).

    Z błędów wynika że nie zdefiniowano "appUsartDescriptor" więć plik usart.h nie jest dołączony.

    Czy oryginalny lowpower kompiluje się ? W poniedziałek w pracy postaram się sprawdzić co jest nie tak.

    Czy usuwająć includowanie usart.h (nie powinno być uart.h?) oraz deklaracje appusartdescriptor i wszystkie odwołania do niego program się kompiluje ?


    Pozdrawiam
    Piotrek
  • #5 7290646
    pszewczyk
    Poziom 10  
    Witaj piti___,

    No właśnie też tak pomyślałem odnośnie błędów kompilatora. Spróbowałem wykomentować kod odpowiadający za appDescriptor i nadal są błędy. Okazuje się, że błędy generuje również deklaracja Timera, mianowicie:

    
    static HAL_AppTimer_t SensorTimer {
    .interval = 30000,
    .mode = TIMER_REPEAT_MODE, 
    .callback = SensorTimerFired,
    };
    


    Ta deklaracja detrminuje taką odpowiedź kompilatora:

    Cytat:

    src/lowpower.c:95: error: expected '=', ',', ';', 'asm' or '__attribute__' before '.' token


    Wynika z tego, że kompilator nie widzi bibliotek appTimer.h i usart.h. Co prawda w kodzie klejonym przeze mnie wcześniej zapomniałem umieścić biblioteki appTimer.h, ale już naprawiłem ten błąd a i tak to nic nie zmieniło. Najlepsze jest to, że w projekcie lowpower wykorzystane są i Timery i Usart i tam wszystko jest ok. Dlatego nie bardzo rozumiem te błędy kompilatora.
  • #6 7295108
    pszewczyk
    Poziom 10  
    Ok, już doszedłem w czym był problem. Problemem była składnia, a mianowicie jeden znak "=". Prawidłowa składnia to:

    
    HAL_AppTimer_t SensorTimer = {
    .interval = 1000,
    .mode = TIMER_REPEAT_MODE, 
    .callback = SensorTimerFired,
    };
    


    Wszystko się teraz kompiluje ale mam nowy problem. Otóż nie działa mi UART. Siedza nad tym już długo i nie mam pojęcia co tu jest nie tak. Mam konwerter USB - UART firmy FTDI (FTDI 232RL). Jestem pewny, że konwerter działa. Połączyłem piny TX i RX od UART i na terminalu odbieram to co wysyłam. Nie mam pojęcia co może być problemem. Oto mój kod dot. UART:

    
    static HAL_UsartDescriptor_t appUsartDescriptor = {
    .tty = USART_CHANNEL_1, 
    .mode = USART_MODE_ASYNC,
    .baudrate = USART_BAUDRATE_38400,
    .dataLength = USART_DATA8,
    .parity = USART_PARITY_NONE,
    .stopbits = USART_STOPBIT_1,
    .edge = USART_EDGE_MODE_RISING,
    //.syncMode = USART_CLK_MODE_MASTER,
    .rxBuffer        = NULL,
    .rxBufferLength  = 0,
    .txBuffer = usartTxBuffer, 						// use callback mode
    .txBufferLength  = 8,
    .rxCallback      = NULL,
    .txCallback      = NULL,
    .flowControl     = USART_FLOW_CONTROL_NONE,
    };
    
    
    void SensorTimerFired(void)
    {
       appState = APP_I2C_TASK;	
    	
       HAL_OpenUsart(&appUsartDescriptor);	
       HAL_WriteUsart(&appUsartDescriptor, (uint8_t*)send, 8);
       HAL_CloseUsart(&appUsartDescriptor);
       
       SYS_PostTask(APL_TASK_ID);
    }
    
    


    Funkcje OpenUsart, WiteUsart i CloseUsart wywoływane są w funkcji obsługi przerwania od Timera i one na pewno są wywoływane. Niestety funkcja WriteUsart zwraca wartość 1, co zgodnie z dokumentacją oznacza błąd descriptora. Gdzie jest ten błąd? Dodam, że schemat połączenia FTDI do Meshneticsa mam z dokumentacji Meshneticsa, czyli piny Tx - Tx i Rx - Rx(takiego połączenia wymaga stos). Gdzie tu błąd?
REKLAMA