| Author |
Message
|
xury Poziom 22

Joined: 08 Mar 2004 Posts: 1640 Location: Radom
|
#1
19 Nov 2009 21:29 [BASCOM] Zmienne w EEPROM typu Overlay |
|
|
|
Czy można używać zmiennych typu Overlay w EEPROM ?
Chcę zrobić mniej więcej coś takiego:
| Code: |
$eeprom
Adres0:
Data 0
Smsc:
Data "48790998250"
$data
|
a potem na ten obszar nałożyć zmienną
| Code: |
| Dim Smsc As Eram String * 11 at $1 Overlay |
I odczytywać w programie jak zmienną zamiast używania ReadEeeprom ?
Teoretycznie powinno to działać. Po prostu nie chcę używać ReadEeprom bo mi komplikuje dalszy kod, a nie chcę też wstawiać zmiennych bezpośrednio w EEPROM , bo wtedy po każdym resecie uC będzie zapisywał tę pamięć.
Potrzebne mi to jest do tego, bo będę budował zmienną PDU z kilku innych zmiennych zapisanych w EEPROM.
|
|
| Back to top |
|
 |
Google

|
#
19 Nov 2009 21:29 |
|
|
|
|
|
| Back to top |
|
 |
mirekk36 Poziom 25

Joined: 17 Jun 2006 Posts: 8153 Location: Szczecin
|
#2
19 Nov 2009 22:30 Re: [BASCOM] Zmienne w EEPROM typu Overlay |
|
|
|
| xury wrote: |
.... a nie chcę też wstawiać zmiennych bezpośrednio w EEPROM , bo wtedy po każdym resecie uC będzie zapisywał tę pamięć.
|
uC sam nic nie będzie zapisywał w EEPROM'ie o ile sam mu tego nie nakażesz. Może coś źle zrozumiałeś czytając helpa czy jak?
Bardzo łatwo jest zdefiniować zmienne właśnie z dodatkiem "As Eram" i po zawodach.
To czy do zmiennej będzie coś zapisywane czy nie zależy tylko od ciebie.
Ja zwykle robię sobie zmienną w pamięci EEPROM i w RAM. Przy starcie procka odczytuję zmienną z EEPROM i wczytuję do RAM - później się wygodnie posługuję tylko tą zmienną w RAM. Jednak gdy zachodzi potrzeba zmiany zmiennej w RAM - to jednocześnie zmieniam ją w EEPROM - aby po ponownym restarcie zawsze była aktualna wartość, np:
| Code: |
Dim eeprom_zmienna As Eram Byte
Dim zmienna As Byte |
Gdzieś przed pętlą główną - o ile to jest konieczne:
| Code: |
| zmienna = eeprom_zmienna |
i dalej jak pisałem wyżej działam sobie na zmiennej w RAM'ie, A gdy muszę zmienić jej wartość to przy okazji robię:
| Code: |
| eeprom_zmienna = zmienna |
Tzn tak robiłem gdy pisałem w Bascomie ;)
|
|
| Back to top |
|
 |
xury Poziom 22

Joined: 08 Mar 2004 Posts: 1640 Location: Radom
|
#3
19 Nov 2009 23:07 Re: [BASCOM] Zmienne w EEPROM typu Overlay |
|
|
|
Jak zwykle można na Ciebie liczyć mirekk36
Zmienne w EEPROM są mi potrzebne z dwóch powodów: aby zaoszczędzić RAM i aby w późniejszym czasie napisać sobie program dla Windows, który dałby mi możliwość edycji samego EEPROM.
W eeprom chcę zapisać numery telefonów i fragmenty ciągu SMS w PDU. Następnie w zależności od sytuacji chcę składać z tych zmiennych jedną zmienną w RAM - czyli cały ciąg PDU do wysłania do telefonu.
Jednak jest problem:
Poniższa konstrukcja nie chce działać dla zmiennych tekstowych w EEPROM :
PDU = segment1 + segment2
PDU to zmienna tekstowa w RAM.
Dla zwykłych zmiennych w ram działa wyśmienicie, ale nie mam już wolnej pamięci by trzymać te wszystkie zmienne w RAMie. (Atmega8)
Nie wiem czy to ograniczenia BASCOM czy specyfiki odczytu z EEPROM.
Chyba czas na przejście na C.
dodane
| mirekk36 wrote: |
| xury wrote: |
.... a nie chcę też wstawiać zmiennych bezpośrednio w EEPROM , bo wtedy po każdym resecie uC będzie zapisywał tę pamięć.
|
uC sam nic nie będzie zapisywał w EEPROM'ie o ile sam mu tego nie nakażesz. Może coś źle zrozumiałeś czytając helpa czy jak?
Bardzo łatwo jest zdefiniować zmienne właśnie z dodatkiem "As Eram" i po zawodach.
To czy do zmiennej będzie coś zapisywane czy nie zależy tylko od ciebie.
|
No właśnie jeśli w programie przed pętlą główną nadam wartości zmiennym w eeprom
np.
zm_eeprom = "jakis tekst"
to po resecie program wystartuje od nowa i zapisze z powrotem wartości początkowe w programie do eeprom ?
|
|
| Back to top |
|
 |
Google

|
#
19 Nov 2009 23:07 |
|
|
|
|
|
| Back to top |
|
 |
arnoldziq Poziom 22

Joined: 14 Apr 2006 Posts: 2433 Location: High Wycombe
|
#4
20 Nov 2009 10:58 Re: [BASCOM] Zmienne w EEPROM typu Overlay |
|
|
|
| xury wrote: |
No właśnie jeśli w programie przed pętlą główną nadam wartości zmiennym w eeprom
np.
zm_eeprom = "jakis tekst"
to po resecie program wystartuje od nowa i zapisze z powrotem wartości początkowe w programie do eeprom ? |
W takim przypadku, po każdym resecie zmienna będzie nadpisywać nową ( taką samą ) zawartością.
Jeżeli przewidujesz 1 reset co kilka dni, to nie problem, ale częstsze resety mogą spowodować wyczerpanie cyklów zapisu EEPROM.
Można łatwo to obejść : przed każdym zapisem zm_eeprom, sprawdź, czy zawartość już się tam nie znajduje i czy nie jest to ta sama, oczekiwana zawartość.
|
|
| Back to top |
|
 |
mirekk36 Poziom 25

Joined: 17 Jun 2006 Posts: 8153 Location: Szczecin
|
#5
21 Nov 2009 00:16 Re: [BASCOM] Zmienne w EEPROM typu Overlay |
|
|
|
| xury wrote: |
No właśnie jeśli w programie przed pętlą główną nadam wartości zmiennym w eeprom
np.
zm_eeprom = "jakis tekst"
to po resecie program wystartuje od nowa i zapisze z powrotem wartości początkowe w programie do eeprom ? |
posłuchaj - jeśli potrzebujesz zapisać domyślnie
zm_eeprom = "jakis tekst"
to robisz to tylko wtedy jeśli wszystkie komórki tej zmiennej mają wartość 0xFF przy starcie - co oznacza, że procek był pierwszy raz zaprogramowany i EEPROM jest czysty albo gdy EEPROM został skasowany w całości.
Dzięki temu ta twoja opercja powyżej dokona się tylko raz! i po zawodach
chyba to proste łatwe i szybkie rozwiązanie ;) ?
Jeśli chodzi o twoje powyższe problemy z brakiem ilości pamięci RAM na zmienne tekstowe - no to już tu ci nie pomogę ;) bo, albo:
1. coś za dużo tych zmiennych tworzysz i to normalne że w tak małym procku szybko kończy się RAM - więc trzeba by było dać większy procek z dużo większą ilością RAM jak dla ciebie
2. albo coś bardzo źle przemyślałeś działanie całości , że aż tyle zmiennych tekstowych tworzysz. O ile jeszcze zrozumiałbym potrzebę jakiegoś większego bufora na nadchodzący SMS - to po jakiego grzybka ty chcesz to zapisywać w pamięci EEPROM - toż to czysta strata zasobów i cieżko mi wymyśleć na jaką okazję zapisywać w EEPROMie nadlatujące fragmenty SMSów - może musisz od nowa przemyśleć działanie całego programu i wtedy okaże się, że spokojnie wystarczy ci ATmega8
pozdr
|
|
| Back to top |
|
 |
Google

|
#
21 Nov 2009 00:16 |
|
|
|
|
|
| Back to top |
|
 |
xury Poziom 22

Joined: 08 Mar 2004 Posts: 1640 Location: Radom
|
#6
21 Nov 2009 18:09 Re: [BASCOM] Zmienne w EEPROM typu Overlay |
|
|
|
Ja nie chcę zapisywać w eeprom nadlatujących SMSów tylko fragmenty ramki PDU. które będę wysyłał. A chcę je tam zapisać by mieć możliwość szybkiej zmiany, kiedy sobie napiszę program do zmiany zawartości eeprom. Staram się napisać program tak elastycznie, by zmiana danych w eeprom, była przez program w uC "do przełknięcia, Czyli jeśli nawet zmienię długość danej w eeprom program odczyta tą daną poprawnie.
W czasie normalnego działania programu nic nie będzie zapisywane do eeprom, tylko odczyt. Czyli te dane w eeprom pracują głownie jako stałe.
Po cżęści (na razie tylko w moim umyśle) rozwiązałem ten problem.
Nie zastosuję zmiennych tylko linie data w eeprom, a program podczas inicjalizacji sprawdzi długośc ciągów w eeprom i zapisze je do zmiennych w RAM. Następnie kiedy zajdzie potrzeba odczytu zawartości i wysłania całej ramki PDU to będę próbował wysłać je przez UART bajt po bajcie.
Program będzie odczytywał, fragmenty PDU i składał wszystko w zmiennej w RAM. Zastosuję funkcję z przekazywaniem parametrów do niej.
Po krótce opiszę jak to będzie działać:
Po wywołaniu alarmu z centrali alarmowej, ATmega8 (oczywiście przez podłączony telefon)będzie dzwonić na numer zapisany w eeprom, a następnie wysyłać SMS na ten numer. Opcjonalnie też wyśle SMS na inny numer.
Ponadto będzie odbierać SMSy i na podstawie ich treści sterować centralą alarmową i opcjonalnie innymi urządzeniami. Po odebraniu rozkazu SMS będzie wysyłać SMS zwrotny z potwierdzeniem wykonania.
Numery telefonów i rozkazy będą mogły być zmieniane, bez konieczności zmiany w kodzie uC. Dlatego będą umieszczone w eeprom, gdzie zewnętrzny program będzie miał możliwość ich zmiany bez ingerowania w kod uC. Kod uC ma się dostosować do zmiany długości SMS i zmiany numerów telefonów, a nie odwrotnie. Odbiór i wysyłanie tylko w formacie PDU, ale już napisałem (raczej pożyczyłem kod do konwersji PDU >TXT i TXT>PDU) sobie parsowanie danych przychodzących i wychodzących.
Twoje rady jak zwykle skłaniają do myślenia kolego mirekk36.
Zostałem jednak przy Readeeprom, ale podpowiedzi się przydały i tak. Ja jak zwykle łapię po paru dniach :)
|
|
| Back to top |
|
 |