eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronika › CVAVR - jak nie inicjalizować wartości zmiennej
Ilość wypowiedzi w tym wątku: 20

  • 1. Data: 2009-01-27 11:17:05
    Temat: CVAVR - jak nie inicjalizować wartości zmiennej
    Od: EM <e...@p...onet.pl>

    Witam
    Nie jestem biegły w programowaniu i mam taki problem odnośnie AVRka
    programowanego za pomocą CodeVision AVR.

    Otóż potrzebuję na początku programu sprawdzić wartość 2 komórek pamięci
    RAM. Zakładam, że komórki te mają wartość taka jak poprzednio, jeśli
    napięcie zasilania nie spadło poniżej pewnego poziomu. Podobnie robię w
    PICach i to się dobrze sprawdza.


    Umiem zmusić program do umieszczenia danych w konkretnym obszarze, robi
    się dodając adres po nazwie zmiennej, np.
    char data @0x60;
    jednak z tego co widzę, to nawet pomimo wyłączonej opcji: clear global
    variables at program startup w konfiguracji projektu - wygląda na to, że
    te zmienne są zerowane.


    To co mi przychodzi na myśl, to użyć jakiejś wstawki assemblerowej,
    gdzie będę kopiował wartość z komórki RAM o konkretnym adresie do
    jakiejś zmiennej w C.
    Potrzebuję tak przekopiować dwie komórki, które mają nie być zerowane
    przy inicjalizacji.

    Proszę o pomoc
    --
    Pozdrawiam
    EM


  • 2. Data: 2009-01-27 11:29:32
    Temat: Re: CVAVR - jak nie inicjalizować wartości zmiennej
    Od: PawelM <p...@o...pl>

    ...zainstaluj AVR Studio4, CV generuje plik COF dzieki temu przejrzysz
    dokłądnie asemblera krok po kroku...
    Pzdr.


  • 3. Data: 2009-01-27 11:35:21
    Temat: Re: CVAVR - jak nie inicjalizować wartości zmiennej
    Od: EM <e...@p...onet.pl>

    ;GLOBAL VARIABLES INITIALIZATION
    LDI R30,LOW(__GLOBAL_INI_TBL*2)
    LDI R31,HIGH(__GLOBAL_INI_TBL*2)
    __GLOBAL_INI_NEXT:
    LPM R24,Z+
    LPM R25,Z+
    SBIW R24,0
    BREQ __GLOBAL_INI_END
    LPM R26,Z+
    LPM R27,Z+
    LPM R0,Z+
    LPM R1,Z+
    MOVW R22,R30
    MOVW R30,R0
    __GLOBAL_INI_LOOP:
    LPM R0,Z+
    ST X+,R0
    SBIW R24,1
    BRNE __GLOBAL_INI_LOOP
    MOVW R30,R22
    RJMP __GLOBAL_INI_NEXT
    __GLOBAL_INI_END:


  • 4. Data: 2009-01-27 11:38:07
    Temat: Re: CVAVR - jak nie inicjalizować wartości zmiennej
    Od: EM <e...@p...onet.pl>

    PawelM pisze:
    > ...zainstaluj AVR Studio4, CV generuje plik COF dzieki temu przejrzysz
    > dokłądnie asemblera krok po kroku...

    Ogólnie z podejrzeniem ASM nie ma problemu


    Występuje taka sekcja:

    ;GLOBAL VARIABLES INITIALIZATION
    LDI R30,LOW(__GLOBAL_INI_TBL*2)
    LDI R31,HIGH(__GLOBAL_INI_TBL*2)
    __GLOBAL_INI_NEXT:
    LPM R24,Z+
    LPM R25,Z+
    SBIW R24,0
    BREQ __GLOBAL_INI_END
    LPM R26,Z+
    LPM R27,Z+
    LPM R0,Z+
    LPM R1,Z+
    MOVW R22,R30
    MOVW R30,R0
    __GLOBAL_INI_LOOP:
    LPM R0,Z+
    ST X+,R0
    SBIW R24,1
    BRNE __GLOBAL_INI_LOOP
    MOVW R30,R22
    RJMP __GLOBAL_INI_NEXT
    __GLOBAL_INI_END:

    ale przecież ja nie chcę tego ręcznie usuwać.

    Chcę by wszystko było w pliku C, bez kombinacji.
    --
    Pozdr
    EM


  • 5. Data: 2009-01-27 13:54:24
    Temat: Re: CVAVR - jak nie inicjalizować wartości zmiennej
    Od: Piotrne <p...@p...onet.pl>

    EM pisze:

    > To co mi przychodzi na myśl, to użyć jakiejś wstawki assemblerowej,

    A takie coś:

    char data;
    data = *(char*)0x60;

    nie działa?

    P.


  • 6. Data: 2009-01-27 14:59:54
    Temat: Re: CVAVR - jak nie inicjalizować wartości zmiennej
    Od: "T.M.F." <t...@n...mp.pl>

    > Otóż potrzebuję na początku programu sprawdzić wartość 2 komórek pamięci
    > RAM. Zakładam, że komórki te mają wartość taka jak poprzednio, jeśli
    > napięcie zasilania nie spadło poniżej pewnego poziomu. Podobnie robię w
    > PICach i to się dobrze sprawdza.

    Do tego sluza bity stanu procesora, ktore wskazuja na przyczyne resetu.
    Zobacz rejestr MCU, bity WDRF, BORF, EXTRF i PORF.
    Metoda o ktorej piszesz nic nie da, bo zawartosc pamieci RAM dosyc dlugo
    pozostaje nieuszkodzona. Co wiecej, jesli w pamieci stale jest ta sama
    wartosc to jest spora szansa, ze po wlaczeniu zasilania ta wartosc
    ciagle tam bedzie. Ot taki ciekawy efekt pamieciowy.


  • 7. Data: 2009-01-27 15:35:49
    Temat: Re: CVAVR - jak nie inicjalizować wartości zmiennej
    Od: EM <e...@p...onet.pl>

    T.M.F. pisze:
    >> Otóż potrzebuję na początku programu sprawdzić wartość 2 komórek
    >> pamięci RAM. Zakładam, że komórki te mają wartość taka jak poprzednio,
    >> jeśli napięcie zasilania nie spadło poniżej pewnego poziomu. Podobnie
    >> robię w PICach i to się dobrze sprawdza.
    >
    > Do tego sluza bity stanu procesora, ktore wskazuja na przyczyne resetu.
    > Zobacz rejestr MCU, bity WDRF, BORF, EXTRF i PORF.
    > Metoda o ktorej piszesz nic nie da, bo zawartosc pamieci RAM dosyc dlugo
    > pozostaje nieuszkodzona. Co wiecej, jesli w pamieci stale jest ta sama
    > wartosc to jest spora szansa, ze po wlaczeniu zasilania ta wartosc
    > ciagle tam bedzie. Ot taki ciekawy efekt pamieciowy.
    >
    Tak na prawdę to potrzebuję rozróżnić, czy przerwa w zasilaniu była
    dłuższa niż np. 1-2 sekundy, czy nie.
    Zakładam, że jeśli zapiszę w jednej komórce jakąś wartość i w innej jej
    negację, to odczyt tych dwóch komórek pozwoli stwierdzić, że jeżeli
    wpisy są komplementarne, to prawdopodobnie przerwa w zasilaniu była
    krótka - czytaj zasilanie nie spadło do jakiegoś granicznego progu.

    Jeśli uda mi się w końcu czytać te komórki bez inicjalizacji to sprawdzę
    jak się zachowują AVRki pod tym względem.
    Popróbuję z tym wskaźnikiem.

    Jak wspominałem podobny mechanizm mam na PICu i działa bez problemów.

    Co do hardware nie mam niczego, co mógłbym wykorzystać - to jest w
    istniejącym układzie. Istnieje tam kondensator podtrzymujący zasilanie -
    może to być 10u, nie sprawdzałem dokładnie i to jest wszystko.
    --
    Pozdr
    EM


  • 8. Data: 2009-01-27 19:57:17
    Temat: Re: CVAVR - jak nie inicjalizować wartości zmiennej
    Od: EM <e...@p...onet.pl>

    Piotrne pisze:
    > EM pisze:
    >
    >> To co mi przychodzi na myśl, to użyć jakiejś wstawki assemblerowej,
    >
    > A takie coś:
    >
    > char data;
    > data = *(char*)0x60;
    >
    > nie działa?
    >
    Witam
    Dzięki

    Rozumiem, że ten kawałek odczytuje z komórki o adresie 0x60

    A jak zapisać do takiej komórki, nie inicjalizując jej jakoś?
    --
    Pozdrawiam
    EM


  • 9. Data: 2009-01-27 21:02:30
    Temat: Re: CVAVR - jak nie inicjalizować wartości zmiennej
    Od: Piotrne <p...@p...onet.pl>

    EM pisze:

    > A jak zapisać do takiej komórki, nie inicjalizując jej jakoś?

    Jeśli tamto działa, to tak:
    char data;
    data = 123;
    *(char*)0x60 = data;

    Pozdrawiam
    P.


  • 10. Data: 2009-01-27 22:00:33
    Temat: Re: CVAVR - jak nie inicjalizować wartości zmiennej
    Od: "T.M.F." <t...@n...mp.pl>

    >> To co mi przychodzi na myśl, to użyć jakiejś wstawki assemblerowej,
    >
    > A takie coś:
    >
    > char data;
    > data = *(char*)0x60;
    >
    > nie działa?

    ALe to tylko odczyta komorke o adresie 0x60, ale nie spowoduje, ze
    zostanie ona zarezerwowana. W efekcie kompilator umiesci tam pierwsza
    lepsza zmienna i nic z tego nie wyniknie.
    W AVR-gcc wystarczy stworzyc globalna zmienna niestatyczna, kompilator
    nie inicjalizuje takich zmiennych.

strony : [ 1 ] . 2


Szukaj w grupach

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: