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

[ATmega128][C][AVRStudio] Zmienne kilka c plików w projekcie

lebe 06 Wrz 2009 21:06 1638 3
  • #1 6988482
    lebe
    Poziom 10  
    Próbuje zaprogramować regulator PID i mam problem ze zmiennymi. Używam AVR Studio, mam 3 c pliki w 1. mam zadeklarowane funkcje regulatora i main() w 2. Menu a w 3. jest obsługa LCD. Problem polega na tym, że będąc w Menu wprowadzam nastawy regulatora, ale po wyjściu z funkcji menu w main nastawy nie zostają zapamiętane. W dużym uproszczeniu mój program wygląda tak:
    main.c
    
    #include "menu.h"
    #include "lcd.h"
    ...
    
    signed short K_P=0, K_I=0, K_D=0;
    
    int main(void)
    {
    ...
    menu(K_P,K_I,K_D);
    
    wyswietlLCD(K_P);
    wyswietlLCD(K_I);
    wyswietlLCD(K_D);
    
    while(1)
    }
    


    menu.c
    
    void Menu_Nastawy(unsigned short int K)
    {//funkcja ustawiająca nastawy regulatora}
    
    void menu(signed short wspl_KP, signed short wspl_KI, 
    			signed short wspl_KD)
    {
    ...
    Menu_Nastawy(wspl_KP);
    wyswietlLCD(K_P);
    
    Menu_Nastawy(wspl_KI);
    wyswietlLCD(K_I);
    
    Menu_Nastawy(wspl_KD);
    wyswietlLCD(K_D);
    ...
    czekaj_na_enter();
    }
    


    Będąc w funkcji menu() nastawy wyświetlają się prawidłowo i można je normalnie zmieniać przy użyciu klawiatury. W czym może tkwić problem?
  • #3 6989413
    lebe
    Poziom 10  
    Co prawda extern nie pomogło, ale przypomniało mi się o wskaźnikach :). Ten kod już działa.
    
    #include "menu.h"
    #include "lcd.h"
    ...
    
    signed short K_P=0, K_I=0, K_D=0;
    
    int main(void)
    {
    ...
    menu(&K_P,&K_I,&K_D);
    
    wyswietlLCD(K_P);
    wyswietlLCD(K_I);
    wyswietlLCD(K_D);
    
    while(1)
    } 


    
    void Menu_Nastawy(unsigned short int *K)
    {//funkcja ustawiająca nastawy regulatora}
    
    void menu(signed short *wspl_KP, signed short *wspl_KI,
             signed short *wspl_KD)
    {
    ...
    Menu_Nastawy(wspl_KP);
    wyswietlLCD(K_P);
    
    Menu_Nastawy(wspl_KI);
    wyswietlLCD(K_I);
    
    Menu_Nastawy(wspl_KD);
    wyswietlLCD(K_D);
    ...
    czekaj_na_enter();
    } 
  • #4 6989420
    kwesoly
    Poziom 15  
    Problemem nie były akurat jednostki kompilacji ale po prostu przekazywanie przez wartość - twoja funkcja zmieniała lokalne kopie, a nie zmienne globalne. Jeśli zamierzasz mieć więcej regulatorów to rozwiązanie jest z wskaźnikami jest w porządku, jeśli masz tylko jeden, prościej będzie w 1 pliku zdefiniować zmienne
    signed short K_P=0, K_I=0, K_D=0; 


    a w pozostałych tylko poinformować kompilator że są one dostępne w innych plikach:
    extern signed short K_P, K_I, K_D; 
REKLAMA