-
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.