Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[PIC][C] Tablice w pamięci programu

dondu 07 Lut 2011 09:34 1975 6
  • #1 07 Lut 2011 09:34
    dondu
    Moderator Mikrokontrolery Projektowanie

    Po skompletowaniu programator PICKIT3 i środowiska HI-TECH do programowania w C zabrałem się za pierwszy program:

    Code:
    #include <htc.h>   
    

    const unsigned char bufor[10] = {0,1,2,3,4,5,6,7,8,9};

    int  main  (void){

       TRISA = 0;         //port A - wszystkie jako wyjścia

       static char licz = 0;
       while  (1){
          PORTA   = bufor[licz++];
          if(licz > 9) licz = 0;
       };

    }


    Testuję umieszczanie tablicy danych w pamięci programu.

    I tutaj pierwszy problem. Po zaglądnięciu do kodu wynikowego stwierdziłem, że tablica zapisana jest w pamięci programu, ale na każdą komórkę tablicy przypada 2 bajty:

    Code:
     Address                                               ASCII      
    

       708    0804 00FE 3007 008A 087E 0782 3400 3400 .....0.. ~....4.4
       710    3401 3402 3403 3404 3405 3406 3407 3408 .4.4.4.4 .4.4.4.4
       718    3409 1683 0185 0870 3E01 2709 1283 0085 .4....p. .>.'....


    Tablica zaczyna się od adresu 0x70F czyli ostatnia liczba 3400 w pierwszej linii.
    34 to kod rozkazu RETLW czyli zgodnie z przykładem w datasheet zwraca liczbę następującą w bajcie po 34.

    Pytanie: Czy jest jakiś inny sposób zamieszczania i odczytu tablic w pamięci programu, by nie tracić kolejnych bajtów na zapisywanie rozkazu RETLW?

    0 6
  • Pomocny post
    #2 07 Lut 2011 10:13
    94075
    Użytkownik usunął konto  
  • #3 07 Lut 2011 10:31
    dondu
    Moderator Mikrokontrolery Projektowanie

    Nie pomyślałem, że to może mieć znaczenie - z PICami dopiero zaczynam. Chodzi o PIC18F67K90 lub PIC18F87K90.

    0
  • Pomocny post
    #4 07 Lut 2011 10:37
    Zaquadnik
    Poziom 27  

    Nie wiem jak jest z PIC18, ale w PICach 16 i PICach 12 inaczej się nie da. Pobranie danych z tablicy w pamięci programu realizuje się jako skok pod określony adres, gdzie znajduje się rozkaz RETLW z odpowiednią daną.

    0
  • #5 07 Lut 2011 11:02
    dondu
    Moderator Mikrokontrolery Projektowanie

    W datasheet tej rodziny http://ww1.microchip.com/downloads/en/DeviceDoc/39957b.pdf

    w rozdziale 7 znalazłem coś takiego (jest nawet przykład w assemblerze - patrz drugi screen).

    [PIC][C] Tablice w pamięci programu [PIC][C] Tablice w pamięci programu

    Niestety nie ma tam wersji w C (jak to jest z reguły w datasheet-ach Atmelów) i nie wiem jak zainicjować takie dane w pamięci programu.

    0
  • Pomocny post
    #6 07 Lut 2011 11:36
    94075
    Użytkownik usunął konto  
  • #7 07 Lut 2011 11:40
    dondu
    Moderator Mikrokontrolery Projektowanie

    Masz rację, wszystko zależy od kompilatora.

    Już wszystko gra. Błąd polegał na tym, iż nie wybrałem prawidłowego chipa. Gdy to zrobiłem kompilator działa prawidłowo wykorzystując technikę opisaną w datasheet.

    0