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.

Rejestr I/O w AVR jako parametr funkcji w C...

autoservice 21 Lis 2007 22:39 1485 4
  • #1 21 Lis 2007 22:39
    autoservice
    Poziom 20  

    Witam
    Mam sobię funkcję:

    unsigned char ustaw_char(unsigned char data){
    ...
    return data;
    };

    , w której mam pętlę i zmieniam wartość data. Wartość ta jest zwracana dopiero na końcu, już po ustawieniu.
    W samej funkcj w pętli nie mam możliwości podejżenia aktualnej wartości (oczywiście mógłbym wysłać z każdą zmianą parametr data na lcd).
    I teraz pytanie czy nie umieszczając nigdzie w pętli (funkcji) rozkazu przypisania typu rejestrI/O = dana mogę w parametrze funkcji podać aby dana, która mi się zmienia wewnątrz funkcji została odrazu wpisana do rejestru I/O ?
    Funkcja nawet nie musi nic zwracać. Ważne abym mógł określić uniwersalnie, jako porametr funkcji... jaka dana ma się zmieniać , czy ma to być rejestr I/O czy może jakaś inna dana w pamięci SRAM ale już w momencie wywoływania funkcji.
    Oczywiście mogę umieścić wewnątrz funkcji rozkaz przypisania data do rejestru I/O ale właśnie dążę do tego aby ta funkcja była uniwersalna.
    Chciałem utworzyć wskaźnik do tego rejestru ale wyskakuje bład kompilatora, ze wskaznik nie moze sie odnosic do obszaru pamieci rejestrow I/O.
    Dzięki.
    Pzdr.

    0 4
  • #2 21 Lis 2007 23:52
    zumek
    Poziom 39  

    Nie bardzo mogę ... zajarzyć o co Ci chodzi , ale może o to :?:

    Code:

    #include <avr/io.h>

    char zmien(char *x)
    {
    (*x)++;
    return *x;
    }

    int main(void)
    {
    char z=1,v;
    PORTA=10;

    v=zmien((char*)&z); //v=2,z=2
    v=zmien((char*)&PORTA); //v=11,PORTA=11;
    asm("ldi r16,5");
    asm("mov r5,r16");
    v=zmien((char*)5);//v=6,R5=6

    while(1);
    return(0);
    }


    Piotrek

    0
  • #3 22 Lis 2007 05:49
    piotrkopec
    Poziom 17  

    Rejestry są dostępne pod adresami rejestrów jak i w przestrzeni adresowej pamięci( dostępnej np. po wskaźniku) z przesunięciem +0x20( 'Register Summary' prawie pod koniec data sheet, podane w nawiasach).
    Napisz jaki procek Cię interesuje to skryptem zrobię nagłówek( definicje rejestrów z przyroskiem np. _MEM) i po załączeniu będziesz mógł odwoływać się np. do rejestru PORTB po '(volatile unsigned char *) PORTB_MEM. Albo przetworze nagłówki wszystkich procesorów i wrzucę je tutaj. Zaproponuj przyrostek który mam dodać do definicji rejestrów( _MEM?).
    Pzdr

    0
  • #4 22 Lis 2007 15:15
    autoservice
    Poziom 20  

    witam
    wlasnie sie zoorientowalem ze te rejestry to tez przeciez pamiec SRAM i z przesunieciem 0x20 mamy do niej dostep jak do zwyklej komorki... zadeklarowalem zmienna jako wskaznik do niej i teraz juz moge podawac te zmienna w parametrze funkcji i zmienia mi w petli na bierzaco...problem rozwiazany :)
    Pzdr.

    0
  • #5 22 Lis 2007 18:44
    piotrkopec
    Poziom 17  

    Fajno
    Aby uniknąć dziwnych błędów, wskaźniki do rejestrów( albo po prostu wszystkie wskażniki już w deklaracji funkcji) oznacz jako 'volatile'. Kompilator będzie je czytał przy każdym odwołaniu( zawartość zmienia się niezależnie od niego).
    I chyba można kliknąć kłódeczkę
    Owocnego ;)
    kac

    0