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

[PIC] Jak poprawnie przypisać wartości między tablicami w PIC?

_Robak_ 09 Gru 2007 20:27 1104 5
REKLAMA
  • #1 4570531
    _Robak_
    Poziom 33  
    Posty: 2208
    Pomógł: 231
    Ocena: 29
    Mam dosc dziwny problem, mam dwie tablice i chce z jednej przypisac wartosci do drugiej

    deklaracja tablic:
    
    volatile long  polozenie[25];
    volatile long  polozenie_zerowe[25]={
                                       0x5240,0x5500,0x5500,0x5240,0x5500,0x5500
                                      ,0x54A0,0x5C00,0x5600,0x2D00,0x6800,0x4A00
                                      ,0x5300,0x6800,0x4A00,0x5500,0x6800,0x4A00
                                      ,0x5400,0x5600,0x5D00,0x5D00};
    


    Przypisywanie:
    
    for (i=1;i<23;i++)
       {
          wyslij(polozenie[i]);
          polozenie[i]=polozenie_zerowe[i-1];    
          wyslij(polozenie[i]);
          wyslij(polozenie_zerowe[i-1]);
          wyslij(i);
          bputc('G');
       }
    

    Funkcja wyslij, jest to moja funkcja, do wysylania liczb 16 bitowych, dziala dobrze, tutaj jest w celach debugujacych:) Niestety tablica 'polozenie' nie chce sie wypelnic wartosciami z drugiej tablicy, mozna ja natomiast bez problemu zapelnic jakas wartoscia np. 0x12CD. Tablica po "podstawieniu" ma dokladnie takie same wartosci jak przed, sprawdzilem wczesniej jak nie byla wyzerowana. Ma ktos moze pomysl co moze byc nie tak?

    Edit:
    dosc dziwne jest to ze u mnie przy i=3 wpisywal wartosc, na razie problem ominalem podstawiajac wartosc najpierw do zmiennej i dziala. Ale na prawde jestem ciekaw czemu w takiej forimie nie dziala:)
  • REKLAMA
  • #2 4571163
    AVATAR_PL
    Poziom 14  
    Posty: 178
    Pomógł: 4
    Ocena: 14
    Witam!
    Tak na pierwszy rzut oka:
    Tablica "polozenie_zerowe" ma rozmiar 25 a ty zapisujesz do niej tylko 22 elementy (brakuje 3 elementów). Teraz wszystko rozbija się o to jak, twój kompilator traktuje taką nie do końca wypełnioną tablicę.
    Wstaw w brakujące elementy wartości np. 0 i sprawdź jak wtedy zachowa się program.
  • REKLAMA
  • #3 4571292
    _Robak_
    Poziom 33  
    Posty: 2208
    Pomógł: 231
    Ocena: 29
    Tablica juz byla zerowana, jedynkowana i nic nie pomoglo. Zmienialem z volatile na static i tez nic. W symulatorze MPlab rowniez nie chce sie przypisywac, wiec gdzies jest jakis haczyk, tylko pytanie gdzie. Dodam jeszcze, ze kompilator to CCS, a procek to 18F4680.

    Wlasnie sprawdzilem, jezeli jest tylko to przypisywanie w programie to jest wszystko ok, w polaczeniu z reszta programu sie sypie:/ Wkleje kod, choc nie sadze ze bedzie sie komus chcialo sprawdzac;)

    
    #include "E:\Robotyka\Projekty\[PIC]\PICC\wizard\wizek.h"
    
    // ++++++ wysylanie +++++++++++
    #define T_BUFFER_SIZE 64
    byte t_buffer[T_BUFFER_SIZE];
    byte t_next_in = 0;
    byte t_next_out = 0;
    
    volatile unsigned long  polozenie[25];  
    volatile unsigned long  polozenie_zerowe[25]={
                                       0x5240,0x5500,0x5500,0x5240,0x5500,0x5500
                                      ,0x54A0,0x5C00,0x5600,0x2D00,0x6800,0x4A00
                                      ,0x5300,0x6800,0x4A00,0x5500,0x6800,0x4A00
                                      ,0x5400,0x5600,0x5D00,0x5D00};
    
    char                    answer=0,value_8;
    long                    timeout,tmp;
    int32                   i=0,value_32;
    
    #int_tbe
    void t_serial_isr() {
       putc(t_buffer[t_next_out]);
       t_next_out=(t_next_out+1) % T_BUFFER_SIZE;
       if(t_next_in==t_next_out)
         disable_interrupts(int_tbe);
    }
    
    void bputc(char c) {
       short restart;
       int ni;
    
       restart=t_next_in==t_next_out;
       t_buffer[t_next_in]=c;
       ni=(t_next_in+1) % T_BUFFER_SIZE;
       while(ni==t_next_out);
       t_next_in=ni;
       if(restart)
         enable_interrupts(int_tbe);
    }
    
    // ++++++ odbieranie +++++++++++
    #define BUFFER_SIZE 32
    BYTE buffer[BUFFER_SIZE];
    BYTE next_in = 0;
    BYTE next_out = 0;
    
    #int_rda
    void r_serial_isr() {
       int t;
    
       buffer[next_in]=getc();
       t=next_in;
       next_in=(next_in+1) % BUFFER_SIZE;
       if(next_in==next_out)
         next_in=t;           // Buffer full !!
    }
    
    #define bkbhit (next_in!=next_out)
    
    BYTE bgetc() {
       BYTE c;
    
       while(!bkbhit) ;
       c=buffer[next_out];
       next_out=(next_out+1) % BUFFER_SIZE;
       return(c);
    }
    
    // dekoder koncowek nog
    short leg(char ktora)
    {
       output_d(ktora);
       return input(pin_A1);
    }
    
    
    // wysylanie liczb 16 bit
    void wyslij(unsigned  long dana)
    {
       bputc((byte)(dana>>8));
       bputc((byte)(dana));
    }
    // zamiana stopni na liczbe 16bit
    unsigned long zamien(long dana, char ktore)    
    {
     	return polozenie_zerowe[ktore]+(dana-90)*167;
    }
    
    
    void main(void)
    {
    
       setup_adc_ports(AN0|VREF_VREF);
       setup_adc(ADC_CLOCK_INTERNAL|ADC_TAD_MUL_0);
       setup_psp(PSP_DISABLED);
       setup_spi(FALSE);
       setup_wdt(WDT_OFF);
       setup_timer_0(RTCC_INTERNAL);
       setup_timer_1(T1_DISABLED);
       setup_timer_2(T2_DIV_BY_1,110,1);
       setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
       setup_comparator(NC_NC_NC_NC);
       setup_vref(FALSE);
       setup_oscillator(False);
    
       setup_ccp1(CCP_PWM);
       set_pwm1_duty(55);
    
       enable_interrupts(global);
       enable_interrupts(int_rda);
    
       output_d(0x01);
       set_adc_channel(0);
    
       
    // Handshake
       do
       {
          bputc('H');
    
          timeout=0;
          while(!bkbhit&&(++timeout<50000))
          delay_us(10);
          if(bkbhit)
          answer=bgetc();
    
       }while(answer!='F');
    
    // wyslanie wartosci poczatkowych serw
       for (i=1;i<23;i++)
       {
          
          tmp=polozenie_zerowe[i-1];
          polozenie[i]=tmp;    
          
       }
       
       for(i=1;i<23;i++)
       {
          wyslij(polozenie[i]);  
       
       }
    
    
       setup_adc_ports(AN0|VSS_VDD);
       while(1)
       {
    /*
          value_32 = Read_ADC();
          printf("%ld \n\r", value_32);
          for(i=0;i<100;i++) delay_ms(10);
    */
      
       }
    
    
    }
    
    
    
  • REKLAMA
  • #4 4571341
    AVATAR_PL
    Poziom 14  
    Posty: 178
    Pomógł: 4
    Ocena: 14
    Tu nie chodzi o to czy tablica jest "zerowana" czy "jedynkowana", a o sposób jej inicjacji. Karzesz kompilatorowi stworzyć tablicę o rozmiarze 25 elementów a zadajesz tylko 22 elementy. Dobry kompilator powinien przynajmniej zgłosić warning, a super kompilator po prostu błąd :).
  • REKLAMA
  • #5 4571448
    _Robak_
    Poziom 33  
    Posty: 2208
    Pomógł: 231
    Ocena: 29
    Na poczatku miala 22 elementy ale potem jak probowalem znalezc blad to zmienilem na 25 i tak zostalo, w kazdym razie nie tu tkwi problem:(
  • #6 4572304
    Bigfoot
    Poziom 25  
    Posty: 982
    Pomógł: 74
    Ocena: 13
    AVATAR_PL napisał:
    Dobry kompilator powinien przynajmniej zgłosić warning, a super kompilator po prostu błąd :).


    Nieprawda. Jezeli nie chcesz w ogole nie musisz inicjowac tablicy zadnymi wartosciami, mozesz zainicjowac tez tylko kilka pierwszych. Kompilator nie powinien zglaszac ani warninga ani tym bardziej errora!

    BF
REKLAMA